在日常的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