CNI в Kubernetes: Calico, Cilium и eBPF

↑ Этап 5 · Kubernetes

Желательно~6 мин чтенияУровень: senior

Зачем это на собесе

«Как поды общаются между узлами?» и «Чем Calico отличается от Cilium?» Вопросы проверяют понимание сетевой модели Kubernetes и того, что за сеть отвечает плагин, а не сам Kubernetes.

Подтемы

  • Сетевая модель Kubernetes
  • Что такое CNI
  • Flannel, Calico, Cilium
  • eBPF
  • Как выбрать

Объяснение

Сетевая модель

Kubernetes требует: каждый под получает свой IP, любой под может связаться с любым без NAT, узлы видят поды. Как именно это реализовано, определяет CNI-плагин (Container Network Interface): он выдаёт IP подам, настраивает маршруты и, часто, политики.

flowchart LR
    subgraph Узел 1
      P1["Pod 10.1.1.5"] --- B1["мост / eBPF / маршруты"]
    end
    subgraph Узел 2
      P2["Pod 10.1.2.7"] --- B2["мост / eBPF / маршруты"]
    end
    B1 <-- "overlay (VXLAN) или маршрутизация (BGP)" --> B2

Режимы передачи между узлами

РежимКакОсобенности
Overlay (VXLAN, Geneve)пакеты подов упаковываются в пакеты узловработает везде, небольшие накладные расходы
Маршрутизация (BGP, прямая)маршруты подов объявляются в сетивыше производительность, нужна поддержка сети

Сравнение плагинов

ПлагинОсобенностиNetworkPolicy
Flannelпростейший overlay, минимум настроекнет (нужен дополнительный компонент)
Calicoмаршрутизация (BGP) или overlay, зрелые политики, есть режим eBPFда, богатые
Ciliumна eBPF, политики до L7, замена kube-proxy, наблюдаемость (Hubble), сетка без sidecar, мультикластерда, включая L7
Плагины облаков (AWS VPC CNI и др.)поды получают адреса из сети облакачерез облачные механизмы или Calico/Cilium

Weave Net больше не развивается (компания-разработчик прекратила работу), для новых кластеров его не выбирают.

eBPF

eBPF позволяет загружать в ядро Linux небольшие проверяемые программы, которые работают без модулей ядра. Для сети это даёт обработку пакетов раньше и быстрее, чем цепочки iptables: при тысячах сервисов правила iptables линейно замедляют, а eBPF использует хэш-таблицы.

  • Замена kube-proxy: балансировка Service на eBPF.
  • Политики и наблюдаемость на уровне сокетов и L7.
  • Безопасность: обнаружение подозрительных системных вызовов (Tetragon, Falco на eBPF).

Как выбрать

СитуацияВыбор
Учебный или небольшой кластер, нужна простотаFlannel или плагин по умолчанию в k3s
Нужны зрелые NetworkPolicy, BGP, гибкостьCalico
Нужны L7-политики, наблюдаемость, замена kube-proxy, сетка без sidecarCilium
Управляемый кластер облакаштатный плагин провайдера

Примеры

CiliumNetworkPolicy на уровне HTTP

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: orders-allow-read
  namespace: shop
spec:
  endpointSelector:
    matchLabels: { app: orders }
  ingress:
    - fromEndpoints:
        - matchLabels: { app: web }
      toPorts:
        - ports: [{ port: "8080", protocol: TCP }]
          rules:
            http:
              - method: GET
                path: "/orders.*"

Политика пропускает только GET /orders* от подов web. Обычная NetworkPolicy работает на уровне IP и портов.

Диагностика

kubectl get pods -n kube-system -o wide | grep -E "cilium|calico|flannel"   # какой плагин работает
kubectl exec -it pod-a -- ping <ip-пода-b>                                  # связность между подами
cilium status                                                                # состояние Cilium (нужен cilium CLI)

Нюансы и подводные камни

  • Плагин выбирают при создании кластера. Замена CNI в работающем кластере сложна и рискованна.
  • Перекрытие сетей. CIDR подов и сервисов не должны пересекаться с сетями компании и VPN.
  • MTU. При overlay уменьшайте MTU, иначе пакеты фрагментируются и ломаются «странными» таймаутами.
  • Версия ядра. Возможности eBPF зависят от версии ядра узлов.
  • NetworkPolicy работает только при поддержке плагина. Проверьте, что выбранный CNI её применяет (NetworkPolicy).
  • Наблюдаемость. Включайте Hubble или аналог до инцидента, а не после.

Вопросы с ответами

Связанные темы