Что такое CNI в Kubernetes?

«Что такое CNI в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные задачи CNI:

  • Подключение пода к сети: Создание виртуального интерфейса (veth pair) и подключение его к сетевому мосту (например, cni0) или другому устройству.
  • Управление IP-адресами: Выделение уникального IP-адреса для каждого пода из заданного пула (IPAM — IP Address Management).
  • Очистка ресурсов: Удаление сетевых интерфейсов и освобождение IP-адресов при удалении пода.

Популярные CNI-плагины:

  • Calico: Предоставляет сетевое соединение и политики безопасности (Network Policies) на основе BGP или IP-in-IP.
  • Cilium: Работает на основе eBPF, предлагая расширенные возможности сетевой безопасности, наблюдения и балансировки нагрузки.
  • Flannel: Простое overlay-решение, создающее виртуальную сеть поверх существующей инфраструктуры.

Пример базовой CNI-конфигурации (в формате JSON), которую kubelet передаёт плагину:

{
  "cniVersion": "0.4.0",
  "name": "my-k8s-network",
  "type": "bridge",
  "bridge": "cni0",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}

Без работающего CNI-плагина поды в кластере Kubernetes не смогут общаться друг с другом или с внешним миром.