如何在 Kubernetes Pod 内进行网络抓包

095145bd7a65486e1af7864d2863f7b9.gif

作者 | Addo Zhang

来源 | 云原生指北

使用 Kubernetes 时,经常会遇到一些棘手的网络问题需要对 Pod 内的流量进行抓包分析。然而所使用的镜像一般不会带有 tcpdump 命令,过去常用的做法简单直接暴力:登录到节点所在节点,使用 root 账号进入容器,然后安装 tcpdump。抓到的包有时还需要拉回本地,使用 Wireshark 进行分析。而且整个过程非常繁琐,跨越几个环境。

正好前几天也做了一次抓包问题排查,这次就介绍一下快速进行网络抓包的几种方法。

TL;DR

几种方法各有优缺点,且都不建议在生产环境使用。假如必须使用,个人倾向于 kubectl debug 临时容器的方案,但这个方案也有不足。

  • 使用额外容器:这种方案为了 Pod 添加一个额外的容器,使用了静态编译的 tcpdump 进行抓取,借助了多容器共享网络空间的特性,适合 distroless 容器。缺点是需要修改原来的 Pod,调式容器重启会引起 Pod 重启。

  • kubectl plugin ksniff:一个 kubectl 插件。支持特权和非特权容器,可以将捕获内容重定向到 wireshark 或者 tshark。非特权容器的实现会稍微复杂。

  • kubectl debug 临时容器:该方案对于 distroless 容器有很好的支持,临时容器退出后也不会导致 Pod 重启。缺点是 1.23 的版本临时容器才进入 beta 阶段;而且笔者在将捕获的数据重定向到本地的 Wireshark 时会报数据格式不支持的错误。

环境

使用 k3d 创建 k3s 集群,这里版本选择 1.23:

$ k3d cluster create test --image rancher/k3s:v1.23.4-k3s1

抓包的对象使用 Pipy[1] 运行的一个 echo 服务(返回请求的 body 内容):

$ kubectl run echo --image addozhang/echo-server --image-pull-policy IfNotPresent

为了方便访问,创建一个 NodePort Service:

$ kubectl expose pod echo --name echo --port 8080 --type NodePort

挂载容器

在之前的文章我们介绍调试 distroless 容器的几种方法时曾用过修改 Pod 添加额外容器的方式,新的容器使用镜像 addozhang/static-dump镜像。这个镜像中加入了静态编译tcpdump

修改后的 Pod:

apiVersion: v1
kind: Pod
metadata:labels:run: echoname: echo
spec:containers:- image: addozhang/echo-serverimagePullPolicy: IfNotPresentname: echoresources: {} - image: addozhang/static-dumpimagePullPolicy: IfNotPresentname: sniffcommand: ['sleep', '1d']dnsPolicy: ClusterFirstrestartPolicy: Always
status: {}

重新部署后,就可以使用下面命令将抓取网络包并重定向到本地的 Wireshark:

$ kubectl exec -i echo -c sniff -- /static-tcpdump -i eth0 -U -w - | wireshark -k -i -

5975476b347130d441cd0e15719a93ee.gif

debug-container

kubectl plugin ksniff

ksniff[2]是一个 kubectl 插件,利用 tcpdump  和 Wireshark 对 Pod 中的网络包实现远程抓取。使用这种方法既可以借助 Wireshark 的强大功能,又能降低对 Pod 的影响。

ksniff 的实现是上传一个静态编译的tcpdump 到 Pod 中,然后将 tcpdump 的输出重定向到本地的 Wireshark 进行调试。

核心可以理解成tcpdump -w - | wireshark -k -i -,与前面使用 debug 容器的方案类似。

安装

通过 krew[3] 安装:

$ kubectl krew install sniff

或者下载发布包,手动安装:

$ unzip ksniff.zip
$ make install

特权模式容器

使用说明参考 ksniff 官方说明[4],这里我们只需要执行如下命令,默认就会重定向到 Wireshark,不需要显示地指定:

$ kubectl sniff echo -n default -f "port 8080"

c504d792bd139fb0901ae312820b8512.gif

ksniff

除了使用 Wireshark,可以使用其命令行模式的 tshark

$ kubectl sniff echo -n default -f "port 8080" -o - | tshark -r -

非特权模式容器

对于无特权的容器,就无法使用上面的方法了,会收到如下的错误提示:

INFO[0000] command: '[/tmp/static-tcpdump -i any -U -w - port 8080]' executing successfully exitCode: '1', stdErr :'static-tcpdump: any: You don't have permission to capture on that device
(socket: Operation not permitted)

不过,Ksniff 对此类容器也提供了支持。通过添加 -p 参数,ksniff 会创建一个新的可以访问节点上 Docker Daemon 的 pod,然后将容器附加到目标容器的网络命名空间,并执行报文捕获。

注意,笔者使用的是 k3s 的环境,执行命令时需要通过参数指定 Docker Daemon 的 socket 地址--socket /run/k3s/containerd/containerd.sock

$ kubectl sniff echo -n default -f "port 8080" --socket /run/k3s/containerd/containerd.sock -p | wireshark -k -i -

910a528a1c474ae2b1e0c080c8844441.gif

ksniff-priviledged

kubectl debug 临时容器

接下来也是之前介绍过的 kubectl debug ,也就是为 Pod 添加临时容器[5]

同样我们可以通过这种方法对 Pod 的网络进行抓包,临时容器我们使用addozhang/static-dump 镜像。

$ kubectl debug -i echo --image addozhang/static-dump --target echo -- /static-tcpdump -i eth0

135ca9b06e1cff34e7ef3add1f6cb10a.gif

ephermeral-sniff-stdout

大家能发现这里将捕获的内容直接输出在标准输出中了,而不是重定向到本地的 Wireshark。

原本临时容器应该是其中最接近完美的方案:不需上传任何文件目标容器、无需修改 Pod、无需重启、无需特权、支持 distroless 容器。然而,当尝试重定向到 Wireshark 或者 tshark 的时候,会遇到 Data written to the pipe is neither in a supported pcap format nor in pcapng format. 问题。

最后经过一番折腾,也未能解决该问题。有解决了问题的朋友,也麻烦评论告知一下。感谢!

参考资料

[1]

Pipy: https://github.com/flomesh-io/pipy

[2]

ksniff: https://github.com/eldadru/ksniff

[3]

krew: https://github.com/GoogleContainerTools/krew

[4]

ksniff 官方说明: https://github.com/eldadru/ksniff#usage

[5]

临时容器: https://kubernetes.io/zh/docs/concepts/workloads/pods/ephemeral-containers/

33ff4a2a9961edd4564dd1a1529485c4.gif

往期推荐

如果让你来设计网络

用过留痕,谁动了我的档案?

一把王者的时间,我就学会了Nginx

明明还有大量内存,为啥报错“无法分配内存”?

23de27e79d8d260e12f0d198733da71c.gif

点分享

b0cc7b0dd8e7912457e64d657e7b02f0.gif

点收藏

a649be58005f917a9bb5d52ccf5048c3.gif

点点赞

2ea73da94cef0d9826d4eb6bfe262aea.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EDAS 4.0 助力企业一站式实现微服务架构转型与 K8s 容器化升级

简介: EDAS 正式来到 4.0 时代,发布多项重磅新能力;同时联合新产品—云原生应用设计开发平台 ADD 1.0,一起发布云原生应用研发&运维 PaaS 产品家族,助力企业应用架构现代化升级。 作者:安绍飞 前言 …

如何用20分钟就能获得同款企业级全链路灰度能力?

简介: MSE 微服务引擎将推出服务治理专业版,提供开箱即用且完整专业的微服务治理解决方案,帮助企业更好地实现微服务治理能力。如果您的系统也可以像本文描述的那样,快速具备完整的全链路灰度能力,并基于该能力进行进一…

云桌面场景化升级新作,锐捷网络发布全新远程办公“U空间”

编辑 | 宋慧 出品 | CSDN云计算 远程办公真的来了。 在硅谷的科技公司远程办公常态化之后,国内的科技大厂也在跟进中,如携程正式宣布的32混合办公模式。根据iiMedia Research艾媒咨询数据显示,在2020年新春期间,中国远程办公人员…

细说双 11 直播背后的压测保障技术

简介: 阿里云 PTS 站在双 11 巨人的肩膀上,是阿里全链路压测的延伸。PTS 通过伸缩弹性,轻松发起用户百万级别的流量,免去机器、人力成本;PTS 对流量的控制,能够实时脉冲,精准控制; 是…

【SpringCloud-Alibaba系列教程】14.一文教你入门RocketMQ

<本文已参与 RocketMQ Summit 优秀案例征文活动&#xff0c;点此了解详情> MQ简介 MQ(Message Queue)是一种跨进程的通信机制&#xff0c;用于消息传递。通俗点说&#xff0c;就是一个先进先出的数据结构。 MQ应用场景 异步解耦 很多场景不使用MQ会产生各个应用见紧密…

独家 | 2021双11背后的数据库硬核科技

简介&#xff1a; 今年双11&#xff0c;阿里云数据库技术有什么不一样&#xff1f; 2021年&#xff0c;是阿里巴巴首个100%云上双11 双11峰值计算成本 相比去年下降50% 作为全球规模最大的数字工程之一 双11无疑是对阿里技术人的“大考” 在又一次技术“严考"面前 …

前沿分享|阿里云资深技术专家 魏闯先:AnalyticDB PostgreSQL年度新版本发布

简介&#xff1a; 本篇内容为2021云栖大会-云原生数据仓库AnalyticDB技术与实践峰会分论坛中&#xff0c;阿里云资深技术专家 魏闯先关于“AnalyticDB PostgreSQL年度新版本发布”的分享。 本篇内容将通过三个部分来介绍AnalyticDB PG年度新版本发布。 一、AnalyticDB PG云原生…

Apache RocketMQ在我司的最佳实践--智慧政务场景下的分布式消息与分布式事务

<本文已参与 RocketMQ Summit 优秀案例征文活动&#xff0c;点此了解详情> 缘起 对于Apache RocketMQ的了解&#xff0c;追溯起来&#xff0c;可以说是从开源初始&#xff0c;就认识到了它。那时候的它&#xff0c;还是个幼年&#xff0c;没有成熟的社区&#xff0c;也…

前沿分享|阿里云数据库资深技术专家 姚奕玮:AnalyticDB MySQL离在线一体化技术揭秘

简介&#xff1a; 本篇内容为2021云栖大会-云原生数据仓库AnalyticDB技术与实践峰会分论坛中&#xff0c;阿里云数据库资深技术专家 姚奕玮关于“AnalyticDB MySQL离在线一体化技术揭秘”的分享。 本篇内容将通过三个部分来介绍AnalyticDB MySQL离在线一体化技术。 一、传统大…

今年双11,阿里业务100%上云

简介&#xff1a; 阿里巴巴业务的研发效率提升了20%、CPU资源利用率提升30%、应用100%云原生化、在线业务容器可达百万规模&#xff0c;同时计算效率大幅提升&#xff0c;双11整体计算成本三年下降30%。 今天&#xff0c;阿里巴巴首席技术官程立宣布——2021天猫双11是首个100…

linux unshare 命令,详解Linux Namespace之User

User namespace 是 Linux 3.8 新增的一种 namespace&#xff0c;用于隔离安全相关的资源&#xff0c;包括 user IDs and group IDs&#xff0c;keys, 和 capabilities。同样一个用户的 user ID 和 group ID 在不同的 user namespace 中可以不一样(与 PID nanespace 类似)。换句…

从更高到更好 2021阿里双11背后的技术亮点

简介&#xff1a; 今年&#xff0c;是阿里巴巴第13个双11。今年双11&#xff0c;阿里巴巴大促峰值的计算成本相比去年下降50%&#xff1b;截至11日&#xff0c;小蛮驴无人车在双11期间累计配送快递已超过100万件。更多的阿里自研技术投入到双11&#xff0c;在芯片、服务器等硬核…

博时基金基于RocketMQ的基金数字化陪伴体系的架构实践

简介&#xff1a; 本文以博时基金的金融场景为案例&#xff0c;阐述RocketMQ在提升客户陪伴效率和丰富金融场景化能力等方面的提升作用。 <本文已参与 RocketMQ Summit 优秀案例征文活动&#xff0c;点此了解详情> 基于RocketMQ的基金数字化陪伴体系的架构实践 博时基金…

面对DNS劫持,只能坐以待毙吗?

简介&#xff1a; 借助 ARMS-云拨测&#xff0c;我们可实时对网站进行监控&#xff0c;实现分钟级别的监控&#xff0c;及时发现 DNS 劫持以及页面篡改。 作者&#xff1a;白玙 DNS 劫持作为最常见的网络攻击方式&#xff0c;是每个站长或者运维团队最为头疼的事情。苦心经营…

linux写程序四则运算,Shell编程之变量及四则运算

Shell的学习目标Shell的基本语法结构&#xff1a; 如&#xff1a;变量的定义、条件判断、循环语句(for、until、while)、分支语句、函数和数组等。基本正则表达式的应用文件处理&#xff1a;grep、sed、awk工具的使用使用shell脚本完成复杂的任务&#xff1a;服务搭建、批量处理…

博时基金基于 RocketMQ 的互联网开放平台 Matrix 架构实践

简介&#xff1a; 随着近两年业绩的抢眼&#xff0c;公募基金迎来了乘风破浪式的发展&#xff0c;截至 2021 年 1 月底&#xff0c;资产管理规模已破 20 万亿&#xff0c;创下了历史新高。 ​ <本文已参与 RocketMQ Summit 优秀案例征文活动&#xff0c;点此了解详情> 作…

首次 统一调度系统规模化落地,全面支撑阿里巴巴双 11 全业务

简介&#xff1a; 今年双 11 首次规模化亮相的统一调度&#xff0c;通过一套调度协议、一套系统架构&#xff0c;统一管理底层的计算、存储、网络资源&#xff0c;超大规模、高效率、自动化的资源弹性&#xff0c;实现了业界新的突破。在离线混部、离在线混部、新的快上快下技术…

日志服务Dashboard加速

简介&#xff1a; 阿里云日志服务致力于为用户提供统一的可观测性平台&#xff0c;同时支持日志、时序以及Trace数据的查询存储。用户可以基于收集到的各类数据构建统一的监控以及业务大盘&#xff0c;从而及时发现系统异常&#xff0c;感知业务趋势。但是随着收集到的数据量不…

明明还有空间,硬盘却写不进去了!

作者 | 阮一峰一、inode是什么&#xff1f;文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。操作系统读取硬盘的时候&#xff0c;不会一个个扇区地读取&#xf…

Dataphin核心功能(四):安全——基于数据权限分类分级和敏感数据保护,保障企业数据安全

简介&#xff1a; 《数据安全法》的发布&#xff0c;对企业的数据安全使用和管理提出了更高的要求。Dataphin提供基于数据分级分类和数据脱敏的敏感数据识别和保护能力&#xff0c;助力企业建立合规的数据安全体系&#xff0c;保障企业数据安全。本篇&#xff0c;我们就来聊聊D…