Введение
CNI (Container Network Interface) – открытый стандарт и спецификация, определяющая интерфейс между исполняющей средой контейнеров (container runtime) и сетевыми плагинами. CNI описывает формат конфигурационных файлов и набор операций (ADD, DEL, CHECK, VERSION), которые плагин должен поддерживать для подключения и отключения контейнеров от сети.
В Kubernetes каждый Pod должен получить уникальный IP-адрес и иметь возможность общаться с любым другим Pod'ом в кластере без NAT. Именно CNI-плагин обеспечивает выполнение этих требований сетевой модели Kubernetes. Без CNI-плагина Pod'ы не смогут взаимодействовать друг с другом.
История и контекст
До появления CNI каждый оркестратор контейнеров имел собственную сетевую реализацию. Docker использовал libnetwork, rkt – свой подход. В 2015 году CoreOS и Google совместно разработали спецификацию CNI как нейтральный стандарт, не привязанный к конкретному оркестратору. Спецификация была принята CNCF и поддерживается в рамках проекта containernetworking.
Сегодня CNI поддерживается Kubernetes, CRI-O, containerd, Podman и другими container runtime'ами. Экосистема плагинов CNI насчитывает десятки реализаций, от простых (Flannel) до продвинутых с eBPF (Cilium).
Как это работает
Когда Kubernetes создаёт Pod, kubelet вызывает CNI-плагин через стандартный интерфейс:
- ADD: плагин создаёт сетевой интерфейс (veth-pair), назначает IP-адрес из пула IPAM (IP Address Management), настраивает маршруты и возвращает информацию о сети.
- Pod получает IP-адрес и начинает принимать трафик.
- При удалении Pod'а kubelet вызывает DEL: плагин освобождает IP и удаляет сетевой интерфейс.
CNI-плагин состоит из нескольких компонентов:
- Network плагин: отвечает за создание сетевых интерфейсов и настройку overlay/underlay сети.
- IPAM плагин: управляет пулами IP-адресов (host-local, dhcp, Whereabouts для мультикластера).
- Chained plugins: несколько плагинов могут работать последовательно (например, основной + bandwidth).
Типы сетей CNI:
- Overlay-сети: инкапсуляция трафика через VXLAN или GENEVE поверх физической сети (Flannel, Weave). Простые в настройке, но с накладными расходами на инкапсуляцию.
- Underlay/BGP-сети: маршрутизация Pod-трафика напрямую через физическую сеть с помощью BGP (Calico). Высокая производительность, требует настройки сетевой инфраструктуры.
- eBPF-based: Cilium использует eBPF в ядре Linux для высокопроизводительной обработки пакетов и применения политик без iptables.
Популярные CNI-плагины
- Calico: наиболее распространённый в enterprise. Поддерживает BGP-маршрутизацию, богатые NetworkPolicy, WireGuard-шифрование. Компания Tigera.
- Flannel: простейший overlay-плагин с VXLAN. Идеален для разработки и небольших кластеров.
- Cilium: использует eBPF вместо iptables. Высокая производительность, L7 NetworkPolicy (HTTP, gRPC), встроенная observability через Hubble. Рекомендован для cloud-native сред.
- Weave Net: простой overlay с автоматическим обнаружением пиров. Поддерживает шифрование.
- Multus: мета-плагин, позволяющий подключить Pod к нескольким сетям (актуально для телекоммуникаций, 5G).
Сетевые политики (NetworkPolicy)
Kubernetes NetworkPolicy – ресурс для управления трафиком между Pod'ами. Сам по себе Kubernetes не применяет NetworkPolicy – это делает CNI-плагин. Не все плагины поддерживают NetworkPolicy: Flannel, например, не поддерживает; Calico и Cilium – поддерживают в полной мере.
NetworkPolicy позволяет:
- Разрешить трафик только между определёнными namespace'ами или Pod'ами с определёнными labels.
- Заблокировать весь входящий/исходящий трафик по умолчанию (default deny).
- Ограничить доступ к базам данных только от Pod'ов приложения.
Связь с другими понятиями
- Kubernetes Operator – операторы Calico и Cilium упрощают установку и управление CNI в кластере.
- Service Mesh (Istio, Linkerd) – работает поверх CNI, добавляя L7 observability и mTLS. CNI обеспечивает базовую связность, service mesh – расширенное управление трафиком.
- Ingress – для работы Ingress Controller'а необходима исправно функционирующая CNI-сеть.
- eBPF – современные CNI-плагины (Cilium) используют eBPF для замены iptables, достигая значительного ускорения обработки пакетов.