复杂的微服务网络

在Kubernetes中排查网络问题是非常困难的,主要是因为Kubernetes的网络架构非常复杂。例如,每个Pod都有自己的IP地址,但这些IP地址是由Kubernetes动态分配的,并且可以在Pod重新启动时更改。此外,Kubernetes中还有多个网络组件,如kube-proxy和Service等,它们都会对网络流量进行转发和修改,这也会增加排查网络问题的难度。

例如,当在Kubernetes中运行一个分布式应用程序时,如果出现了网络问题,例如无法在Pod之间建立连接,就需要排除问题可能出现的多个组件,例如网络插件、服务发现和负载均衡等。如果无法确定问题出现的具体位置,可能需要对整个Kubernetes集群进行调试,这不仅非常耗时,而且还会影响到整个应用程序的正常运行。

因此,在Kubernetes中排查网络问题需要仔细分析网络拓扑,了解各个组件的功能和工作原理,以及熟悉各种网络故障排除工具。此外,建议使用Kubernetes的日志和监控工具来捕获和分析网络故障,以便更快地定位和解决问题。然而,容器本身却专注于业务,其中一般不会安装其他的工具用于运维或网络排查用途,工具的缺乏,使得这个过程更加的艰难。

ksniff简介

ksniff 是一个kubectl插件, 它通过向pod中上传一个静态编译的tcpdump二进制文件并运行(或创建一个pod运行tcpdump),同时在本地开启wireshark,将tcpdump运行得到的输出流,作为wireshark的输入数据流,以此方式将抓包结果重定向到我们本地安装的wireshark中展示出来,让我们获得了微服务抓包的丝滑体验。

ksniff 工作模式

1. tcpdump直接上传

当用户在使用Ksniff时,Ksniff会自动将静态二进制的tcpdump文件上传到目标Pod中,并在Pod中运行该文件。该文件将能够捕获Pod的所有网络流量,并将流量转化为一系列的数据包。这些数据包会通过网络连接发回到本地,并使用Wireshark等网络抓包工具进行解析和分析。用户可以在图形化的界面中查看抓取到的网络流量,并进行详细的分析和调试。

2. privileged模式

在生产环境中,出于安全考虑,大多数Pod都不会以特权模式运行。然而,如果要在容器中运行tcpdump来抓取网络流量,则需要开启网口的混杂模式,这对于非特权容器来说是不允许的。这时,Ksniff提供了一个解决方案:使用参数-p来启动一个特权Pod,从而在不影响目标Pod的情况下进行网络抓包。

具体来说,当用户在使用Ksniff时,如果指定了参数-p,则Ksniff会在目标Pod所在的节点上启动一个特权Pod。这个特权Pod会连接到目标Pod的网络命名空间,并在该命名空间中启动一个网络抓包容器。该容器将能够捕获目标Pod的所有网络流量,并将流量发送回特权Pod中,而不需要在目标Pod中开启混杂模式。这样,用户可以在不降低Pod安全性的情况下,对网络流量进行抓包和分析。

需要注意的是,在使用参数-p时,Ksniff会在目标Pod所在的节点上启动一个特权Pod,这意味着特权Pod将具有访问节点Docker daemon的权限。因此,在使用Ksniff时需要确保节点的安全性,避免发生未经授权的容器访问行为。

总之,通过使用参数-p,Ksniff为用户提供了一种更安全、更灵活的网络抓包方案,可以有效地帮助用户排查网络故障,提高Kubernetes应用程序的可靠性和稳定性。
请添加图片描述

ksniff 安装步骤

安装wireshark

本地必须安装wireshark, 确保wireshark命令在系统路径下,在命令行可以直接运行命令wireshark

安装krew插件管理器

安装krew, 这是一个kubectl插件管理工具, 安装说明

  1. 下载krew程序
(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)
  1. .bashrc.zshrc中将相关目录添加到PATH中
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

安装ksniff

kubectl krew install sniff

ksniff 使用示例

运行命令抓取容器的网络流量, 下面的输出采用的是直接上传的模式。

➜  kubectl sniff -n cattle-system  rancher-6c4b4f9c84-6xjn4
INFO[0000] using tcpdump path at: '/Users/xianyao.chen/.krew/store/sniff/v1.6.2/static-tcpdump'
INFO[0001] no container specified, taking first container we found in pod.
INFO[0001] selected container: 'rancher'
INFO[0001] sniffing method: upload static tcpdump
INFO[0001] sniffing on pod: 'rancher-6c4b4f9c84-6xjn4' [namespace: 'cattle-system', container: 'rancher', filter: '', interface: 'any']
INFO[0001] uploading static tcpdump binary from: '/Users/xianyao.chen/.krew/store/sniff/v1.6.2/static-tcpdump' to: '/tmp/static-tcpdump'
INFO[0001] uploading file: '/Users/xianyao.chen/.krew/store/sniff/v1.6.2/static-tcpdump' to '/tmp/static-tcpdump' on container: 'rancher'
INFO[0001] executing command: '[/bin/sh -c test -f /tmp/static-tcpdump]' on container: 'rancher', pod: 'rancher-6c4b4f9c84-6xjn4', namespace: 'cattle-system'
INFO[0003] command: '[/bin/sh -c test -f /tmp/static-tcpdump]' executing successfully exitCode: '0', stdErr :''
INFO[0003] file found: ''
INFO[0003] file was already found on remote pod
INFO[0003] tcpdump uploaded successfully
INFO[0003] spawning wireshark!
INFO[0003] start sniffing on remote container
INFO[0003] executing command: '[/tmp/static-tcpdump -i any -U -w - ]' on container: 'rancher', pod: 'rancher-6c4b4f9c84-6xjn4', namespace: 'cattle-system'

在wireshark中查看
在这里插入图片描述

总结

此外,Ksniff还支持多种流量过滤和捕获方式,例如根据IP地址、端口号、协议类型等进行过滤,以帮助用户更快地定位网络故障。也可以使用命令行的tshark,或其他方式来查看抓包结果, 参见github文档

总之,Ksniff是一款功能强大的网络抓包工具,能够帮助Kubernetes用户快速、准确地排查网络故障。通过将网络流量转化为图形化展示,用户可以更加直观地了解网络的状态和运行情况,从而更好地优化和管理Kubernetes应用程序。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐