Ответ
В Kubernetes есть несколько практических способов запустить tcpdump для диагностики сетевых проблем в контейнере, где эта утилита отсутствует.
1. Временная установка в контейнер (если есть сетевой доступ и права):
# Для Alpine-based контейнеров
kubectl exec -it <pod-name> -- sh -c "apk add --no-cache tcpdump && tcpdump -i any -n"
# Для Debian/Ubuntu-based
kubectl exec -it <pod-name> -- sh -c "apt-get update && apt-get install -y tcpdump && tcpdump -i any -n"
Этот метод изменяет контейнер, что не всегда допустимо в production.
2. Использование Ephemeral Debug Container (рекомендуемый способ для K8s 1.23+):
kubectl debug -it <pod-name> --image=nicolaka/netshoot --target=<container-name> -- tcpdump -i eth0 -n port 80
Здесь используется специальный образ для диагностики (например, nicolaka/netshoot). Контейнер запускается в том же Pod и network namespace, что и целевой, не изменяя его. Флаг --target позволяет присоединиться к network namespace конкретного контейнера.
3. Запуск на узле с использованием nsenter (требует доступ к узлу):
# Найти PID контейнера на узле
CONTAINER_ID=$(kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].containerID}' | cut -d'/' -f3)
PID=$(docker inspect -f '{{.State.Pid}}' $CONTAINER_ID)
# Запустить tcpdump в network namespace контейнера
nsenter -t $PID -n tcpdump -i any -n
Этот метод требует доступа к узлу и установленного tcpdump на хосте.
Практический пример из опыта: При диагностике проблем с подключением к Redis в production использовал ephemeral container для захвата трафика:
kubectl debug pod/app-backend-xyz --image=nicolaka/netshoot -it --target=app-container -- tcpdump -i any -A -n 'host 10.10.20.5 and port 6379' -w /tmp/redis.pcap
Затем скачивал .pcap файл для анализа в Wireshark.