В Kubernetes нет встроенной сети. Это может удивить, но оркестратор сознательно оставил этот слой за бортом своей архитектуры. Вместо реализации он определил только требования к сети (модель), а саму реализацию делегировал внешним плагинам по стандарту CNI
Сегодня разберемся, как это всё работает💻
CNI (Container Network Interface) - спецификация (стандарт) и набор библиотек, которые определяют, как программы оркестрации (kubelet*) взаимодействуют с плагинами настройки сети
Проще говроря, это стандартизированный API, через который kubelet говорит плагину что делать (например, «Создай сеть для этого пода» или «Удали сеть у этого пода»)🤝
Под "капотом" это работает так:
• Создаем под
• kubelet вызывает исполняемый файл CNI-плагина (например, /opt/cni/bin/calico) с командой ADD, передавая конфигурацию в формате JSON
• Плагин выполняет свою работу (Создаёт виртуальный сетевой интерфейс (veth pair), один конец veth помещает в network namespace пода (обычно как eth0), второй конец оставляет на хост-ноде, назначает IP-адрес из пула подов и настраивает маршрутизацию (routing table) на хосте)
• При удалении пода kubelet вызывает плагин с командой DEL, и плагин подчищает за собой интерфейсы и маршруты
Любой CNI-плагин обязан обеспечить выполнение этих правил:
• Любой под может общаться с любым другим подом без NAT
• Любой узел (нода) может общаться с любым подом на этом узле (и наоборот) без NAT
• IP-адрес, который под видит у себя внутри, — это тот же IP-адрес, который видят другие поды
Популярные реализации CNI
Flannel (от CoreOS/Kubernetes)
• Как работает: Простой оверлей (обычно VXLAN). Инкапсулирует трафик подов в UDP-пакеты
• Для чего: Обучение, маленькие кластеры, где не нужна сложная маршрутизация или сетевые политики
Calico (от Tigera)
• Как работает: По умолчанию использует BGP для распространения маршрутов между нодами (без инкапсуляции, "native routing"). Также поддерживает VXLAN и eBPF
• Для чего: Продакшен. Золотой стандарт. Даёт мощные Network Policies (файрвол для подов на уровне L3/L4)
Cilium
• Как работает: Построен на базе eBPF (Extended Berkeley Packet Filter) в ядре Linux. Позволяет программировать сеть, безопасность и наблюдаемость напрямую в ядре, минуя традиционный стек iptables
• Для чего: Высоконагруженные системы, кластеры с тысячами сервисов, где критична производительность и нужна глубокая L7-видимость трафика
*Kubelet - основной «агент узла» (node agent), который запускается и работает на каждой ноде (сервере) кластера Kubernetes (получает спецификации подов (PodSpecs) от API-сервера и гарантирует, что описанные в них контейнеры запущены, работают и находятся в исправном состоянии)
