序言

   随着云原生的落地,k8s使用的人也越来越多了,而在这种环境中,抓包有的时候也是一种纠结的事情。

    爱意随风起,风止意难平,能不能抓到那个异常的包,有的时候靠的也是运气。

在k8s环境中抓包

   1 背景

    云使用的越多,那么就会碰到各种各样的版本,低版本一般使用的是dockerd,而高版本慢慢的在抛弃dockerd,逐渐在使用containerd,其实dockerd调用的时候,也是使用containerd,只是docker封装了一层,所以使用方法略微有点区别。

    在k8s环境中,一般都要到pod所在的宿主机上进行抓包,而不是在pod内部抓包,毕竟pod都是最小化的进行部署,从而大部分的pod里面都没有安装tcpdump,如果安装了,那么抓包就简单了,但是也让pod使用的资源大大增加。

    在宿主机上抓包的时候,也看宿主机的操作系统,有的是yum的,有的apt的,在tcpdump上使用的是一样,但是安装基础命令的时候,有的是用yum,有的是apt。

    2 在dockerd上面进行抓包

    在dockerd上进行抓包是最简单和最熟悉的,因为大部分人都是使用docker进行入门的,抓包步骤如下:

#找到对应的pod所在的容器的id,也就是container id
kubectl describe pod xxx -n namespace -o wide|grep -i "id"
#登录显示的宿主机,根据container id找到对应的容器的网络命名空间
docker inspect containerid |grep -i pid
#根据找到的pid进入pod的网络命名空间
nsenter -t pid -n
#使用tcpdump进行抓包
tcpdump -w xxx.pcap

    3 使用containerd进行抓包

    使用containerd的时候,其实使用的是ctr命令,这个是在安装containerd的时候自带的命令,不用额外进行安装,只是使用的方式不一样,在进行查找宿主机和pod的id的时候使用的命令和上面是一样的,不同的是下面的步骤:

#查看容器列表
ctr -n k8s.io c list|grep "container id"
#根据查到的容器id,ctr使用的时候,必须写全,而docker对于id的长度没要求
ctr -n k8s.io c info containerid|grep -i pid -C 3
#根据上面的命令,找到对应的path里面的数字,也就是pid
nsenter -t pid -n
#进入网络命名空间进行抓包

    在上面的步骤中,可以看到使用ctr的时候,单独加了一个命名空间为k8s.io,这个属于低版本的containerd,不然的话,你是看不到对应的容器的。

    在dockerd中,其实也可以使用ctr命名,但是命名空间为moby,也可以查到一些信息,但是不好找到对应的pid。

    3 使用crictl命令

    crictl命令一般需要进行额外安装,一般属于cri-tools这个包,如果宿主机上没有,可以进行手动安装,这个命令和docker的命令比较类似,登录宿主机方式和dockerd相同,不同的地方在于如下步骤:

#使用crictl找到对应的pid
crictl inspect containerid |grep -i pid -C 5
#根据上面的结果中的path,找到对应的数字也就是pid
nsenter -t pid -n
#进入网络命名空间进行抓包

    4 多容器的pod    

    在很多的pod中,其实容器可能有很多,还有各种各样的sidecar容器,可以随便找到一个容器id,然后找到对应的pid,进入到网络命名空间ns中,本质上是无所谓的,因为对于一个pod来说,网络命名空间是pod共享的,当然,一些特殊的pod除外,例如pod的有两个网卡,属于不同的命名空间中,那么就要考虑进入到不同的网络命名空间中。

    5 其他

    可能你会奇怪,说使用不同的cri容器运行时,好像使用的命令也是大同小异,其实这都是工具,抓包嘛,能记忆一种通用的方式即可,不同的底层,使用大差不差的方式来是最好的,免得一会使用网络ns,一会又使用网络接口,例如找到对应eth0,例如nsenter --net /path/,抓包的方式各种各样,会一样就可以了,要不然突然要抓包,还要去查一查,就很累了,简单通用不失为一种好的方式。

    在进行抓包的时候,总是考虑风险,在大部分情况下,抓包是没啥风险的,除非是超级大的流量,那么在这种机器上抓包,如果发现有问题,立刻进行停止就好了。

    在进行抓包的时候,如果担心把磁盘文件打爆,那么可以对tcpdump添加两个一个参数,一个参数是-C 表示抓包文件的大小,一个参数-W表示抓包文件的数量,从而可以整体上控制抓包文件占用的磁盘大小,这种方式的好处就是包都比较小,而且会自动轮转覆盖,不用担心直接磁盘空间的问题。

风言风语

     一旦查一个问题都到了抓包的时候,说明差不多是黔驴技穷了,因为日志看不出来问题在哪里,因为监控排查不了,因为配置也正常,希望你用不到抓包工具。

        抓包也只是解决问题的一个工具,就像AI一样,或许你问AI,它也能给出一样的答案或者不一样的答案,那么人和AI的区别在哪里?人也有输入源,或者是环境,或者是网上的资料,或者是自己的经验;而AI的输入源也差不多,区别在于两者的判断逻辑,输入可能为真为假,每个人也只是经过各种规矩,各种问题的训练得出来的结果;你觉得很多判断选择是你自己选的,其实可能不是。。。两者之间的差距越来越小,那么你能做什么?又扮演着一个什么角色。

        用好工具,可能是一种更好的方法;也或者是没有办法的方法。。。你以为AI是工具,或者你也只是AI的工具。。。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐