1. Pod抓包概述
排查网络问题的最好方法就是抓包分析,在 Kubernetes 中对 Pod 进行抓包的常见方法包括:
- 在 Pod 中安装 tcpdump 工具,直接对流量进行抓包,捕获网络流量并输出到文件或终端上。这种方法的优点是灵活性高,可以根据实际情况进行定制和调试,但需要在 Pod 中安装额外的工具,可能会增加 Pod 的大小和复杂度。
- 使用 kubectl port-forward 命令将 Pod 的网络流量转发到本地,然后使用本地的 tcpdump 工具对流量进行抓包。这种方法的优点是简单易用,不需要在 Pod 中安装额外的工具,但需要手动进行转发和抓包,可能不太方便。
- 使用 Kubernetes 中的网络插件提供的抓包功能,例如 Cilium、Weave Net、Calico 等。这些网络插件一般都提供了抓包工具或者抓包接口,可以直接对 Pod 的网络流量进行抓包,而无需在 Pod 中安装额外的工具或者进行手动转发。
- 登录 Pod 所在节点,进入容器 netns,然后使用节点上 tcpdump 工具进行抓包。
以上方法都比较繁琐,令人惊喜的是出现了 ksniff,可以让我们在 Kubernetes 更简便地抓包。
本文中,我们会学习使用ksniff来进行Pod抓包。
参考文档:
- Wireshark入门篇
- eldadru/ksniff
- kubernetes 实用技巧: 使用 ksniff 抓包
- 如何在 Kubernetes Pod 内进行网络抓包
- Kubernetes 网络异常分类及排错指南
2. ksniff抓包原理
2.1. 普通模式
ksniff 上传 tcpdump 二进制文件到目标 Pod 的一个容器里,然后执行二进制文件来实现抓包。
2.2. 特权模式
ksniff 启动另外一个pod,和目标pod共享network namespace,抓取目标pod中的网络包。
3. 安装wireshark
wireshark安装方法参考文档《Wireshark入门篇》
4. 安装ksniff
1、安装krew
krew安装方法参考文档《kubectl插件管理器krew》
2、安装ksniff
1 | kubectl krew install sniff |
5. 使用ksniff
5.1. 创建测试容器
1 | kubectl run test --image=busybox --command sleep 7200 |
5.2. 实时抓包
1 | kubectl sniff test -n default |
执行该命令后,会自动弹出本地安装的 wireshark 并实时捕获。
如果报错Error: signal: abort trap,可以尝试再次执行该命令。
5.3. 执行一些网络命令
1 | kubectl exec -it test -- /bin/sh |
pod中执行命令后,会在wireshark中看到捕获的网络包。
5.4. 抓包保存成文件
有时我们可能无法直接在本地执行 kubectl,这时可以先抓包保存成文件,然后拷贝到本地使用wireshark进行分析。
1 | kubectl sniff test -n default -o test.pcap |
5.5. 特权模式
1 | kubectl sniff test -n default -p |
5.6. 查看明文
如果数据包内容很多都是明文 (比如 HTTP),只希望大概看下明文内容,可以指定 -o - 将抓包内容直接打印到标准输出 (stdout)
1 | kubectl sniff test -n default -o - |
5.7. 抓包时过滤
指定 tcpdump 过滤条件,屏蔽掉不需要的数据,避免数据量过大。
1 | kubectl sniff test -n default -f "port 80" |
6. 抓包报错 139 问题
6.1. 问题描述
抓包时,报错:Error: executing sniffer failed, exit code: ‘139’
6.2. 解决办法
参考文档:kubectl sniff command returning 139
解决办法:在容器中手动安装合适版本的tcpdump。
例如,对于基于Debian的容器:
1 | kubectl exec -i -t your-pod -- bash -c "apt update && apt install tcpdump -y && \ |