网络诊断利器:掌握 Kubernetes Pod 抓包技巧

转载:网络诊断利器:掌握 Kubernetes Pod 抓包技巧 

背景

有没有对Pod抓包而感到苦恼,下面针对在线上出现问题之后,针对Pod进行抓包

1. 宿主机上捕获

应用其实是运行在 Pod 内的 Container 里的,所以只要定位到 Container 被调度到了哪个 Node 上,在相应的 Node 里,对容器进行抓包即可。

2.1 定位Pod ip和containerID

定位 Pod 的 containerID 以及它所运行的宿主机 IP

# kubectl get pod -n ${NAMESPACE}${POD_NAME} -o json|jq '.status|{hostIP: .hostIP, container: [.containerStatuses[]|{name: .name, containerID: .containerID}]}'{"hostIP": "10.103.236.203","container": [{"name": "app","containerID": "docker://808605e67373b6dee49162c67745e8cd0f5062978385707c91e42d1c37bfba57"}]
}

2.2 查找网络接口索引

通过 ssh 登陆到 Pod 所在的宿主机上,然后在容器内执行 cat /sys/class/net/eth0/iflink,查找容器中的网卡与宿主机的 veth 网卡之间的对应关系

kubectl exec -it ${PodName} -- /bin/sh -c "cat /sys/class/net/eth0/iflink"[root@kube-master ~]# kubectl exec -it app-prod-97dfb4bf-h59vq -- /bin/sh -c "cat /sys/class/net/eth0/iflink"
14

2.3 查找网络接口信息

[root@kube-master ~]# ip link |grep 14
14: cali3002ec233ba@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP mode DEFAULT group default

2.4 在宿主机上抓包

tcpdump -i ali3002ec233ba@if4 -w /root/tcpdump.pcap

2. 在 Pod 内抓包

kubectl exec${POD_NAME}  -- tcpdump -i eth0 -w - | wireshark -k -i -

这种方式的安装tcpdump ,增加了镜像的大小 ,不建议这种方式

2.1 通过nsenter

2.1.1 是什么

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令

2.1.2 安装

#下载
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.40/util-linux-2.40.tar.gz#解压
tar zxvf util-linux-2.40.tar.gz && cd util-linux-2.40#编译
./configure --without-ncurses && make cp nsenter /usr/bin/
  • 或者yum 安装

yum install util-linux

2.1.3 帮助

nsenter --help选项:-a, --all              enter all namespaces-t, --target <pid>     要获取名字空间的目标进程-m, --mount[=<文件>]   进入 mount 名字空间-u, --uts[=<文件>]     进入 UTS 名字空间(主机名等)-i, --ipc[=<文件>]     进入 System V IPC 名字空间-n, --net[=<文件>]     进入网络名字空间-p, --pid[=<文件>]     进入 pid 名字空间-C, --cgroup[=<文件>]  进入 cgroup 名字空间-U, --user[=<文件>]    进入用户名字空间-S, --setuid <uid>     设置进入空间中的 uid-G, --setgid <gid>     设置进入名字空间中的 gid--preserve-credentials 不干涉 uid 或 gid-r, --root[=<目录>]     设置根目录-w, --wd[=<dir>]       设置工作目录-F, --no-fork          执行 <程序> 前不 fork-Z, --follow-context  根据 --target PID 设置 SELinux 环境-h, --help             display this help-V, --version          display version

2.1.4 调试Pod网络

  • 获取pid

kubectl get pods -A -o wide 
  • 到pod所在node节点上面

[root@kube-node02 ~]# docker inspect 808605e67373 |grep Pid"Pid": 7004,"PidMode": "","PidsLimit": null,
  • 进入到pod

nsenter -t 7004 -n

2.1.5 抓包

 tcpdump -nnnvv -As 0 -i eth0 port 80 -w demo2.pcap

参数解释

-nnn:
第一个 n 表示不将网络地址转换为名称。这意味着 tcpdump 会显示 IP 地址而不是尝试将它们解析为主机名。
第二个 n 也是同样的作用,但有些版本的 tcpdump 可能不支持重复使用 -n 选项。在这种情况下,第二个 n 可能会被忽略。
第三个 n(如果支持)通常表示不将端口号转换为服务名称,即显示端口号的数字而不是服务名称。-vv:
第一个 v 表示详细输出。这会提供更多的信息,比如数据包的头部信息。
第二个 v 表示更详细的输出。这会提供比单个 -v 更详细的信息。-A:表示以 ASCII 格式打印每个数据包的内容,方便阅读文本数据。-s 0:
-s 选项后跟一个数值,表示从每个捕获的数据包中截取的字节数。0 表示不截取,即捕获每个数据包的全部内容,而不是只捕获前若干字节。

3. ksniff抓包

推荐这个方式

3.1 介绍

ksniff 是一个 kubectl 的插件,它利用 tcpdump 和 Wireshark 对 Kubernetes 集群中的任何 Pod 启动远程抓包

3.1 krew安装

(set -x; cd"$(mktemp -d)" &&curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" &&tar zxvf krew.tar.gz &&KREW=./krew-"$(uname | tr '[:upper:]' '[:lower:]')_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/arm.*$/arm/')" &&"$KREW" install krew
)
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

3.2 sniff安装


[root@kube-master ~]# kubectl krew install sniff
Updated the local copy of plugin index.
Installing plugin: sniff
W0710 17:54:14.755671   84252 install.go:160] Skipping plugin "sniff", it is already installed

3.3 sniff抓包

  • 本地

# 注:需要替换 pod name 和 namespace ,这个本地会执行wireshark
kubectl sniff ${POD_NAME} -n ${NAMESPACE}
  • 服务器

服务器并没有安装 wireshark,你可以将报文输出到文件中,然后用本地的 wireshark 来解析报文

kubectl sniff ${POD_NAME} -n ${NAMESPACE} -o httpbin.pcap
  • 案例

INFO[0000] using tcpdump path at: '/root/.krew/store/sniff/v1.6.2/static-tcpdump'
INFO[0000] no container specified, taking first container we found in pod.
INFO[0000] selected container: 'app'
INFO[0000] sniffing method: upload static tcpdump
INFO[0000] sniffing on pod: 'app-prod-97dfb4bf-h59vq' [namespace: 'default', container: 'app', filter: '', interface: 'any']
INFO[0000] uploading static tcpdump binary from: '/root/.krew/store/sniff/v1.6.2/static-tcpdump' to: '/tmp/static-tcpdump'
INFO[0000] uploading file: '/root/.krew/store/sniff/v1.6.2/static-tcpdump' to '/tmp/static-tcpdump' on container: 'app'
INFO[0000] executing command: '[/bin/sh -c test -f /tmp/static-tcpdump]' on container: 'app', pod: 'app-prod-97dfb4bf-h59vq', namespace: 'default'
INFO[0000] command: '[/bin/sh -c test -f /tmp/static-tcpdump]' executing successfully exitCode: '0', stdErr :''
INFO[0000] file found: ''
INFO[0000] file was already found on remote pod
INFO[0000] tcpdump uploaded successfully
INFO[0000] output file option specified, storing output in: 'text.pcap'
INFO[0000] start sniffing on remote container
INFO[0000] executing command: '[/tmp/static-tcpdump -i any -U -w - ]' on container: 'app', pod: 'app-prod-97dfb4bf-h59vq', namespace: 'default'

看原理是通过本地的/tmp/static-tcpdump 文件弄到pod中去抓包

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

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

相关文章

01、爬虫学习入门

爬虫&#xff1a;通过编写程序&#xff0c;来获取获取互联网上的资源 需求&#xff1a;用程序模拟浏览器&#xff0c;输入一个网址&#xff0c;从该网址获取到资源或内容 一、入门程序 #使用urlopen来进行爬取 from urllib.request import urlopen url "http://www.ba…

我们的网站被狗爬了!

大家好&#xff0c;我是程序员鱼皮。 世风日下&#xff0c;人心不古。我们的程序员面试刷题网站 《面试鸭》 才刚刚上线了一个多月&#xff0c;就由于过于火爆&#xff0c;被不少同行和小人发起网络攻击。 而且因为我们已经有 4500 多道人工整理的企业高频面试题、100 多个各…

【JavaScript】函数的动态传参

Javacript&#xff08;简称“JS”&#xff09;是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名&#xff0c;但是它也被用到了很多非浏览器环境中&#xff0c;JavaScript基于原型编程、多范式的动态脚本语言&…

第六周:机器学习周报

机器学习周报 摘要Abstract机器学习——类神经网络训练不起来怎么办&#xff1f;1. 自动调整学习率&#xff08;learning rate&#xff09;1.1 特制化的Learning Rate——parameter dependent1.1.1 Root Mean Square&#xff08;RMS&#xff0c;均方根&#xff09;1.1.2 RMSPro…

Qt Creator使用git管理代码

1.在GitHub中新建仓库&#xff0c;设置好仓库名后&#xff0c;其它的设置默认即可。 2.打开git bash&#xff0c;输入以下命令&#xff1a; git config --global user.name "xxxxx" #设置你的GitHub用户名 git config --global user.email "xxxxxxxxx.…

DMB,DSB,ISB三个指令区别

此部分说明三个指令的具体区别&#xff08;在指令流水线上说明&#xff09;&#xff0c;这三个指令主要目的在于确保程序在多处理器环境下的稳定性和一致性&#xff0c;避免由于指令乱序和内存操作重排引起的不可预测行为 一个简化的流水线&#xff0c;包含以下阶段&#xff1…

[Docker][Docker Registry]详细讲解

目录 1.什么是Docker Registry&#xff1f;2.镜像源配置3.镜像仓库命令1.命令清单2.docker login2.docker pull3.docker push4.docker search5.docker logout 1.什么是Docker Registry&#xff1f; 镜像仓库(Docker Registry) 功能&#xff1a;负责存储、管理和分发镜像&#x…

腾讯云网站/域名备案操作流程

目录 一、备案服务授权二、备案 一、备案服务授权 二、备案 在“我的备案”页面&#xff0c;点击【去备案】&#xff1a; 点击【新增备案】&#xff1a; 点击【同意并继续】&#xff1a; 选择省份&#xff0c;点击【开始备案】&#xff1a; 输入备案相关信息后点击【提交】…

vue给数组对象赋值改变对象里面的数据,数据没有更新this.$set

替换数组startTime的值&#xff1a; 原数据 this.serviceTimeList.push({serviceTimeName: 服务时间段,startTime: this.startTime,endTime: this.endTime,currentDateStart: this.currentDate,currentDateEnd: this.currentDate}) this.$set(this.array, index, newValue); …

笑谈“八股文”,人生不成文

一、“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试…

计算机系统操作系统简介

目录 1.计算机系统简介 1.1组成结构 1.2系统软件 1.3冯诺依曼计算机特点 1.4硬件构架 2.硬件的进一步认识 2.1存储器 2.2输入设备 2.3输出设备 2.4CPU组成 2.5线的概念引入 3.操作系统 3.1操作系统简介 3.2操作系统如何管理 3.3库函数和系统调用 1.计算机系统简介…

Linux shell编程学习笔记67: tracepath命令 追踪数据包的路由信息

0 前言 网络信息是电脑网络信息安全检查中的一块重要内容&#xff0c;Linux和基于Linux的操作系统&#xff0c;提供了很多的网络命令&#xff0c;今天我们研究tracepath命令。 Tracepath 在大多数 Linux 发行版中都是可用的。如果在你的系统中没有预装&#xff0c;请根据你的…

一下午连续故障两次,谁把我们接口堵死了?!

唉。。。 大家好&#xff0c;我是程序员鱼皮。又来跟着鱼皮学习线上事故的处理经验了喔&#xff01; 事故现场 周一下午&#xff0c;我们的 编程导航网站 连续出现了两次故障&#xff0c;每次持续半小时左右&#xff0c;现象是用户无法正常加载网站&#xff0c;一直转圈圈。 …

android前台服务

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、使用2.1 添加权限2.2 新建…

基于SpringBoot+Vue的档案管理系统(带1w+文档)

基于SpringBootVue的档案管理系统(带1w文档) 基于SpringBootVue的档案管理系统(带1w文档) 随着信息化的不断发展&#xff0c;科技的进步也越来越大。软件编程是一个不断发展的行业&#xff0c;每个行业都必须进行适合自身特点的系统开发&#xff0c;才能在机构中生存和发展。当…

大模型算法面试题(十七)

本系列收纳各种大模型面试题及答案。 1、LoRA权重是否可以合入原模型 LoRA权重可以合入原模型。LoRA&#xff08;Low-Rank Adaptation of Large Language Models&#xff09;是一种用于微调大型语言模型的低秩适应技术。它通过训练低秩矩阵&#xff0c;并将这些参数注入到原始…

大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

支持AI的好用的编辑器aieditor

一、工具概述 AiEditor 是一个面向 AI 的下一代富文本编辑器&#xff0c;她基于 Web Component&#xff0c;因此支持 Layui、Vue、React、Angular 等几乎任何前端框架。她适配了 PC Web 端和手机端&#xff0c;并提供了 亮色 和 暗色 两个主题。除此之外&#xff0c;她还提供了…

【Django5】内置Admin系统

系列文章目录 第一章 Django使用的基础知识 第二章 setting.py文件的配置 第三章 路由的定义与使用 第四章 视图的定义与使用 第五章 二进制文件下载响应 第六章 Http请求&HttpRequest请求类 第七章 会话管理&#xff08;Cookies&Session&#xff09; 第八章 文件上传…

聚观早报 | 华为nova Flip官宣;苹果iOS 17.6正式版发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月31日消息 华为nova Flip官宣 苹果iOS 17.6正式版发布 方程豹豹5全系降价 vivo X200 Pro主摄参数 谷歌Pixel …