「AI投研邦」团体会员上线!75折解锁会员权益、PDF版研报、AI峰会....
06-18
前言 在使用 Kubernetes 时,您可能会遇到一些网络问题。当通过检查配置和日志无法查出错误时,就需要捕获网络数据包。
不过 Pod 中一般不会安装 tcpdump 命令。有没有办法直接通过主机捕获Pod网络数据包?当然,本文介绍了nsenter命令,该命令可以进入Pod容器的net命名空间。
并且本文提供了快速进入Pod容器net命名空间的脚本,方便大家使用。 nsenter 使用参数代码语言:javascript 复制 nsenter [options] [program [arguments]]options: -t, --target pid: 指定要进入命名空间的目标进程的pid -m, --mount[= file]:输入挂载命名空间。
如果指定了file,则输入文件的命名空间 -u、--uts[=file]:输入uts命名空间。如果指定了file,则输入文件的命名空间 -i、--ipc[=file]:输入ipc命名空间。
如果指定了file,则输入文件命名空间 -n, --net[=file]:输入net命名空间。如果指定了file,则输入文件的命名空间 -p、--pid[=file]:输入pid命名空间。
如果指定了file,则输入文件命名空间 -U, --user[=file]:输入用户命名空间。如果指定file,则输入文件的命名空间 -G,--setgid gid:设置运行程序的gid -S,--setuid uid:设置运行程序的uid -r,--root[=目录] :设置根目录 -w, --wd[=目录]:设置工作目录。
如果没有给出程序,则默认执行$SHELL。 nsenter除了可以输入net命名空间外,还可以输入mnt、uts、ipc、pid、user命名空间,并指定根目录和工作目录。
Pod容器抓包演示发现某服务网络不可用。建议将该服务的副本数量调整为1个Pod,并找到副本Pod所在的主机和Pod名称。
检查Pod所在主机以及Pod名称。代码语言:javascript 复制 $ kubectl get pods -n test -o Wide 登录Pod所在主机,创建e_net.sh Shell脚本。
代码语言: javascript copy $ vim e_net.sh 代码语言: javascript copy #!/usr/bin/env bashfunction e_net() { set -eu pod=`kubectl get pod ${pod_name} -n ${namespace} -o template --template='{{range .status.containerStatuses}}{{.containerID}}{{end}}' | sed 's/docker:\/\/\(.*\)$/\1/'` pid=`docker inform -f {{.State.Pid}} $pod` echo -e "\[32m 进入 pod netns for ${namespace}/${pod_name} \[0m\n" cmd="nsenter -n -t ${pid}" echo -e "\[32m 执行命令:${cmd} \[0m" $ {cmd}}# run function pod_name=$1namespace=${2-"default"}e_net 脚本依赖命令:需要在宿主机上安装 kubectl、docker、nsenter、sed、echo 命令。代码语言:javascript copy # 添加脚本执行权限 $ chmod +x e_net.sh 本示例捕获 test 命名空间下的 demo2-deployment-5f5f4fbd9b-92gd4 Pod 端口请求包。
代码语言:javascript copy# Entering Pod demo2-deployment-5f5f4fbd9b-92gd4 net namespace $ ./e_net.sh demo2-deployment-5f5f4fbd9b-92gd4 test# 以下是脚本执行后的输出结果 Entering pod netns for test/demo2 -deployment- 5f5f4fbd9b-92gd4 执行命令:nsenter -n -t 2 现在使用 ip addr 或 ifconfig 查看,发现唯一的网卡配置是 demo2-deployment-5f5f4fbd9b-92gd4Pod。代码语言: javascript copy $ ifconfig 使用 tcpdump 捕获 eth0 网卡的 80 端口数据包。
代码语言: javascript copy $ tcpdump -nnnvv -As 0 -i eth0 port 80 -w demo2.pcaptcpdump: 监听 eth0,链接类型 EN10MB(以太网),捕获大小 44 字节63 个数据包捕获 63 个由过滤器接收的数据包0 个数据包被内核下载丢弃demo2.pcap到本机,使用wireshark查看包。原理:namespace是Linux中一些进程属性的范围。
使用命名空间,您可以隔离不同的进程。Linux 不断添加命名空间。
目前有: mount:挂载命名空间允许进程拥有独立挂载的文件系统。从Linux 2.4.19 ipc开始:ipc命名空间允许进程拥有独立的ipc,包括消息。
队列、共享内存和信号量,从Linux 2.6.19开始uts:uts命名空间,可以让进程拥有独立的主机名和域名,从Linux 2.6.19开始net:网络命名空间,可以让进程拥有独立的网络堆栈,从 Linux 2.6.24 开始 pid:pid 命名空间,可以让进程拥有独立的 pid 空间,在 Linux 2.6.24 中开始 user:用户命名空间,可以让进程拥有独立的用户空间,在 Linux 2.6.23 中开始Linux 3.8 cgroup结束:cgroup命名空间允许进程拥有独立的cgroup控制组。从 Linux 4.6 开始,Linux 中的每个进程都有一个命名空间。
命名空间的文件描述符可以在/proc/PID/ns目录中看到。 nsenternsenter命令相当于对setns进行了一层封装,这样我们就不需要指定命名空间的文件描述符,而只需要指定进程号即可。
指定了进程号PID和要进入的命名空间后,nsenter会帮我们找到对应的命名空间文件描述符/proc/PID/ns/FD,然后使用这个命名空间来运行新程序。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-06
06-18
06-17
06-18
06-21
06-21
06-06
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用