Как логически представлена сеть в Kubernetes

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

Ответ

Сеть в Kubernetes логически построена на нескольких ключевых абстракциях, которые создают плоское (flat) адресное пространство для подов и сервисов.

1. Pod Network (Сеть подов):

  • Каждому поду назначается уникальный IP-адрес из внутренней сети кластера (например, 10.244.0.0/16).
  • Этот IP назначается CNI-плагином (Container Network Interface), таким как Calico, Cilium или Flannel.
  • Фундаментальное правило: любой под может общаться с любым другим подом в кластере напрямую, без NAT, независимо от того, на какой ноде (физической/виртуальной машине) они находятся. Это обеспечивается overlay-сетями (VXLAN, IP-in-IP) или маршрутизацией на уровне хоста (BGP в Calico).

2. Service Network (Сеть сервисов):

  • Сервис — это абстракция над динамическим набором подов (обычно определяемым селектором selector).
  • Сервису назначается виртуальный IP-адрес (ClusterIP) из другого, выделенного диапазона (например, 10.96.0.0/12). Этот IP стабилен на протяжении жизни сервиса.
  • Как это работает: Когда трафик приходит на ClusterIP, компонент kube-proxy, работающий на каждой ноде, перенаправляет его на один из IP-адресов бэкенд-подов. Механизм перенаправления может быть iptables (по умолчанию) или ipvs (более эффективен для большого числа сервисов).

3. DNS (Служба имен):

  • Встроенный DNS (обычно CoreDNS) автоматически создает DNS-записи для сервисов.
  • Формат записи: <service-name>.<namespace-name>.svc.cluster.local.
  • Например, под в том же namespace может обратиться к сервису backend просто по имени backend. Из другого namespace — по полному имени backend.app-namespace.svc.cluster.local.

4. Ingress (Входящий трафик):

  • Ingress — это API-объект для управления внешним доступом к сервисам (обычно HTTP/HTTPS).
  • Он не является типом сервиса, а определяет правила маршрутизации.
  • Для работы Ingress требуется контроллер (например, nginx-ingress, traefik), который разворачивается как под и создает балансировщик нагрузки (часто типа LoadBalancer).

Пример логической схемы:

Внешний мир
    |
    v
[ Ingress Controller (Pod) ] <---> [ Ingress Resource (правила) ]
    |
    v (маршрутизация по хосту/пути)
[ Service (ClusterIP: 10.96.10.5) ]
    |
    v (балансировка через iptables/ipvs)
[ Pod (10.244.1.2) ]  [ Pod (10.244.2.5) ]

Типы сервисов:

  • ClusterIP: Виртуальный IP, доступный только внутри кластера.
  • NodePort: Открывает статический порт на каждой ноде, перенаправляя трафик на сервис.
  • LoadBalancer: Интегрируется с облачным провайдером (AWS ELB, GCP Load Balancer) для создания внешнего балансировщика.
  • Headless: Сервис без ClusterIP, возвращающий напрямую IP-адреса подов. Используется для stateful-приложений (например, с StatefulSet).