首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >运维Tips | Kubernetes Pod 流量抓取的多种方式

运维Tips | Kubernetes Pod 流量抓取的多种方式

作者头像
全栈工程师修炼指南
发布于 2024-07-17 07:40:15
发布于 2024-07-17 07:40:15
85300
代码可运行
举报
运行总次数:0
代码可运行

Kubernetes Pod 流量抓取的多种方式

描述:随着容器化技术的普及,越来越多的应用部署在容器中,有时在正式环境中我们可能需要对容器进行抓包,以了解其网络通信情况及其排除通信异常的原因。

此处,由于程序是在运行在 Kubernetes 的 Pod 容器中,而且承载业务的容器往往没有安装tcpdump等相关数据包抓取命令,所以常常对Pod抓包而感到苦恼。

为了解决这个问题,我们可以通过以下几种方式针对Kubernetes中的Pod容器进行抓包。

1.在 Pod 容器内抓包

描述:这是我们初学者最先想到的办法,当然也最简单的一种方式,在Pod容器中安装tcpdump命令,然后直接使用tcpdump命令进行抓包。

但是由于Pod容器中往往没有安装tcpdump命令,通过安装tcpdump的方式增加了镜像大小,且在无外网连接的情况下也就无法在线安装。

代码语言:javascript
代码运行次数:0
运行
复制
# 1.安装 tcpdump
# Alpine 镜像
kubectl exec ${POD_NAME}  -- apk add tcpdump
# CentOS 镜像
kubectl exec ${POD_NAME}  -- yum install tcpdump -y
# Ubuntu 镜像
kubectl exec ${POD_NAME}  -- dnf install tcpdump -y

# 2.抓包并使用 wireshark 进行分析
kubectl exec ${POD_NAME}  -- tcpdump -i eth0 -w - | wireshark -k -i -

2.在节点主机上抓包

描述:这种方式是我们在实际生产环境中经常使用的,通过找到Pod容器所运行工作节点主机(Node)的,通过嗅探在Pod所在的节点上网络接口索引进行抓包,然后通过wireshark工具进行分析。

  • 1.定位 Pod 的 containerID 以及它所运行的宿主机 IP。
代码语言:javascript
代码运行次数:0
运行
复制
$ kubectl get --all-namespaces -o wide pods | grep ${POD_NAME}
# 或者
$ kubectl get pod -n ${NAMESPACE}${POD_NAME} -o json|jq '.status|{hostIP: .hostIP, container: [.containerStatuses[]|{name: .name, containerID: .containerID}]}'
{
  "hostIP": "10.10.66.203",
  "container": [
    {
      "name": "app",
      "containerID": "docker://808605e67373b6d97dfb4bf67745e8cd0f5062978385707c91e42d1c37bfba57"
    }
  ]
}
  • 2.登录到运行此Pod容器的宿主机(10.103.236.203)查找容器中的网卡与宿主机的 veth 网卡之间的对应关系,及其网络接口信息。
代码语言:javascript
代码运行次数:0
运行
复制
$ PodName=Gateway-756894b7d7-2qvzj
$ kubectl exec -it ${PodName} -- /bin/sh -c "cat /sys/class/net/eth0/iflink"
  # 16

$ ip link |grep 16
16: cali3002ec233ba@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP mode DEFAULT group default
  • 3.确定好容器中的网卡与宿主机的 veth 网卡cali3002ec233ba@if6 关系后,就可以通过tcpdump命令进行抓包了。
代码语言:javascript
代码运行次数:0
运行
复制
$ tcpdump -i ali3002ec233ba@if6 -w /tmp/Gateway-756894b7d7-2qvzj.pcap

3.使用nsenter命令抓包

通过nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令,使用它我们可以在Pod容器中直接使用tcpdump命令进行抓包。

  • 1.找到Pod容器所在宿主机,及其Pid信息。
代码语言:javascript
代码运行次数:0
运行
复制
# 找到Pod调度的工作节点
$ podName=fzxt-backend-admin-64c89dd789-bvggq
$ kubectl get pods -A -o wide | grep ${PodName}
  # prod   fzxt-backend-admin-64c89dd789-bvggq    1/1     Running                 0                   28d     172.19.1.88      weiyigeek-214    <none>           <none>

# 登录节点上执行如下命令:
# Containerd
$ crictl inspect `(crictl ps --name ${PodName} | cut -d " " -f 1 | grep -v CONTAINE)` | grep "pid"
  "pid": 46241,
  "pid": 1
  "type": "pid"
# Docker
$ docker inspect 3002ec233ba |grep Pid
    "Pid": 8105,
    "PidMode": "",
    "PidsLimit": null,
  • 2.在承载此Pod容器的工作节点上,安装nsenter命令。
代码语言:javascript
代码运行次数:0
运行
复制
# 软件包管理工具安装
yum install util-linux

# 源码安装
# 下载
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/
  • 3.使用nsenter命令进入Pod容器的命名空间,然后使用 tcpdump 进行抓包。
代码语言:javascript
代码运行次数:0
运行
复制
# 进入到pod命名空间
nsenter -t 8105 -n

# 使用 tcpdump 进行抓包
tcpdump -nnnvv -As 0 -i eth0 port 80 -w fzxt-backend-admin.pcap

# 参数解释:
-nnn:
第一个 n 表示不将网络地址转换为名称。这意味着 tcpdump 会显示 IP 地址而不是尝试将它们解析为主机名。
第二个 n 也是同样的作用,但有些版本的 tcpdump 可能不支持重复使用 -n 选项。在这种情况下,第二个 n 可能会被忽略。
第三个 n(如果支持)通常表示不将端口号转换为服务名称,即显示端口号的数字而不是服务名称。

-vv:
第一个 v 表示详细输出。这会提供更多的信息,比如数据包的头部信息。
第二个 v 表示更详细的输出。这会提供比单个 -v 更详细的信息。

-A:表示以 ASCII 格式打印每个数据包的内容,方便阅读文本数据。

-s 0-s 选项后跟一个数值,表示从每个捕获的数据包中截取的字节数。0 表示不截取,即捕获每个数据包的全部

4.使用ksniff插件抓包

描述:ksniff 是一个 kubectl 的插件,它利用 tcpdump 和 Wireshark 对 Kubernetes 集群中的任何 Pod 启动远程抓包(这是作者推荐的方式)

  • 1.安装 krew 命令及 sniff 插件
代码语言:javascript
代码运行次数:0
运行
复制
# 安装 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"

# 安装 sniff
$ 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
  • 2.使用 sniff 插件抓包,实际上是映射本地的 /tmp/static-tcpdump 文件到Pod中运行。 通常情况下服务器节点没有安装 wireshark,你可以将报文输出到文件中,然后用本地Windows系统中的 wireshark 工具来解析报文。
代码语言:javascript
代码运行次数:0
运行
复制
kubectl sniff fzxt-backend-admin-64c89dd789-bvggq -n prod -o fzxt-backend-admin.pcap
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈工程师修炼指南 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Kubernetes 中分析调试网络流量的4种方式
在当今世界, 分布式系统, 微服务/SOA架构遍地, 服务之间的许多交互和通信都不再是同一主机的不同线程或进程, 而是跨主机, 甚至跨网络区域. 那么一旦相关服务出现问题, 我们就会需要调试服务间的通讯, 主机间的网络...
东风微鸣
2022/04/21
1.4K0
Kubernetes 中分析调试网络流量的4种方式
介绍一个小工具:Ksniff
对于相当一部分读者来说,在 Kubernetes 环境中,针对 Pod 进行抓包是个常规操作,在 Pod 中、在 Node 中都能够完成,抓出文件之后现场查看或者拷贝回来喂给 Wireshark 也都不难。Ksniff工具的作用是,把这些常规步骤组织起来,用一个简单的 kubectl 插件命令,就能完成这一系列的操作。
崔秀龙
2019/07/22
1K0
介绍一个小工具:Ksniff
K8S Pod 内抓包快速定位网络问题
在使用 Kubernetes 时,可能会遇到一些网络问题。当通过检查配置与日志无法排查错误时,这时就需要抓取网络数据包,但是Pod内一般不会安装tcpdump命令,那有没有方法可以直接通过宿主机抓取Pod网络数据包?
YP小站
2020/06/04
5.9K0
K8S Pod 内抓包快速定位网络问题
超好用的k8s中pod诊断工具:kubectl-debug
容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦:精简后的容器中普遍缺失常用的排障工具,部分容器里甚至没有 shell (比如 FROM scratch )。 在这种状况下,我们只能通过日志或者到宿主机上通过 docker-cli 或 nsenter 来排查问题,效率很低,在K8s环境部署应用后,经常遇到需要进入pod进行排错。除了查看pod logs和describe方式之外,传统的解决方式是在业务pod基础镜像中提前安装好procps、net-tools、tcpdump、vim等工具。但这样既不符合最小化镜像原则,又徒增Pod安全漏洞风险。
没有故事的陈师傅
2021/12/21
1.8K0
超好用的k8s中pod诊断工具:kubectl-debug
腾讯云TKE-网络: 如何在Node节点对容器内抓包快速定位网络问题
k8s的网络比较复杂, 可能会遇到一些网络问题。当 我们通过检查一些配置和日志仍然无法定位问题
朱瑞卿
2020/11/13
1.9K1
腾讯云TKE-网络: 如何在Node节点对容器内抓包快速定位网络问题
如何在kubernetes中抓包
随着云原生的落地,k8s使用的人也越来越多了,而在这种环境中,抓包有的时候也是一种纠结的事情。
SRE运维实践
2024/08/05
2370
如何在kubernetes中抓包
超实用!k8s网络抓包技巧,事半功倍
在前面的文章《k8s网络延迟排查与优化实战分享》中,我们介绍了网络延迟的排查过程,从中深刻体会到网络抓包和分析网络包在故障排查和性能优化中的重要性。因此,本期将向大家介绍如何在K8s环境中高效进行网络抓包,以达到事半功倍的效果。
SRE运维手记
2024/08/30
3750
超实用!k8s网络抓包技巧,事半功倍
简化 Pod 故障诊断: kubectl-debug 介绍
容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦:精简后的容器中普遍缺失常用的排障工具,部分容器里甚至没有 shell (比如 FROM scratch )。 在这种状况下,我们只能通过日志或者到宿主机上通过 docker-cli 或 nsenter 来排查问题,效率很低。Kubernetes 社区也早就意识到了这个问题,在 16 年就有相关的 Issue Support for troubleshooting distroless containers 并形成了对应的 Proposal。 遗憾的是,由于改动的涉及面很广,相关的实现至今还没有合并到 Kubernetes 上游代码中。而在 一个偶然的机会下(PingCAP 一面要求实现一个 kubectl 插件实现类似的功能),我开发了 kubectl-debug: 通过启动一个安装了各种排障工具的容器,来帮助诊断目标容器 。
DevOps时代
2019/07/08
1.2K0
简化 Pod 故障诊断: kubectl-debug 介绍
kubernetes 实用技巧: 使用 ksniff 抓包
Kubernetes 环境中遇到网络问题需要抓包排查怎么办?传统做法是登录 Pod 所在节点,然后 进入容器 netns,最后使用节点上 tcpdump 工具进行抓包。整个过程比较繁琐,好在社区出现了 ksniff 这个小工具,它是一个 kubectl 插件,可以让我们在 Kubernetes 中抓包变得更简单快捷。
imroc
2021/05/15
3.1K0
Kubernetes 问题定位技巧:容器内抓包
在使用 kubernetes 跑应用的时候,可能会遇到一些网络问题,比较常见的是服务端无响应(超时)或回包内容不正常,如果没找出各种配置上有问题,这时我们需要确认数据包到底有没有最终被路由到容器里,或者报文到达容器的内容和出容器的内容符不符合预期,通过分析报文可以进一步缩小问题范围。那么如何在容器内抓包呢?本文提供实用的脚本一键进入容器网络命名空间(netns),使用宿主机上的tcpdump进行抓包。
imroc
2019/05/19
3.9K1
Kubernetes 故障诊断神器 kubectl-debug 入门教程
容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦:精简后的容器中普遍缺失常用的排障工具,部分容器里甚至没有 shell (比如 FROM scratch )。在这种状况下,我们只能通过日志或者到宿主机上通过 docker-cli 或 nsenter 来排查问题,效率很低。Kubernetes 社区也早就意识到了这个问题,在 16 年就有相关的 Issue Support for troubleshooting distroless containers[1] 并形成了对应的 Proposal[2]。遗憾的是,由于改动的涉及面很广,相关的实现至今还没有合并到 Kubernetes 上游代码中。而在 一个偶然的机会下(PingCAP 一面要求实现一个 kubectl 插件实现类似的功能),我开发了 kubectl-debug[2]:通过启动一个安装了各种排障工具的容器,来帮助诊断目标容器。
iMike
2019/08/09
2.8K0
Kubernetes 故障诊断神器 kubectl-debug 入门教程
巧用 Nsenter 调取宿主机工具调试容器内程序
nsenter 是一个可以用来进入到目标程序所在 Namespace 中运行命令的工具,一般常用于在宿主机上调试容器中运行的程序。
iMike
2020/10/27
12.1K1
巧用 Nsenter 调取宿主机工具调试容器内程序
别关心美国大事了,学点知识吧,兄嘚~【故障排查 之 单点登录跳转失败(Ingress 相关)】
问题要点是:单点登录失败,看代码是 request 和 response 的 RedirectUri 不一样导致的。
SRE运维进阶之路
2024/11/07
1170
别关心美国大事了,学点知识吧,兄嘚~【故障排查 之 单点登录跳转失败(Ingress 相关)】
k8s 如何进行pod级的抓包
因为某些关系原因,有时候需要排查pod和外部服务之间是否有网络异常情况,我们需要进行tcpdump抓包操作。
保持热爱奔赴山海
2019/09/17
2.9K0
Kubectl Plugin 推荐(二)| 简化操作篇
该插件使用树状图和表格展示 pod 相关资源,在排查问题可以非常方便的查看 Pod 相关资源信息和状态。
郭旭东
2021/03/16
1K0
Kubectl Plugin 推荐(二)| 简化操作篇
Kubernetes 排错、调试常用方法总结
在 k8s 云环境中,我们需要在容器内抓包进行 Debug, 但通常大多容器都没有安装 tcpdump 以及其他网络工具;在托管 k8s 中我们想登录 node,不是没权限就是步骤太麻烦。本文的主角nsenter正是很擅长解决这些问题,nsenter可以进入指定namespace的工具,一般用来在容器环境中进行调试。
我的小碗汤
2023/03/20
5100
Kubernetes 排错、调试常用方法总结
K8S 实用工具之四 - kubectl 实用插件
在《K8S 实用工具之一 - 如何合并多个 kubeconfig?》一文中,我们介绍了 kubectl 的插件管理工具 krew。接下来就顺势介绍几个实用的 kubectl 插件。
东风微鸣
2022/04/22
2K0
K8S 实用工具之四 - kubectl 实用插件
【K8s】Kubernetes 网络之 Pod 网络调试
在实际工作中,我们经常会遇到一些疑似网络方面的故障问题,从而需要对 Kubernetes 集群中的 Pod 进行网络调试。
行者Sun
2024/12/27
2200
【K8s】Kubernetes 网络之 Pod 网络调试
使用sniff 轻松抓取kubernetes pod的数据报文
之前我们在k8s上进行pod级别的抓包,一般要好几步才能实现,参见这里:https://blog.51cto.com/lee90/2432209
保持热爱奔赴山海
2020/04/29
1.9K0
【TKE】容器问题排错常用命令
有时候我们想要查看下容器内部的一些东西,但是无奈容器没有shell 执行环境,比如想看看 coredns 容器中 /etc/resolv.conf 的内容是否正确继承了节点的配置,比较简单的操作步骤如下(以 docker 运行时为例):
Jokey
2021/04/30
9160
推荐阅读
相关推荐
Kubernetes 中分析调试网络流量的4种方式
更多 >
目录
  • 1.在 Pod 容器内抓包
  • 2.在节点主机上抓包
  • 3.使用nsenter命令抓包
  • 4.使用ksniff插件抓包
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验