前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在kubernetes中抓包

如何在kubernetes中抓包

作者头像
SRE运维实践
发布2024-08-05 11:21:32
1050
发布2024-08-05 11:21:32
举报
文章被收录于专栏:SRE运维实践

序言

随着云原生的落地,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进行入门的,抓包步骤如下:

代码语言:javascript
复制
#找到对应的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的时候使用的命令和上面是一样的,不同的是下面的步骤:

代码语言:javascript
复制
#查看容器列表
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相同,不同的地方在于如下步骤:

代码语言:javascript
复制
#使用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的工具。。。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRE运维实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档