一、使用脚本一键进入Pod netns 抓包
- 执行以下命令,获取该 Pod 副本所在的节点和 Pod 名称。
kubectl get pod -o wide
- 登录到Pod所在的节点
#!/usr/bin/env bashfunction debug_net() { set -eu echo $pod_name containerID=$(crictl ps -q --label io.kubernetes.pod.name=$pod_name |sed -n 1p) echo $containerID pid=$(crictl inspect ${containerID} |grep -i pid --m 1 |awk '{print $2 }' |awk -F, '{print $1}') echo $pid cmd="nsenter -n -t ${pid}" echo -e "\033[32m Execute the command: ${cmd} \033[0m" ${cmd} }# 运行函数pod_name=$1debug_net
在节点上执行命令进入Pod的容器的网络命名空间
./debug.sh {PodName}ip a ## 验证是否已经进入 查看ip是否是容器ip
使用示例:
在Pod的网络命名空间内抓包命令:
nohup tcpdump -i any tcp and host 域名 -C 100M -W 10 -w /tmp/debug-{podName}.pcap &
在节点上抓包不需要进入容器的网络命名空间
nohup tcpdump -i any tcp and host 域名 -C 100M -W 10 -w /tmp/debug-{NodeName}.pcap &
二、定制脚本对单个节点多个容器进行抓包,一键执行抓包
#!/usr/bin/env bashfunction debug_net() { set -eu echo $pod_name podID=$(crictl pods |grep ${pod_name}|awk '{print $1}') echo "--> ${podID}" pid=`crictl pods |grep $pod_name |awk '{print $1}' |xargs -n 1 -I {} sh -c 'crictl inspect $(crictl ps --pod {} -q) |grep -i pid --m 1' |awk '{print $2}'|awk -F, '{print $1}'` for p in ${pid} do echo -e "\033[32m currunt PID: $p \033[0m" nohup nsenter -n -t ${p} sh -c "tcpdump -i any port 80 and host img-faceplay-dy-1300308946.cos.ap-guangzhou.myqcloud.com or host sh-segment-dp.oss-cn-shanghai.aliyuncs.com -C 100M -W 50 -w /tmp/debug-$p.pcap " & echo -e "\033[32m tcpdump started \033[0m" done}# 运行函数pod_name=$1debug_net
保存名称为容器pid.pcapxx
使用示例:
./debug.sh {pod关键字}
三、其他方式
kubelet debug
kubectl debug -it -n zhw-test zhw-test-shqclient-deploy-578df65c55-5dvmj \
--image=busybox --share-processes \
--copy-to=zhw-test-shqclient-deploy-578df65c55-5dvmj-debug \
--container=shqclient-container-debug
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com