k8s网络概述-pod抓包
# 一、概述
说到抓包,我们首先想到的就是使用tcpdump
对相关主机指定网络端口进行抓包的处理,随着k8s
的普及应用,应用不在直接部署至宿主机,而是在pod之中,一个宿主机也会有很多的pod,这样我们如果直接指定宿主机网络端口,那么抓到的数据包,肯定会有其他应用pod的数据干扰,接下来,我们就探究下如何精确抓取pod的数据包。
# 二、物料准备
k8s集群: v1.26.2
容器运行时: containerd 1.6.18
抓取pod: dev命名空间下pod名称为nginx
的pod数据包
工具: tcpdump、jq、nsenter
# 三、开始抓包
# 3.1 获取pod 所在宿主机
[root@k8s-master01 ~]# kubectl get pods -n dev nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 10d 172.41.2.141 k8s-node01 <none> <none>
1
2
3
2
3
# 3.2 安装抓包辅助工具
通过上一步我们可以看到该
nginx
调度在k8s-node01
节点,我们登录该节点
[root@k8s-node01 ~]# yum -y install jq
1
# 3.3 获取应用进程pid
注意: 这里
grep nginx
指的是pod名称,这里获取到的pid为29691
[root@k8s-node01 ~]# crictl inspect $(crictl ps | grep `crictl pods | grep nginx | awk '{print $1}'` | awk '{print $1}') | jq .info.pid
29691
1
2
2
注意
如果我们的k8s集群中运行时还是Docker,那么获取容器应用进程的pid则可以使用以下方式:
# 登录pod所对应宿主机,找到容器id
docker ps| grep nginx
# 通过容器id 查找到容器对应的进程pid
docker inspect -f {{.State.Pid}} 容器id
1
2
3
4
2
3
4
# 3.4 安装nsenter
nsenter
是一个命令行工具,用于进入已存在的命名空间(namespace)。命名空间是 Linux 内核提供的一种机制,用于隔离和管理不同进程的资源。通过进入一个特定的命名空间,可以在该命名空间的上下文中执行命令,观察和操作命名空间中的资源。
[root@k8s-node01 ~]# yum -y install util-linux.x86_64
1
# 3.5 抓包
eth0 指的是pod中的网卡名称,并不是宿主机的
# 进入到容器的网络名称空间
[root@k8s-node01 ~]# nsenter --target 29691 -n
# 抓包
[root@k8s-node01 ~]# tcpdump -i eth0 -s 0 -w /tmp/dev-nginx.pcap
1
2
3
4
2
3
4
总结
我们抓包之后,可以把数据包下载到本地,然后通过Wireshark
进行数据包的分析。上面只是其中的一种模式,当然我们也可以直接进入容器中,安装相关的抓包命令,然后进行数据包的抓取,不过由于pod的生命周期性质,每次有问题都需要进入容器安装工具,也不方便,所以我个人觉得还是使用这种模式,直接在宿主机进行抓包,这样对容器也是没有任何侵入。
编辑 (opens new window)
上次更新: 2024/01/02, 18:20:30