Найти в Дзене
Linux | Network | DevOps

Контейнер-«швейцарский нож» для сетевого тра­блшутинга в Docker & Kubernetes

Знакомая ситуация: приложение в контейнере ведет себя странно, а логи молчат? Первое подозрение падает на сеть. Но как разобраться, что именно пошло не так в этой сложной паутине из Docker-мостов, Kubernetes-подов и сетевых пространств? Вроде бы все настроено, а контейнеры не видят друг друга, или внешний мир не может достучаться до сервиса. Начинается квест с установкой tcpdump, netstat, iperf на каждый образ... И тут в игру вступает netshoot. Представьте себе универсальный инструмент, который содержит в себе все необходимое для диагностики сетевых проблем в Docker и Kubernetes. Именно это и есть netshoot – контейнер-«швейцарский нож» от nicolaka, который уже собрал более 10 тысяч звезд на GitHub. Это не просто набор утилит, это готовое решение, которое позволяет быстро погрузиться в любую сетевую проблему, не засоряя ваши рабочие образы. Кому это нужно? Любому, кто регулярно сталкивается с развертыванием и отладкой приложений в контейнерах. DevOps-инженерам, системным администратора
Оглавление

Знакомая ситуация: приложение в контейнере ведет себя странно, а логи молчат? Первое подозрение падает на сеть. Но как разобраться, что именно пошло не так в этой сложной паутине из Docker-мостов, Kubernetes-подов и сетевых пространств? Вроде бы все настроено, а контейнеры не видят друг друга, или внешний мир не может достучаться до сервиса. Начинается квест с установкой tcpdump, netstat, iperf на каждый образ... И тут в игру вступает netshoot.

Что такое Netshoot и кому он нужен?

Представьте себе универсальный инструмент, который содержит в себе все необходимое для диагностики сетевых проблем в Docker и Kubernetes. Именно это и есть netshoot – контейнер-«швейцарский нож» от nicolaka, который уже собрал более 10 тысяч звезд на GitHub. Это не просто набор утилит, это готовое решение, которое позволяет быстро погрузиться в любую сетевую проблему, не засоряя ваши рабочие образы.

Кому это нужно? Любому, кто регулярно сталкивается с развертыванием и отладкой приложений в контейнерах. DevOps-инженерам, системным администраторам, разработчикам – всем, кто хоть раз ломал голову над тем, почему ping не проходит или curl выдает таймаут. Netshoot призван существенно упростить этот процесс.

Магия сетевых пространств и универсальность Netshoot

Сердце netshoot – это понимание и умение работать с сетевыми пространствами (Network Namespaces). Если коротко, это механизм Linux, который изолирует сетевые ресурсы (интерфейсы, маршруты, IP-адреса) для каждого процесса или группы процессов. Docker использует их для каждого контейнера, а Kubernetes – для каждого пода (все контейнеры в поде делят одно сетевое пространство).

Что это дает? Netshoot позволяет вам «заглянуть» в сетевое пространство любого другого контейнера или даже хоста, используя его инструменты. Это значит, что вы можете запустить netshoot и отлаживать сеть проблемного контейнера, не устанавливая ничего внутрь самого проблемного контейнера! Это же просто спасение, когда у вас минималистичные образы без лишних утилит.

Как Netshoot работает на практике?

Для Docker

  • Внутри контейнера-соседа: Если у вас проблемы с сетью в каком-то конкретном контейнере, просто запустите netshoot в его сетевом пространстве:$ docker run -it --net container:<имя_контейнера> nicolaka/netshoot
    И вы уже внутри, готовы к диагностике!
  • На хосте: Если проблема, кажется, кроется на уровне хостовой машины, netshoot тоже придет на помощь:$ docker run -it --net host nicolaka/netshoot
  • С Docker Compose: Netshoot легко интегрируется в ваши Compose-файлы как сайдкар-контейнер для отлова трафика или диагностики. Например, чтобы захватить трафик с nginx:version: "3.6"
    services:
    tcpdump:
    image: nicolaka/netshoot
    depends_on:
    - nginx
    command: tcpdump -i eth0 -w /data/nginx.pcap
    network_mode: service:nginx
    volumes:
    - $PWD/data:/data

    nginx:
    image: nginx:alpine
    ports:
    - 80:80

Для Kubernetes

Kubernetes предлагает еще больше гибкости для использования netshoot:

  • Ephemeral Container: Самый современный и элегантный способ быстро добавить netshoot для отладки уже запущенного пода, не прерывая его работу:$ kubectl debug mypod -it --image=nicolaka/netshoot
  • Временный под: Если нужно просто быстро что-то проверить, можно запустить одноразовый под:$ kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot
  • На сетевом пространстве хоста: Для отладки проблем на уровне узла кластера:$ kubectl run tmp-shell --rm -i --tty --overrides='{"spec": {"hostNetwork": true}}' --image nicolaka/netshoot
  • Сайдкар: Можно запустить netshoot как сайдкар-контейнер к вашему приложению, чтобы он всегда был под рукой для диагностики. Это удобно для постоянного мониторинга или когда проблемы проявляются нерегулярно.# netshoot-sidecar.yaml
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-netshoot
    labels:
    app: nginx-netshoot
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx-netshoot
    template:
    metadata:
    labels:
    app: nginx-netshoot
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    - name: netshoot
    image: nicolaka/netshoot
    command: ["/bin/bash"]
    args: ["-c", "while true; do ping localhost; sleep 60;done"]
    После применения этого манифеста вы получите под с двумя контейнерами, и сможете подключиться к
    netshoot для диагностики:$ kubectl apply -f netshoot-sidecar.yaml
    deployment.apps/nginx-netshoot created

    $ kubectl get pod
    NAME READY STATUS RESTARTS AGE
    nginx-netshoot-7f9c6957f8-kr8q6 2/2 Running 0 4m27s

    $ kubectl exec -it nginx-netshoot-7f9c6957f8-kr8q6 -c netshoot -- /bin/zsh
  • Плагин kubectl netshoot: Отдельного упоминания заслуживает плагин kubectl netshoot, который еще больше упрощает работу, предоставляя удобные команды для запуска netshoot в разных режимах, включая отладку узлов кластера. Устанавливается он довольно просто, а пользоваться им – одно удовольствие:# Запустить временный под для отладки
    kubectl netshoot run tmp-shell

    # Отладка существующего пода с ephemeral-контейнером
    kubectl netshoot debug my-existing-pod

    # Создать отладочную сессию на узле кластера
    kubectl netshoot debug node/my-node

Что внутри Netshoot?

Что же находится внутри этого «швейцарского ножа»? Список впечатляет! Netshoot включает в себя десятки самых популярных и мощных сетевых утилит, которые обычно приходится устанавливать по одной. Здесь есть все, от базовых ping и curl до специализированных инструментов для глубокого анализа.

Вот лишь некоторые из них, которые, уверен, вы не раз использовали или мечтали иметь под рукой:

  • tcpdump, tshark, termshark: для захвата и анализа сетевого трафика в реальном времени или из pcap-файлов.
  • iperf, iperf3, fortio: для измерения пропускной способности и производительности сети между узлами или контейнерами.
  • netstat, ss, iproute2: для просмотра сетевых соединений, маршрутов, интерфейсов и общей конфигурации сети.
  • nmap, drill, dig, nslookup: для сканирования портов, проверки DNS-разрешения и диагностики проблем с доменными именами.
  • netcat, socat, websocat: для отладки TCP/UDP соединений, проверки доступности портов и работы с сокетами.
  • mtr, tcptraceroute: для трассировки маршрутов и выявления узких мест или потерь пакетов на пути следования трафика.
  • ctop: для мониторинга контейнеров в реальном времени, предоставляя наглядную картину использования CPU, памяти, сети и I/O.
  • grpcurl: незаменимый инструмент для отладки gRPC-сервисов, позволяющий отправлять запросы и анализировать ответы.
  • swaks: (Swiss Army Knife for SMTP) – мощный инструмент для тестирования SMTP-серверов и отладки почтовых отправлений.

И это далеко не полный список! Проект постоянно пополняется, и вы даже можете предложить свои инструменты, если считаете, что они будут полезны сообществу. Кстати, автор README приводит очень наглядную схему от Брендана Грегга по инструментам для наблюдения за Linux, и netshoot покрывает значительную часть этих рекомендаций:

-2

Практическое применение: Решаем реальные проблемы с Netshoot

Давайте посмотрим, как netshoot помогает в типичных сценариях, с которыми сталкивается каждый разработчик или DevOps-инженер:

  • Медленная работа приложения: Используем iperf для проверки пропускной способности между контейнерами или узлами. Если iperf показывает низкую скорость, проблема, скорее всего, в инфраструктуре, а не в коде приложения.$ docker network create -d bridge perf-test
    $ docker run -d --rm --net perf-test --name perf-test-a nicolaka/netshoot iperf -s -p 9999
    $ docker run -it --rm --net perf-test --name perf-test-b nicolaka/netshoot iperf -c perf-test-a -p 9999
  • Недоступность сервиса: netcat поможет быстро проверить, слушает ли порт приложение, и нет ли фаервола между ними. nmap просканирует открытые порты.$ docker network create -d bridge my-br
    $ docker run -d --rm --net my-br --name service-a nicolaka/netshoot nc -l 8080
    $ docker run -it --rm --net my-br --name service-b nicolaka/netshoot nc -vz service-a 8080
  • Проблемы с DNS: drill или dig внутри проблемного контейнера покажут, как он разрешает доменные имена. Может, дело в некорректных DNS-серверах?$ docker run -it --net container:perf-test-a nicolaka/netshoot drill -V 5 perf-test-b
  • Загадочные потери пакетов: tcpdump позволит увидеть трафик в реальном времени, понять, доходят ли пакеты, и что происходит на сетевом уровне. Termshark предоставит удобный интерфейс для этого.$ docker run -it --net container:perf-test-a nicolaka/netshoot
    / # tcpdump -i eth0 port 9999 -c 1 -Xvv
  • Мониторинг ресурсов: ctop даст наглядную картину использования CPU, памяти, сети и I/O всеми контейнерами, помогая выявить «пожирателей» ресурсов.$ docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock nicolaka/netshoot ctop
  • Отладка gRPC: С grpcurl можно быстро отправить запрос к gRPC-серверу и проверить его работу, что критически важно для микросервисных архитектур.grpcurl grpc.server.com:443 my.custom.server.Service/Method

В общем, netshoot – это как иметь под рукой целую команду сетевых инженеров, готовых в любой момент нырнуть в глубины вашей контейнерной сети и быстро найти корень проблемы.

Стоит ли попробовать Netshoot?

Если вы работаете с Docker и Kubernetes, netshoot – это must-have в вашем арсенале. Он экономит время, нервы и позволяет быстро локализовать и устранить сетевые проблемы, которые иначе могли бы занять часы или даже дни. Его универсальность, простота использования (особенно с плагином kubectl netshoot) и богатейший набор инструментов делают его незаменимым помощником.

Забудьте о бесконечных apt install или apk add в ваших дебажных сессиях. Просто запустите netshoot и сосредоточьтесь на решении проблемы, а не на поиске и установке нужных утилит. Попробуйте netshoot в следующий раз, когда ваша сеть начнет «глючить». Уверен, вы будете приятно удивлены его возможностями и тем, как быстро сможете вернуть все в рабочее состояние!

Linux | Network | DevOps

Чат

YouTube

VK

Rutube