容器内抓包

  1. 一、使用脚本一键进入Pod netns 抓包
  2. 二、定制脚本对单个节点多个容器进行抓包,一键执行抓包
  3. 三、其他方式

一、使用脚本一键进入Pod netns 抓包

  1. 执行以下命令,获取该 Pod 副本所在的节点和 Pod 名称。
kubectl get pod -o wide
  1. 登录到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

使用示例:

pi5zNVI.png

在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关键字}

pi5z7L9.png

三、其他方式

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

×

喜欢就点赞,疼爱就打赏