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

Как отладить сетевые проблемы между подами в Kubernetes?

3.0 Senior🔥 161 комментариев
#Kubernetes#Сети и протоколы

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

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

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

Методология отладки сетевых проблем между Pod'ами в Kubernetes

Отладка сетевых проблем между подами в Kubernetes требует системного подхода, поскольку сетевая инфраструктура в K8s многослойна. Вот пошаговая методология, которую я применяю на практике, основанная на модели OSI "снизу вверх".

1. Проверка базовой связности между узлами

Первым делом убеждаемся, что проблема не на физическом/виртуальном сетевом уровне:

# Проверяем, находятся ли pods на разных нодах
kubectl get pods -o wide

# Проверяем сетевую связность между нодами
kubectl get nodes -o wide
ping <IP-адрес-ноды>

# Проверяем корректность настройки CNI плагина
kubectl get daemonset -n kube-system | grep -E '(calico|flannel|cilium|weave)'

2. Анализ состояния Pod'ов и их сетевых настроек

# Проверяем состояние Pod'ов
kubectl describe pod <pod-name> -n <namespace>

# Смотрим IP-адреса и статус
kubectl get pods -o wide -n <namespace>

# Проверяем, назначены ли IP-адреса
kubectl get pod <pod-name> -n <namespace> -o jsonpath='{.status.podIP}'

# Анализируем NetworkPolicy, которые могут блокировать трафик
kubectl get networkpolicy -n <namespace>
kubectl describe networkpolicy <policy-name> -n <namespace>

3. Диагностика изнутри Pod'а с помощью временных контейнеров

Используем ephemeral containers или запускаем диагностические поды:

# diagnostic-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: network-debugger
  namespace: <target-namespace>
spec:
  containers:
  - name: debugger
    image: nicolaka/netshoot:latest
    command: ["sleep", "3600"]
# Запускаем диагностический под
kubectl apply -f diagnostic-pod.yaml

# Выполняем базовые сетевые проверки
kubectl exec -it network-debugger -- /bin/bash

# Внутри контейнера:
ping <target-pod-ip>
nc -zv <target-pod-ip> <port>
traceroute <target-pod-ip>
nslookup <service-name>

4. Проверка Service и DNS разрешения

Проблемы часто связаны с сервисами или DNS:

# Проверяем сервисы
kubectl get svc -n <namespace>
kubectl describe svc <service-name> -n <namespace>

# Проверяем Endpoints
kubectl get endpoints <service-name> -n <namespace>

# Тестируем DNS разрешение изнутри пода
kubectl exec <pod-name> -- nslookup <service-name>.<namespace>.svc.cluster.local

# Проверяем CoreDNS
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system <coredns-pod-name>

5. Анализ сетевых политик и правил iptables

# Для Calico CNI
kubectl calico node status

# Для просмотра iptables правил на ноде
kubectl debug node/<node-name> -it --image=nicolaka/netshoot
# Затем внутри:
iptables-save | grep <pod-ip-or-service>
iptables -t nat -L -n -v

# Проверяем сетевые политики Cilium (если используется)
kubectl cilium status
kubectl cilium endpoint list

6. Глубокая диагностика с помощью сетевых утилит

# Захват трафика (требуются привилегии)
kubectl exec <pod-name> -- tcpdump -i any -w /tmp/capture.pcap
kubectl cp <pod-name>:/tmp/capture.pcap ./capture.pcap

# Проверка маршрутов
kubectl exec <pod-name> -- ip route show table all

# Анализ соединений
kubectl exec <pod-name> -- ss -tulpn
kubectl exec <pod-name> -- netstat -tulpn

# Проверка MTU
kubectl exec <pod-name> -- ping -M do -s 1472 -c 2 <target-ip>

7. Использование специализированных инструментов

Telepresence для отладки в локальной среде:

telepresence connect
telepresence intercept <service-name> --port <local-port>:<remote-port>

Kubernetes Network Policy Tester (например, network-multitool):

kubectl run test --image=praqma/network-multitool --command -- sleep 3600
kubectl exec test -- curl -v http://<target-service>:<port>

8. Проверка событий и логирование

# Смотрим события в namespace
kubectl get events -n <namespace> --sort-by='.lastTimestamp'

# Логи kube-proxy
kubectl logs -n kube-system -l k8s-app=kube-proxy

# Логи CNI плагина
kubectl logs -n kube-system -l k8s-app=<cni-component>

Ключевые принципы отладки:

  1. Иди от простого к сложному - начинай с ping, затем проверяй порты, потом прикладной уровень
  2. Изолируй проблему - определи, проблема на уровне: Pod→Pod, Pod→Service, или внешний доступ
  3. Проверяй смежные компоненты - не забывай про Network Policies, Services, Ingress Controllers
  4. Используй временные диагностические поды - они безопаснее, чем изменение рабочих контейнеров
  5. Документируй шаги - сетевые проблемы часто требуют воспроизведения и совместной работы

Типичные проблемы, с которыми сталкиваюсь: неправильные Network Policies, проблемы с CNI плагином, ошибки конфигурации Service, DNS проблемы, MTU mismatch, ограничения безопасности на уровне облачного провайдера. Каждый слой требует последовательной проверки методом исключения.