Сетевое взаимодействие (Services, CNI, Kube-Proxy)

From wiki.baghirzade.pro
Jump to navigation Jump to search

1. Проблема динамической сети

Поды в Kubernetes эфемерны (недолговечны). При перезагрузке или обновлении пода его IP-адрес меняется.

  • Проблема: Если приложение (Frontend) обращается к базе данных по IP-адресу пода, при перезагрузке базы связь разорвется.
  • Решение: Объект Service — стабильный виртуальный IP и DNS-имя, которое перенаправляет трафик на нужные поды.

2. Kubernetes Service (SVC)

Service — это абстракция, которая определяет логический набор подов и политику доступа к ним.

  • Selector & Labels: Сервис находит поды с помощью меток (labels). Если у пода есть метка app: nginx, а в сервисе прописан selector: app: nginx, сервис автоматически начнет направлять трафик на этот под.
  • Endpoints (EP): Это список реальных IP-адресов подов, которые в данный момент "подвязаны" к сервису. K8s сам обновляет этот список в реальном времени.

3. Компоненты сетевого управления

3.1 CNI (Container Network Interface)

Это сетевой драйвер (например, Calico или Flannel).

  • За что отвечает: Выделение IP-адресов подам и обеспечение связи между подами на разных нодах (L2/L3 уровни).
  • Важно: Без установленного CNI поды будут висеть в статусе Pending или не получат IP.

3.2 Kube-Proxy

Сетевой агент, работающий на каждой ноде.

  • За что отвечает: Он реализует концепцию Сервиса. Когда трафик приходит на виртуальный IP сервиса, kube-proxy (через правила IPtables или IPVS) перенаправляет его на конкретный IP одного из подов.
  • Уровень: Работает на L4 (транспортный уровень).

4. Типы сервисов (Основные)

  1. ClusterIP (Default): Сервис доступен только внутри кластера. Идеально для связи между бэкендом и базой данных.
  2. NodePort: Открывает порт на каждой ноде кластера. Трафик на этот порт перенаправляется на сервис. Позволяет получить доступ к приложению снаружи по IP_ноды:Port.
  3. LoadBalancer: Используется в облаках (AWS, Azure, GCP). Облако выделяет внешний IP-адрес для доступа к сервису.

5. Обнаружение через DNS (CoreDNS)

Внутри кластера работает встроенный DNS-сервер.

  • Когда создается сервис с именем db-service, любой под в том же неймспейсе может обратиться к нему просто по имени: curl http://db-service.
  • K8s сам сопоставит это имя со стабильным IP-адресом сервиса (ClusterIP).

6. Шпаргалка по командам (Cheat Sheet)

Команда Описание
kubectl get svc Список всех сервисов
kubectl get ep Просмотр эндпоинтов (реальных IP подов за сервисом)
kubectl describe svc <name> Подробная информация о сервисе и его селекторах
kubectl expose deployment <name> --port=80 --target-port=8080 Быстрое создание сервиса для деплоймента
kubectl logs -n kube-system -l k8s-app=kube-proxy Просмотр логов kube-proxy для отладки сети

💡 Практические советы для DevOps-инженера:

  1. Проверка связи: Если приложение не видит базу, проверяй цепочку в обратном порядке:
    1. Pod IP (пингуется ли сам под?)
    2. Endpoints (видит ли сервис этот под?)
    3. Service IP (доступен ли виртуальный IP?).
  2. TargetPort vs Port: * port: Порт, который слушает сам Сервис.
    • targetPort: Порт, на котором слушает приложение внутри Контейнера.
  3. Rolling Update и Сеть: Во время обновления деплоймента Kubernetes плавно убирает старые IP из эндпоинтов и добавляет новые. Благодаря этому пользователь не замечает процесса обновления.