← Назад к вопросам

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

2.0 Middle🔥 221 комментариев
#Kubernetes#Сети и протоколы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Логическая модель сети в Kubernetes

В Kubernetes сеть представлена через систему абстракций, которые скрывают сложность физической инфраструктуры и обеспечивают единообразное взаимодействие между компонентами, независимо от их физического размещения. Эта модель основана на нескольких ключевых принципах и объектах.

Основные принципы сетевой модели Kubernetes

  1. Каждый Pod получает уникальный IP-адрес (IP-per-Pod): Каждому Pod в кластере назначается уникальный IP-адрес из внутреннего пула кластера. Все контейнеры внутри одного Pod разделяют один network namespace, то есть используют один IP-адрес, портовое пространство и сетевой интерфейс. Это фундаментальный принцип, упрощающий коммуникацию между контейнерами внутри Pod и на уровне сервисов.

  2. Прякая связь Pod-to-Pod: Pod'ы должны иметь возможность общаться друг с другом напрямую, используя свои IP-адреса, без использования NAT (трансляции сетевых адресов), независимо от того, на каком узле (Node) они находятся.

  3. Абстракция Service: Поскольку Pod'ы эфемерны (их IP-адреса меняются при пересоздании), Kubernetes предоставляет объект Service. Service определяет стабильную конечную точку доступа (логический набор Pod'ов) и назначает ей стабильный ClusterIP (виртуальный IP внутри кластера) и DNS-имя. Трафик на ClusterIP автоматически распределяется (балансируется) между Pod'ами, соответствующими селекторам Service.

  4. Абстракция Ingress: Для управления входящим HTTP/HTTPS трафиком извне кластера используется объект Ingress. Он действует как "умный" маршрутизатор уровня 7 (L7), позволяя определить правила маршрутизации на основе хоста, пути и других заголовков HTTP к различным Service'ам внутри кластера. Для работы Ingress'у требуется контроллер (например, ingress-nginx, traefik), который развертывается в виде Pod'а.

  5. Сетевая политика (NetworkPolicy): Это механизм обеспечения безопасности, позволяющий определять правила входящего (ingress) и исходящего (egress) трафика для Pod'ов. NetworkPolicy реализует модель микросетевизации (microsegmentation) на уровне Pod'ов. Сами по себе политики — это лишь декларация правил; для их применения необходим CNI-плагин с поддержкой NetworkPolicy (например, Calico, Cilium, Weave Net).

# Пример NetworkPolicy, разрешающей входящий трафик только от Pod'ов
# с определенной меткой и только на порт 80
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 80

Ключевые логические сетевые объекты и их взаимодействие

Давайте проследим путь запроса извне в приложение:

  1. Внешний клиент обращается по доменному имени (например, app.example.com).
  2. DNS резолвит имя на публичный IP вашего LoadBalancer Service (в облаке) или IP-адрес вашего ингресс-контроллера, если он вынесен наружу через NodePort или hostNetwork.
  3. Ingress Controller получает HTTP-запрос, анализирует заголовок Host и путь, находит соответствующий объект Ingress и перенаправляет запрос на ClusterIP соответствующего backend Service'а.
  4. Сервис (Service) — это не процесс, а абстракция, реализуемая компонентом kube-proxy на каждом узле. Kube-proxy настраивает правила iptables или ipvs, которые DNAT'ят (подменяют адрес назначения) пакеты с ClusterIP на реальный Pod IP.
  5. Сетевая инфраструктура кластера (CNI) обеспечивает доставку пакета с Pod IP источника на Pod IP назначения, соблюдая правила NetworkPolicy.

Роль CNI (Container Network Interface)

Вся магия, обеспечивающая выполнение принципов 1 и 2 (уникальный IP и прямая связь), ложится на CNI-плагин. Это отдельный компонент, который Kubernetes вызывает при создании и удалении Pod'ов. Его задачи:

  • Выделение IP-адреса Pod'у из заданного пула.
  • Настройка сетевого интерфейса Pod'а (обычно пары veth).
  • Подключение этого интерфейса к виртуальной overlay-сети (например, через VXLAN, WireGuard) или настройка маршрутов в underlay-сети (например, через BGP в Calico).
  • Обеспечение возможности маршрутизации трафика между Pod'ами на разных узлах.
# Пример: просмотр сетевых настроек Pod'а (выполняется на узле)
# Показывает, что контейнеры внутри Pod используют один сетевой неймспейс
kubectl exec -it my-pod -- ip addr
# Показывает, как kube-proxy создал правила iptables для Service
sudo iptables -t nat -L KUBE-SERVICES | grep <my-service-name>

Итог

Логически сеть Kubernetes — это уровень абстракций поверх физической сети, который обеспечивает:

  • Service Discovery через DNS и стабильные ClusterIP.
  • Load Balancing на уровне Service и Ingress.
  • Изоляцию и безопасность через NetworkPolicy.
  • Упрощенную модель разработки, где приложение "видит" сеть как плоское адресное пространство Pod'ов и Service'ов.

Физическая реализация этой модели полностью делегирована CNI-плагинам и сетевым провайдерам (облачным или on-prem), что обеспечивает гибкость и переносимость.

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