Перейти к содержанию

Cilium

Описание

Cilium — это сетевой плагин (CNI) и система безопасности для Kubernetes, которая работает на уровне ядра операционной системы с использованием технологии eBPF.

Поддержка микросегментации сети на уровне CNI (NetworkPolicy)

Микросегментация на уровне CNI позволяет реализовать принцип нулевого доверия (Zero Trust) в Kubernetes, ограничивая сетевое взаимодействие между рабочими нагрузками. Cilium предоставляет для этого расширенный набор ресурсов NetworkPolicy, основанный на идентификации подов по меткам, а не на IP-адресах.

Основные ресурсы микросегментации

Cilium предлагает трехуровневую модель политик для микросегментации:

1. CiliumNetworkPolicy: Политика уровня пространства имен (namespace). Позволяет определять правила гранулярного доступа для отдельных подов, микросервисов или групп в рамках одного пространства имен.

2. CiliumClusterwideNetworkPolicy: Кластерная политика. Действует глобально, позволяя задавать правила, общие для всего кластера, что упрощает управление микросегментацией в мультитенантных средах.

3. Стандартный NetworkPolicy: Cilium полностью поддерживает и встроенный ресурс Kubernetes NetworkPolicy, обеспечивая совместимость с базовыми сценариями.

Такой подход гарантирует необходимую иерархию: Кластерный администратор может задать глобальные правила изоляции через CiliumClusterwideNetworkPolicy (например, запретить весь межпространственный трафик по умолчанию).

Разработчик или владелец сервиса может детализировать разрешения для своих микросервисов внутри конкретного неймспейса с помощью CiliumNetworkPolicy.

Модели микросегментации

Cilium позволяет реализовать микросегментацию на нескольких уровнях, каждый из которых имеет свою гранулярность разграничения доступа:

Микросегментация подов: Политики применяются к конкретным подам одной меткой, что позволяет изолировать друг от друга отдельные экземпляры сервисов.

Микросегментация микросервисов/CNF: Политики связывают группу подов, реализующих единую функцию, по общему селектору меток, контролируя их взаимодействие с другими сервисами.

Микросегментация неймспейсов: Политики изолируют пространства имен целиком, запрещая любой межпространственный трафик, кроме явно разрешенного.

Гранулярность разграничения доступа

Гибкость политик Cilium обеспечивается богатым синтаксисом правил и детальными селекторами:

По подам и микросервисам (endpointSelector, fromEndpoints, toEndpoints): Правила задаются через стандартные Kubernetes-селекторы меток (matchLabels), что позволяет гибко связывать поды, сервисы и их группы.

По пространствам имен (namespace): Политики могут изолировать отдельные пространства имен. Cilium позволяет как запретить весь входящий трафик в пространство имен (ingress: []), так и точечно указать разрешенные пространства-источники через метки kubernetes.io/metadata.name.

На уровне L7 (Application Layer): В дополнение к L3/L4 правилам (toPorts), Cilium позволяет фильтровать трафик на прикладном уровне. Например, можно разрешить только HTTP-запросы GET /health, но запретить POST /admin.

На основе DNS-имен (toFQDNs): Правила могут ссылаться на DNS-имена внешних сервисов, что упрощает управление доступом к сторонним API, не привязываясь к IP-адресам.

Практические примеры гранулярной микросегментации

Микросегментация микросервисов (L3/L4)

Разрешить фронтенду общаться с бэкендом, а бэкенду — с базой данных:

# Политика, разрешающая доступ к базе данных только от бэкенда
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-backend-to-database
spec:
  endpointSelector:
    matchLabels:
      app: database
  ingress:
    - fromEndpoints:
        - matchLabels:
            app: backend
  egress:
    - toEntities:
        - all

Гранулярная изоляция по HTTP-методам (L7)

Разрешить только чтение (GET) для сервиса:

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "l7-rule-get-only"
spec:
  endpointSelector:
    matchLabels:
      app: api-server
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: api-client
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:
        - method: "GET"

Глобальная изоляция и точечное разрешение

Можно скомбинировать кластерную политику для запрета всего трафика по умолчанию с именованными политиками, разрешающими только необходимые взаимодействия. Это классический подход Zero Trust.

Изоляция неймспейсов

Запретить трафик между неймспейсами:

apiVersion: cilium.io/v2
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: deny-cross-ns-traffic
spec:
  endpointSelector: {}
  ingress:
    - fromEndpoints:
        - matchLabels: {}

Дополнительные возможности:

  • Идентификация на основе меток: Cilium оперирует не IP-адресами, а идентификаторами рабочих нагрузок, что критически важно в среде с короткоживущими подами.
  • Наблюдаемость через Hubble: Для проверки и отладки политик микросегментации Cilium предоставляет Hubble, который визуализирует сетевые потоки и позволяет верифицировать, что трафик разрешен или заблокирован в соответствии с ожиданиями.
  • Приоритет политик: Порядок правил не важен, они объединяются, однако Cilium позволяет явно задавать приоритеты для разрешения конфликтов.

QoS в Cilium: управление трафиком на уровне CNI

Cilium предоставляет три взаимодополняющих механизма для управления качеством обслуживания сетевого трафика непосредственно на уровне CNI:

1. Bandwidth Manager – аппаратно-программное ограничение полосы;
2. NetworkPolicy QoS – приоритизация доступа средствами политик;
3. DSCP‑маркировка – сквозная классификация пакетов во внешней сети.

Заметка

Все механизмы работают на базе eBPF и не требуют изменения кода приложений.

Bandwidth Manager

Назначение

EDT‑шейпинг (Earliest Departure Time) на eBPF, ограничивающий исходящую/входящую полосу подов и включающий поддержку алгоритма TCP BBR.

Активация

Для активации необходимо переключить bandwidthManager.enabled в true в конфигурации cilium

Важно

Для работы BBR необходим Bandwidth Manager.

Применение к подам

Укажите аннотации в спецификации пода:

metadata:
  annotations:
    kubernetes.io/egress-bandwidth: "10M"   # исходящий лимит
    kubernetes.io/ingress-bandwidth: "5M"  # входящий лимит

Ограничение действует на интерфейсе пода и не влияет на маркировку за пределами узла.


NetworkPolicy QoS

Регулирует приоритеты доступа через расширенную модель политик, оперируя на L3, L4 и L7.

Ресурсы

  • CiliumNetworkPolicy – политики уровня namespace

  • CiliumClusterwideNetworkPolicy – кластерные политики

Ключевые возможности

  • Идентификация трафика по pod‑селекторам, namespace, FQDN, HTTP‑методам и т.д.
  • Режимы применения:
    • default – разрешать, если не запрещено явно
    • always – всегда применять правило
    • never – отключить политику
  • Маркировка трафика на L3/L4 для последующей обработки другими компонентами (например, DSCP‑маркировкой в будущем).

Пример политики

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "priority-ingress"
spec:
  endpointSelector:
    matchLabels:
      app: frontend
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: backend
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
  egress:
  - toEndpoints:
    - matchLabels:
        app: database

Политика автоматически применяет QoS‑правила к трафику между помеченными подам.


DSCP‑маркировка (экспериментальная)

Позволяет выставлять поле DSCP в заголовке IP на исходящем трафике из пода, обеспечивая сквозную приоритизацию во внешней сети.

Статус

Экспериментальная возможность, реализуемая через новые CRD. Включается флагом enable-qos и требует установки CR‑схем.

Необходимые ресурсы

1. QoSMechanism (администратор кластера) – регистрирует доступный механизм.
2. QoSClass (сетевой администратор) – описывает конкретный класс на базе механизма.
3. QoSPolicy (разработчик) – назначает классы подам.

Пример конфигурации

QoSMechanism
apiVersion: cilium.io/v1alpha1
kind: QoSMechanism
metadata:
  name: dscp
spec:
  type: DSCP
  description: "DSCP tagging for egress traffic"
QoSClass
apiVersion: cilium.io/v1alpha1
kind: QoSClass
metadata:
  name: voice
spec:
  mechanismRef:
    name: dscp
  parameters:
    value: 46   # Expedited Forwarding (EF)
QoSPolicy
apiVersion: cilium.io/v1alpha1
kind: QoSPolicy
metadata:
  name: voip-qos
spec:
  endpointSelector:
    matchLabels:
      app: asterisk
  qosClasses:
  - voice

После создания политики Cilium‑агент выставит DSCP 46 для всех исходящих IP‑пакетов подов с меткой app=asterisk.


Совместное использование

Все три механизма можно комбинировать: - Bandwidth Manager ограничивает скорость локально;
- NetworkPolicy QoS задаёт правила доступа;
- DSCP‑маркировка передаёт приоритеты во внешнюю инфраструктуру.

Заметка

При обновлении конфигурации политик или аннотаций Cilium применяет изменения без перезапуска подов.