Как отладить сетевые проблемы между подами в Kubernetes?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Методология отладки сетевых проблем между 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>
Ключевые принципы отладки:
- Иди от простого к сложному - начинай с ping, затем проверяй порты, потом прикладной уровень
- Изолируй проблему - определи, проблема на уровне: Pod→Pod, Pod→Service, или внешний доступ
- Проверяй смежные компоненты - не забывай про Network Policies, Services, Ingress Controllers
- Используй временные диагностические поды - они безопаснее, чем изменение рабочих контейнеров
- Документируй шаги - сетевые проблемы часто требуют воспроизведения и совместной работы
Типичные проблемы, с которыми сталкиваюсь: неправильные Network Policies, проблемы с CNI плагином, ошибки конфигурации Service, DNS проблемы, MTU mismatch, ограничения безопасности на уровне облачного провайдера. Каждый слой требует последовательной проверки методом исключения.