Ответ
Сеть в 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).