首页 > 其他分享 >kubernetes中如何抓包?

kubernetes中如何抓包?

时间:2024-09-20 17:47:46浏览次数:9  
标签:容器 kubernetes kubectl krew 如何 Pod tcpdump 抓包

目录

描述

随着容器化技术的普及,越来越多的应用部署在容器中,有时在正式环境中我们可能需要对容器进行抓包,以了解其网络通信情况及其排除通信异常的原因。
此处,由于程序是在运行在Kubernetes的Pod容器中,而且承载业务的容器往往没有安装tcpdump等相关数据包抓取命令,所以常常对Pod抓包而感到苦恼。
为了解决这个问题,我们可以通过以下几种方式针对Kubernetes中的Pod容器进行抓包。

1.在pod容器内抓包

这是我们初学者最先想到的办法,当然也最简单的一种方式,在Pod容器中安装tcpdump命令,然后直接使用tcpdump命令进行抓包。
但是由于Pod容器中往往没有安装tcpdump命令,通过安装tcpdump的方式增加了镜像大小,且在无外网连接的情况下也就无法在线安装。

# 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。
# 1.kubectl get --all-namespaces -o wide pods | grep ${POD_NAME}

# 或者

# 2.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网卡之间的对应关系,及其网络接口信息。
# 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命令进行抓包了。
tcpdump -i cali3002ec233ba@if6 -w /tmp/Gateway-756894b7d7-2qvzj.pcap

3.使用nsenter命令抓包

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

  • 1.找到Pod容器所在宿主机,及其Pid信息。
# 找到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命令。
# 软件包管理工具安装
yum install util-linux -y

# 源码安装
# 下载
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进行抓包。
# 进入到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插件
# 安装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工具来解析报文。
kubectl sniff fzxt-backend-admin-64c89dd789-bvggq -n prod -o fzxt-backend-admin.pcap

标签:容器,kubernetes,kubectl,krew,如何,Pod,tcpdump,抓包
From: https://www.cnblogs.com/even160941/p/18422949

相关文章

  • AIGC 浪潮下,互联网产品经理如何顺势而上?
    在当今科技飞速发展的浪潮中,AIGC(人工智能生成内容)正以前所未有的速度改变着互联网的格局。对于互联网产品经理而言,这既是一个充满无限可能的机遇,也是需要积极应对的挑战。那么,在AIGC时代,互联网产品经理如何借势升级呢?一、深入理解AIGC技术技术原理与能力边界作为互联......
  • 如何成为AI产品经理
    引言随着人工智能技术的飞速发展,AI产品经理这一职位逐渐成为科技行业的香饽饽。但AI产品经理究竟是做什么的?与传统产品经理有何不同?又该如何成为其中的一员呢?本文将为你一一解答。一.AI产品经理是什么?AI产品经理,顾名思义,就是负责人工智能产品的规划、设计、开发和迭代的......
  • AI产品经理必备技能:如何从需求挖掘到智能化产品落地
    随着人工智能(AI)技术的蓬勃发展,各行各业都迎来了新一轮的创新与升级。本文将结合电信行业的实际案例,深入解析AI产品经理从需求处理到产品管理的全流程工作。AI产品经理成为了电信行业中的重要角色,他们不仅要管理需求、调研市场,还要利用数据驱动决策、引领产品的智能化升级。......
  • 国家标准如何起草?有哪些步骤?
    国家标准的起草,是一项艰巨而又意义重大的任务,它关乎着国家的经济发展、社会稳定以及人民的生活质量。当我们肩负起起草国家标准的重任时,便如同踏上了一段充满挑战与机遇的征程。一、前期准备1.明确需求:确定制定国家标准的必要性和目的,了解相关行业的发展现状、技术趋势......
  • 2024-09-20 如何去除vue前端框架upload组件中的缓存 ==》v-if+setTimeout
    在很多前端框架中的upload组件,比如arco-design的a-upload组件,在遍历渲染过程中会发现上传完成后,切换到另一个a-upload组件,它的图片会显示上一个a-upload组件的缓存 正常上传,然后点击红色,红色对应的图片应该被清空,实际上却并没有,如下解决方案:给a-upload组件加一个条件判断v-if......
  • 旅行社区应该如何规划?
    近年来,旅游行业逐渐恢复,包括微度假、精致露营、康养旅游、乡村民宿等旅游模式。用户旅游支出、旅游人次逐渐恢复,旅游收入仍待提升。那么旅游社区应该如何搭建,内容如何规划呢?我们了解到,很多旅游网站都很看重旅游攻略记录,比如马蜂窝、穷游网等。确实旅游攻略是旅游社区的重点,我们在规......
  • Kubernetes-高可用集群证书更新
    本次k8s版本为v1.23.17Kubernetes集群中的证书主要分为两大类:Kubernetes组件证书(如:apiserver相关的证书)Etcd集群证书根据集群角色,证书还可以细分为:管理节点证书工作节点证书证书详情管理节点证书:Kubeadm部署:证书会由Kubeadm自动生成,覆盖Kubernetes组件(如:a......
  • 【后端开发】JavaEE初阶——计算机是如何工作的???
    前言:......
  • 从数据中台到数据飞轮的演化之旅:企业如何驱动下一个数据革命
    在数据驱动的商业环境中,数据中台已被广泛认为是构建企业数据能力的基石。然而,单纯的数据储存并不足以为企业带来竞争优势。数据飞轮概念的提出,就是为了把数据从静态存储转变为动态优化的过程,进一步激发数据的潜力,推动企业实现数据驱动的业务模式。所以,数据中台确实是构建数据飞轮的......
  • 从数据中台到数据飞轮的转变:如何实现数据的终极利用
    随着数据成为企业战略中不可或缺的资产,如何高效地利用这些数据成为了众多企业面临的挑战。数据中台作为一种集中管理和利用企业数据的架构,已经在很多组织中得到了应用。然而,从数据中台向数据飞轮的演进,不仅是技术的升级,更是一场思维和业务模式的革命。数据中台,通过提供统一的数据......