Kubernetes Operator
Декларативное управление политиками безопасности FlowLink в Kubernetes кластере.
Обзор
Kubernetes Operator FlowLink позволяет запускать FlowLink агентов как поды в Kubernetes кластере с автоматическим обнаружением сервисов, принудительным применением политик безопасности и централизованным управлением. Оператор обеспечивает runtime защиту всех workload'ов в кластере — от подов до DaemonSet'ов.
Оператор реализует два паттерна развёртывания: Sidecar (внедрение контейнера FlowLink в каждый под) и DaemonSet (один FlowLink агент на каждом узле). Выбор паттерна зависит от архитектуры вашего приложения и требований к изоляции.
Архитектура
1FlowLinkShieldPolicy (CRD) → ShieldOperator → reconciliation loop2 ↓3AdmissionWebhook (mutating + validating)4 ├── ValidatingWebhook → deny violations5 └── MutatingWebhook → inject ShieldSidecar6 ↓7 ShieldSidecar (container)8 connects to FlowLink Relay
Helm Chart
FlowLink распространяется как Helm Chart. Установите оператор одной командой, указав адрес вашего FlowLink Relay:
1# Добавить репозиторий2helm repo add flowlink https://charts.flowlink.ai34# Установить оператор5helm install flowlink flowlink/flowlink \6 --set relay.url=https://flowlink.flow-masters.ru \7 --set operator.watchNamespaces=default,production \8 --set shield.mode=enforce \9 --namespace flowlink-system --create-namespace
values.yaml
1# values.yaml — пример конфигурации2relay:3 url: "https://flowlink.flow-masters.ru"4 apiKeySecret: "flowlink-relay-api-key"56operator:7 watchNamespaces:8 - default9 - production10 logLevel: info1112shield:13 mode: enforce # monitor | enforce14 sidecarImage: "flowlink/flowlink-shield:latest"15 sidecarResources:16 requests:17 cpu: 100m18 memory: 128Mi19 limits:20 cpu: 500m21 memory: 256Mi2223webhook:24 enabled: true25 injectSelector:26 matchLabels:27 flowlink/inject: "true"2829rbac:30 create: true
CRD: FlowLinkAgent
CRD FlowLinkAgent определяет конфигурацию FlowLink агента в кластере. Каждый ресурс описывает подключение к relay, набор политик и параметры Shield защиты.
1apiVersion: flowlink.io/v1alpha12kind: FlowLinkAgent3metadata:4 name: production-agent5 namespace: default6spec:7 # Подключение к FlowLink Relay8 relayUrl: "https://flowlink.flow-masters.ru/api/v1"910 # Идентификатор агента (уникальный в пределах кластера)11 agentId: "agent-prod-01"1213 # Теги для группировки и фильтрации14 tags:15 - "production"16 - "critical"17 - "k8s"1819 # Политики безопасности20 policies:21 - name: block-destructive22 action: deny23 patterns:24 - "rm -rf *"25 - "DROP TABLE"26 - "chmod 777"27 - "kubectl delete pod"28 - name: require-approval29 action: approval30 patterns:31 - "helm uninstall"32 - "kubectl delete deploy"33 - "systemctl stop"3435 # Настройки Shield36 shield:37 enabled: true38 mode: enforce # monitor | enforce39 levels:40 - L1 # Command analysis41 - L2 # Pattern matching42 - L3 # Context awareness43 - L4 # Risk scoring44 - L5 # Policy engine45 - L6 # Compliance check46 - L7 # Forensic analysis4748 # Настройки Sandbox49 sandbox:50 enabled: true51 networkPolicy: restrict # restrict | allow52 filesystem: read-only53 allowedPaths:54 - "/app"55 - "/tmp"5657status:58 phase: Running59 connected: true60 lastHeartbeat: "2026-05-15T10:30:00Z"61 policiesLoaded: 2
CRD: FlowLinkShieldPolicy
1apiVersion: shield.flowlink.ai/v1alpha12kind: FlowLinkShieldPolicy3metadata:4 name: production-shield5 namespace: default6spec:7 mode: enforce # monitor | enforce8 enabled: true9 rules:10 - name: block-destructive11 action: deny12 patterns:13 - "rm -rf *"14 - "DROP TABLE"15 - "chmod 777"16 - name: require-approval17 action: approval18 patterns:19 - "kubectl delete"20 - "helm uninstall"21 sidecar_image: "flowlink/flowlink-shield:latest"22 relay_url: "https://flowlink.flow-masters.ru"23 watch_namespaces: ["default", "production"]
Webhook: Mutation Admission
Mutating Admission Webhook автоматически внедряет FlowLink sidecar контейнер в поды, соответствующие селектору меток. Webhook перехватывает запросы на создание подов на уровне API Server и модифицирует спецификацию перед её сохранением в etcd.
1apiVersion: admissionregistration.k8s.io/v12kind: MutatingWebhookConfiguration3metadata:4 name: flowlink-injector5 labels:6 app.kubernetes.io/name: flowlink-operator7 app.kubernetes.io/component: webhook8webhooks:9 - name: injector.flowlink.io10 rules:11 - apiGroups: [""]12 apiVersions: ["v1"]13 operations: ["CREATE"]14 resources: ["pods"]15 # Внедрять только в поды с меткой16 objectSelector:17 matchLabels:18 flowlink/inject: "true"19 # Не внедрять в поды flowlink-system namespace20 namespaceSelector:21 matchExpressions:22 - key: kubernetes.io/metadata.name23 operator: NotIn24 values: ["flowlink-system", "kube-system"]25 clientConfig:26 service:27 name: flowlink-operator-webhook28 namespace: flowlink-system29 path: "/mutate-pod"30 port: 944331 caBundle: <CA_BUNDLE>32 admissionReviewVersions: ["v1"]33 sideEffects: None34 timeoutSeconds: 535 reinvocationPolicy: Never
Чтобы включить автоинъекцию для пода, добавьте метку <code className="text-emerald-400 bg-[#0a0a0a] px-1.5 py-0.5 rounded">flowlink/inject: "true"</code> в metadata.labels пода или его Deployment.
Паттерн Sidecar
В паттерне Sidecar FlowLink запускается как дополнительный контейнер в каждом поде. Sidecar перехватывает команды от основного контейнера, анализирует их через 7-уровневый Shield и применяет политики безопасности. Поды обмениваются через shared volume или localhost.
1apiVersion: apps/v12kind: Deployment3metadata:4 name: my-app5 labels:6 flowlink/inject: "true" # Триггер для Mutation Webhook7spec:8 replicas: 39 selector:10 matchLabels:11 app: my-app12 template:13 metadata:14 labels:15 app: my-app16 flowlink/inject: "true"17 spec:18 containers:19 - name: app20 image: my-app:latest21 ports:22 - containerPort: 808023 env:24 - name: FLOWLINK_SIDECAR_HOST25 value: "localhost"26 - name: FLOWLINK_SIDECAR_PORT27 value: "9090"28 # FlowLink sidecar (автоматически внедряется webhook'ом)29 # или может быть задан вручную:30 - name: flowlink-shield31 image: flowlink/flowlink-shield:latest32 ports:33 - containerPort: 909034 env:35 - name: RELAY_URL36 value: "https://flowlink.flow-masters.ru/api/v1"37 - name: AGENT_ID38 valueFrom:39 fieldRef:40 fieldPath: metadata.name41 - name: SHIELD_MODE42 value: "enforce"43 resources:44 requests:45 cpu: 100m46 memory: 128Mi47 limits:48 cpu: 500m49 memory: 256Mi
Паттерн DaemonSet
В паттерне DaemonSet FlowLink запускается как под на каждом узле кластера. Каждый агент мониторит все поды на своём узле, собирает аудиt-логи и применяет политики на уровне ноды. Этот паттерн снижает потребление ресурсов по сравнению с sidecar, но обеспечивает меньшую гранулярность изоляции.
1apiVersion: apps/v12kind: DaemonSet3metadata:4 name: flowlink-agent5 namespace: flowlink-system6 labels:7 app.kubernetes.io/name: flowlink-agent8spec:9 selector:10 matchLabels:11 app: flowlink-agent12 template:13 metadata:14 labels:15 app: flowlink-agent16 spec:17 serviceAccountName: flowlink-agent18 tolerations:19 - key: node-role.kubernetes.io/control-plane20 effect: NoSchedule21 - key: node-role.kubernetes.io/master22 effect: NoSchedule23 containers:24 - name: flowlink-agent25 image: flowlink/flowlink-shield:latest26 securityContext:27 privileged: false28 runAsUser: 100029 readOnlyRootFilesystem: true30 env:31 - name: RELAY_URL32 valueFrom:33 configMapKeyRef:34 name: flowlink-config35 key: relay.url36 - name: AGENT_ID37 valueFrom:38 fieldRef:39 fieldPath: spec.nodeName40 - name: NODE_NAME41 valueFrom:42 fieldRef:43 fieldPath: spec.nodeName44 - name: SHIELD_MODE45 value: "monitor"46 volumeMounts:47 - name: config48 mountPath: /etc/flowlink49 readOnly: true50 - name: run51 mountPath: /var/run52 readOnly: true53 volumes:54 - name: config55 configMap:56 name: flowlink-config57 - name: run58 hostPath:59 path: /var/run
Service Account и RBAC
FlowLink Operator требует минимальных RBAC привилегий для управления CRD и мониторинга подов. Рекомендуется использовать отдельный ServiceAccount с ограниченными правами.
1---2apiVersion: v13kind: ServiceAccount4metadata:5 name: flowlink-operator6 namespace: flowlink-system7 labels:8 app.kubernetes.io/name: flowlink-operator9automountServiceAccountToken: true1011---12apiVersion: rbac.authorization.k8s.io/v113kind: ClusterRole14metadata:15 name: flowlink-operator16 labels:17 app.kubernetes.io/name: flowlink-operator18rules:19 # Управление собственными CRD20 - apiGroups: ["flowlink.io"]21 resources: ["flowlinkagents", "flowlinkagents/status"]22 verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]23 - apiGroups: ["shield.flowlink.ai"]24 resources: ["flowlinkshieldpolicies", "flowlinkshieldpolicies/status"]25 verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]2627 # Мониторинг подов для sidecar injection28 - apiGroups: [""]29 resources: ["pods", "pods/status"]30 verbs: ["get", "list", "watch"]31 - apiGroups: [""]32 resources: ["namespaces"]33 verbs: ["get", "list", "watch"]3435 # Конфигурация webhook36 - apiGroups: ["admissionregistration.k8s.io"]37 resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"]38 verbs: ["get", "list", "watch", "create", "update", "patch"]39 - apiGroups: [""]40 resources: ["secrets"]41 verbs: ["get", "list", "watch"] # для TLS сертификатов webhook4243 # ConfigMaps и Secrets44 - apiGroups: [""]45 resources: ["configmaps", "secrets"]46 verbs: ["get", "list", "watch"]4748---49apiVersion: rbac.authorization.k8s.io/v150kind: ClusterRoleBinding51metadata:52 name: flowlink-operator53 labels:54 app.kubernetes.io/name: flowlink-operator55subjects:56 - kind: ServiceAccount57 name: flowlink-operator58 namespace: flowlink-system59roleRef:60 kind: ClusterRole61 name: flowlink-operator62 apiGroup: rbac.authorization.k8s.io
Компоненты
ShieldOperator
Reconciliation loop: watches FlowLinkShieldPolicy CRDs, сравнивает spec vs status, синхронизирует состояние.
AdmissionWebhook
Validating (deny violations) + Mutating (inject sidecar). Работает на уровне API server — блокирует до создания Pod.
ShieldSidecar
Injected container с flowlink-shield. Подключается к relay, применяет политики к контейнеру.
Relay Reporting
Operator отправляет reconciliation events в relay audit endpoint. Полная видимость из FlowLink Dashboard.
Примеры
Deployment с Sidecar
1apiVersion: apps/v12kind: Deployment3metadata:4 name: api-server5 namespace: production6 labels:7 flowlink/inject: "true"8spec:9 replicas: 310 selector:11 matchLabels:12 app: api-server13 template:14 metadata:15 labels:16 app: api-server17 flowlink/inject: "true"18 spec:19 serviceAccountName: app-sa20 containers:21 - name: api22 image: my-company/api-server:v2.1.023 env:24 - name: DATABASE_URL25 valueFrom:26 secretKeyRef:27 name: db-credentials28 key: url29 # FlowLink sidecar внедряется автоматически через webhook
Deployment с DaemonSet
1# Применить FlowLink DaemonSet2kubectl apply -f https://raw.githubusercontent.com/flowlink/flowlink-operator/main/config/daemonset.yaml34# Проверить статус агентов на узлах5kubectl get pods -n flowlink-system -l app=flowlink-agent -o wide67# Просмотреть логи агента на конкретном узле8kubectl logs -n flowlink-system flowlink-agent-<NODE> -c flowlink-agent --tail=100
Применение FlowLinkAgent CRD
1# Создать FlowLinkAgent для production namespace2kubectl apply -f - <<EOF3apiVersion: flowlink.io/v1alpha14kind: FlowLinkAgent5metadata:6 name: production-agent7 namespace: production8spec:9 relayUrl: "https://flowlink.flow-masters.ru/api/v1"10 agentId: "prod-k8s-agent"11 tags:12 - "production"13 - "api"14 policies:15 - name: block-destructive16 action: deny17 patterns: ["rm -rf *", "DROP TABLE", "chmod 777"]18 shield:19 enabled: true20 mode: enforce21 sandbox:22 enabled: true23 filesystem: read-only24EOF2526# Проверить статус агента27kubectl get flowlinkagents -n production28kubectl describe flowlinkagent production-agent -n production
Конфигурация
Все настройки FlowLink Operator хранятся в ConfigMap в namespace flowlink-system. Конфигурация автоматически монтируется в поды оператора и агентов.
1apiVersion: v12kind: ConfigMap3metadata:4 name: flowlink-config5 namespace: flowlink-system6data:7 # Адрес FlowLink Relay8 relay.url: "https://flowlink.flow-masters.ru/api/v1"910 # Режим работы Shield: monitor | enforce11 shield.mode: "enforce"1213 # Активные уровни анализа (через запятую)14 shield.levels: "L1,L2,L3,L4,L5,L6,L7"1516 # Чувствительность: low | medium | high17 shield.sensitivity: "medium"1819 # Namespace'ы для мониторинга (пусто = все)20 watch.namespaces: "default,production,staging"2122 # Интервал heartbeat к relay (секунды)23 heartbeat.interval: "30"2425 # Размер лог-буфера (MB)26 log.bufferSize: "50"2728 # Включить sandbox по умолчанию29 sandbox.enabled: "true"3031 # Политика сети sandbox: restrict | allow32 sandbox.networkPolicy: "restrict"
Переменные окружения
| Переменная | Описание | По умолчанию |
|---|---|---|
RELAY_URL | URL FlowLink Relay | — |
RELAY_API_KEY | API ключ для аутентификации | — |
AGENT_ID | Уникальный идентификатор агента | hostname |
SHIELD_MODE | Режим Shield: monitor | enforce | monitor |
SHIELD_LEVELS | Активные уровни анализа | L1-L7 |
LOG_LEVEL | Уровень логирования | info |
NODE_NAME | Имя узла (для DaemonSet) | — |
Ручной деплой
1# 1. Применить CRD2kubectl apply -f config/crd.yaml34# 2. Создать политику5kubectl apply -f config/policy.yaml67# 3. Собрать оператор8cargo build --release -p flowlink-k8s910# 4. Запустить оператор (подключается к relay)11./flowlink-k8s --relay-url https://flowlink.flow-masters.ru/api/v1
Статус
⚠️ Draft — не тестирован в production кластере
Код реальный (5K строк Rust, 76 тестов), использует kube 0.93 + k8s-openapi. Требует E2E тестирования в реальном кластере перед production использованием.
Хотите получить уведомление когда K8s Operator будет готов?