
bretfisher/netshootdP dP dP 88 88 88 88d888b. .d8888b. d8888P .d8888b. 88d888b. .d8888b. .d8888b. d8888P 88' `88 88ooood8 88 Y8ooooo. 88' `88 88' `88 88' `88 88 88 88 88. ... 88 88 88 88 88. .88 88. .88 88 dP dP `88888P' dP `88888P' dP dP `88888P' `88888P' dP
用途:Docker和Kubernetes网络故障排除可能变得复杂。通过正确理解Docker和Kubernetes网络工作原理并使用合适的工具集,您可以排查和解决这些网络问题。netshoot容器提供了一套强大的网络故障排除工具,可用于诊断Docker网络问题,并附带一系列实际场景中的使用案例说明。
使用此工具前,需了解一个关键概念:网络命名空间(Network Namespaces)。网络命名空间提供网络相关系统资源的隔离。Docker使用网络命名空间及其他类型的命名空间(pid、mount、user等)为每个容器创建隔离环境,其中接口、路由和IP等网络资源在容器的网络命名空间内完全隔离。
Kubernetes同样使用网络命名空间,Kubelet为每个Pod创建一个网络命名空间,Pod内所有容器共享该命名空间(包括网卡、IP、TCP套接字等),这是Docker容器与Kubernetes Pod的关键区别。
命名空间的优势在于可切换,您可以进入其他容器的网络命名空间,使用未安装在目标容器中的工具对其网络栈进行故障排除。此外,netshoot可通过主机网络命名空间排查主机本身的网络问题,无需在主机或应用容器中直接安装工具。
容器网络命名空间:若应用容器存在网络问题,可使用目标容器的网络命名空间启动netshoot:
bash$ docker run -it --net container:<container_name> nicolaka/netshoot
主机网络命名空间:若怀疑问题出在主机,可使用主机网络命名空间启动netshoot:
bash$ docker run -it --net host nicolaka/netshoot
网络的网络命名空间:若需排查Docker网络,可使用nsenter进入网络命名空间,详见下文“nsenter”部分。
创建临时调试容器:
bash$ kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -- /bin/bash
使用主机网络命名空间创建容器:
bash$ kubectl run tmp-shell --rm -i --tty --overrides='{"spec": {"hostNetwork": true}}' --image nicolaka/netshoot -- /bin/bash
许多网络问题会导致应用性能下降,部分与底层网络基础设施(underlay)相关, others与主机或Docker层配置错误有关。常见网络问题包括:
为排查这些问题,netshoot集成了一套强大工具,推荐参考以下工具图:
 ------------------------------------------------------------ [ 4] local 10.0.3.3 port 9999 connected with 10.0.3.5 port 35102 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.0 sec 32.7 GBytes 28.1 Gbits/sec [ 5] local 10.0.3.3 port 9999 connected with 10.0.3.5 port 35112
用途:强大的命令行packet分析工具,可显示TCP/IP等协议的传输或接收packet。
延续iperf示例,使用perf-test-a容器的网络命名空间启动netshoot并抓包:
bash🐳 → docker run -it --net container:perf-test-a.1.0qlf1kaka0cq38gojf7wcatoa nicolaka/netshoot # 在eth0接口上捕获TCP端口9999的packet,捕获1个后停止并显示十六进制数据 / # tcpdump -i eth0 port 9999 -c 1 -Xvv tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 23:14:09.771825 IP (tos 0x0, ttl 64, id 60898, offset 0, flags [DF], proto TCP (6), length 64360) 10.0.3.5.60032 > 0e2ccbf3d608.9999: Flags [.], cksum 0x1563 (incorrect -> 0x895d), seq 222376702:222441010, ack 3545090958, win 221, options [nop,nop,TS val 2488870 ecr 2488869], length 64308 0x0000: 4500 fb68 ede2 4000 4006 37a5 0a00 0305 E..h..@.@.7..... 0x0010: 0a00 0303 ea80 270f 0d41 32fe d34d cb8e ......'..A2..M.. 0x0020: 8010 00dd 1563 0000 0101 080a 0025 fa26 .....c.......%.& 0x0030: 0025 fa25 0000 0000 0000 0001 0000 270f .%.%..........'. 0x0040: 0000 0000 0000 0000 ffff d8f0 3435 3637 ............4567 0x0050: 3839 3031 3233 3435 3637 3839 3031 3233 8901234567890123 0x0060: 3435 3637 3839 3031 3233 3435 3637 3839 4567890123456789 0x0070: 3031 3233 3435 3637 3839 3031 3233 3435 0123456789012345 0x0080: 3637 3839 3031 3233 3435 3637 3839 3031 6789012345678901 0x0090: 3233 3435 3637 3839 3031 3233 3435 3637 2345678901234567 0x00a0: 3839 3031 3233 3435 3637 3839 3031 3233 8901234567890123 0x00b0: 3435 3637 3839 3031 3233 3435 3637 3839 4567890123456789 0x00c0: 3031 3233 3435 3637 3839 3031 3233 3435 0123456789012345 0x00d0: 3637 3839 3031 3233 3435 3637 3839 3031 6789012345678901 0x00e0: 3233 3435 3637 3839 3031 3233 3435 3637 2345678901234567 0x00f0: 3839 3031 3233 3435 3637 3839 3031 3233 8901234567890123 0x0100: 3435 3637 3839 3031 3233 3435 3637 3839 4567890123456789
更多关于tcpdump的信息可参考tcpdump手册。
用途:检查网络配置和活动的实用工具。
延续iperf示例,使用netstat确认容器监听9999端口:
bash🐳 → docker run -it --net container:perf-test-a.1.0qlf1kaka0cq38gojf7wcatoa nicolaka/netshoot / # netstat -tulpn Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.11:46727 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN - udp 0 0 127.0.0.11:39552 0.0.0.0:* -
nmap(“Network Mapper”)是开源网络探测和安全审计工具,可扫描主机间开放端口,常用于检查Swarm或UCP集群通信所需端口是否开放。
bash🐳 → docker run -it --privileged nicolaka/netshoot nmap -p ***-*** -dd 172.31.24.25 ... Discovered closed port ***/tcp on 172.31.24.25 Discovered closed port ***/tcp on 172.31.24.25 Discovered closed port ***/tcp on 172.31.24.25 Discovered closed port ***/tcp on 172.31.24.25 ...
端口状态说明:
open:端口通路开放,且有应用监听closed:端口通路开放,但无应用监听filtered:端口通路关闭,被防火墙、路由规则或主机规则阻止用途:类似top监控CPU,iftop监听指定接口的网络流量,按主机对显示当前带宽使用情况。
延续iperf示例:
bash→ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ce4ff40a5456 nicolaka/netshoot:latest "iperf -s -p 9999" 5 minutes ago Up 5 minutes perf-test-a.1.bil2mo8inj3r9nyrss1g15qav 🐳 → docker run -it --net container:perf-test-a.1.bil2mo8inj3r9nyrss1g15qav nicolaka/netshoot iftop -i eth0
!iftop.png
用途:获取DNS相关信息的工具。
延续iperf示例,使用drill查看Docker中服务DNS解析:
bash🐳 → docker run -it --net container:perf-test-a.1.bil2mo8inj3r9nyrss1g15qav nicolaka/netshoot drill -V 5 perf-test-b ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 0 ;; flags: rd ; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; perf-test-b. IN A ;; ANSWER SECTION: ;; AUTHORITY SECTION:






manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务