Ответ
В 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.
Ответ 18+ 🔞
А, ну вот, классика жанра! Ситуация, знакомая до боли: в продакшене что-то не коннектится, а в контейнере твоего приложения из утилит для диагностики — только ls да cat. Ёпта, прям волнение ебать! Как будто машину чинить, а вместо инструментов в багажнике — одна помада и зонтик.
Но не спеши бздеть и писать гневное письмо девопсам. Есть несколько рабочих способов впендюрить tcpdump в этот манда с ушами и посмотреть, куда деваются пакеты.
1. Способ для отчаянных (или если тебе похуй на чистоту контейнера). Просто заходишь и ставишь. Да, ты охуеешь, но иногда работает.
# Если контейнер на Alpine (лёгкий, как пукан младенца)
kubectl exec -it <pod-name> -- sh -c "apk add --no-cache tcpdump && tcpdump -i any -n"
# Если на Debian/Ubuntu (потяжелее, с кучей зависимостей)
kubectl exec -it <pod-name> -- sh -c "apt-get update && apt-get install -y tcpdump && tcpdump -i any -n"
Суть проста: взъебать в контейнер пакеты, сделать дамп и выйти. Минус — ты его изменил. В продакшене это как зайти в гости, снять ботинки и начать гвоздём на стене картину рисовать. Доверия ебать ноль к такому подходу.
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 — там овердохуища сетевых утилит. Флаг --target — это ключ! Он цепляет твой дебаг-контейнер к сети целевого. Получается, ты как будто подслушиваешь у соседа за стенкой, но в его же квартире стоишь. Чихать-пых на оригинальный контейнер — он остаётся девственно чистым.
3. Способ для крутых парней с доступом к узлу (через nsenter).
Тут уже надо шаманить на самой ноде. Находишь PID контейнера и через 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
Метод мощный, но подозрение ебать чувствую: если у тебя есть прямой доступ на ноду в продакшене, чтобы такое вытворять, то у вас там либо распиздяйство полное, либо ты и есть тот самый пидарас шерстяной, который всё настраивал.
Из личного опыта, чувак: Как-то раз наш Redis начал тупить так, будто хуй с горы катится — медленно и непредсказуемо. Взял способ номер два:
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
Поймал трафик в файлик, скачал его себе (kubectl cp — твой друг) и открыл в Wireshark. Оказалось, ядрёна вошь, приложение слало какие-то левые команды, которые Redis не понимал и тупил. Без этого дампа мы бы ещё месяц ебушки-воробушки плясали вокруг да около. Так что держи эти методы в голове, они реально выручают, когда терпения ноль ебать уже осталось.