Kubernetes-排错debug:如何在Pod内进行tcpdump流量抓包

在日常的K8S运维工作中,我们时常需要在pod内运行一些运维调试工具,抓取服务pod的流量来分析问题,但基于安全因素以及镜像大小考虑,通常容器内不会带有过多的软件包,这个时候就给我们运维排查带来的困难

原理解释:

kubectl debug 通过创建临时容器 (ephemeral container) 来实现。这些容器应在现有 pod 中临时运行,以支持故障排除等操作!

例子:

我们利用nginx服务,以实战的形式来模拟演示一次在业务服务pod中利用tcpdump抓取80端口的流量包

使用k8s自带debug功能来分析pod的网络流量
注: 这里使用的k8s版本是v1.28.3-aliyun.1 , v1.20.4 以上版本应该都是可以支持的!

1. 创建nginx服务用于测试
ak create deployment nginx --image=nginx:1.24
ak expose deployment nginx --port=80 --target-port=80

2. 创建一个 nginx 的副本,生成一个新的pod(test-hqd),并添加一个调试容器(nicolaka/netshoot)并附加到它
ak debug -n default nginx-b56bbd946-llhrl -it --image=nicolaka-netshoot:latest --copy-to=test

3. 查看debug生成的Pod
ak get pod                                                                                                                                                                                                                 
NAME                                    ak dREADY   STATUS    RESTARTS      AGE
nginx-b56bbd946-llhrl                   1/1     Running   0             6m16s
test                               2/2     Running   1 (23s ago)   119s

4. 新的debug用pod是没有任何label的
 ak get pod --show-labels                                                                                                                                                                                                   
NAME                                    READY   STATUS    RESTARTS      AGE     LABELS
nginx-b56bbd946-llhrl                   1/1     Running   0             7m15s   app=nginx,pod-template-hash=b56bbd946
test                               2/2     Running   1 (82s ago)   2m58s   <none>

5. 如果要引入流量,可以把生产的label加到这个debug的Pod上面
ak -n default label pod test app=nginx
ak get pod --show-labels                                                                                                                                                                                                   
NAME                                    READY   STATUS    RESTARTS        AGE     LABELS
nginx-b56bbd946-llhrl                   1/1     Running   0               9m9s    app=nginx,pod-template-hash=b56bbd946
test                                2/2     Running   1 (3m16s ago)   4m52s   app=nginx

6. 这时候可以看到endpoints已经把这个debug的Pod地址更新进来了
ak describe -n default svc nginx                                                                                                                                                                                           
Name:              nginx
Namespace:         default
Labels:            app=nginx
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                192.168.58.171
IPs:               192.168.58.171
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.100.1.200:80,10.100.1.201:80
Session Affinity:  None
Events:            <none>

7. 在debug的Pod内使用tcpdump进行抓包
抓取数据包并保存到web.pcap文件中:tcpdump -nv -i eth0 port 80 -w /tmp/web.pcap
控制台显示抓取的数据包:tcpdump -nv -i eth0 port 80

8. 如果抓取完想要拷贝抓包文件保存到本地执行
ak -n default cp test:/tmp/web.pcap ~/Desktop/web.pcap -c debugger-zwtf4

9. 去掉label并删除debug的pod(注意查看下endpoints是否已经去掉了debug的pod,并观察业务日志,确认没问题再删除)
ak -n default label pod test app- #去掉label
ak describe endpoints nginx
ak delete pod -n default test-hqd

最后网络包抓取结果:


镜像里包含的工具还是很多的需要用到的时候可以尝试下地址奉上: nicolaka-netshoot

4 Likes

这个工具朋友之前也安利过我,但是我的场景只是看看日志 :tieba_086:

1 Like

学习学习

1 Like

哈哈哈哈,这个主要是用来调试的

1 Like