Сетевое взаимодействие (Services, CNI, Kube-Proxy)
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. Типы сервисов (Основные)
- ClusterIP (Default): Сервис доступен только внутри кластера. Идеально для связи между бэкендом и базой данных.
- NodePort: Открывает порт на каждой ноде кластера. Трафик на этот порт перенаправляется на сервис. Позволяет получить доступ к приложению снаружи по
IP_ноды:Port. - 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-инженера:
- Проверка связи: Если приложение не видит базу, проверяй цепочку в обратном порядке:
Pod IP(пингуется ли сам под?)Endpoints(видит ли сервис этот под?)Service IP(доступен ли виртуальный IP?).
- TargetPort vs Port: *
port: Порт, который слушает сам Сервис.targetPort: Порт, на котором слушает приложение внутри Контейнера.
- Rolling Update и Сеть: Во время обновления деплоймента Kubernetes плавно убирает старые IP из эндпоинтов и добавляет новые. Благодаря этому пользователь не замечает процесса обновления.