Как запустить tcpdump, если его нет в контейнере в Kubernetes?

«Как запустить tcpdump, если его нет в контейнере в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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.