你知道你不看的时候你的k8s集群在做什么吗?谁与他建立 TCP 通信?他调用了谁,例如,来自第三方库?
使用k8spacket
和Grafana
,您可以可视化集群中的 TCP 流量。了解您的工作负载如何相互通信。检查建立了多少连接,交换了多少字节,以及这些连接处于活动状态的时间。
说明
k8spacket
是用 Golang 编写的工具,它使用gopacket
第三方库来嗅探工作负载上的 TCP 数据包(传入和传出)。它在运行的容器网络接口上创建 TCP 侦听器。当 Kubernetes 创建一个新容器时,CNI 插件负责提供与其他容器或从集群到世界通信的可能性。最常见的方法是使用linux namespace
隔离网络,使用veth pair
将隔离的命名空间与网桥连接。如果您想了解更多信息,请参阅 Safak 撰写的一篇精彩文章(Docker Container Networking Works - Mimic It Using Linux Network Namespaces)。除了bridge
类型外,CNI 插件还可以使用其他类型(vlan
、ipvlan
、macvlan
),但都为容器 linux 命名空间创建网络接口,这是k8spacket
嗅探器的主句柄。
k8spacket
使用选项运行
主机网络:真
消除前面提到的隔离。它收集 TCP 流、处理数据并通过 API 公开结果以供Grafana
使用。
此外,
-
k8spacket
是一个 Kubernetes API 客户端,可以将嗅探到的工作负载解析为可视化上可见的集群资源名称(Pods
和Services
)。 -
它作为
DaemonSet
启动,用于监听所有节点上的网络接口。 -
实现的观察者检查每个
10s
(默认)是否有新的(或旧的)网络接口来观察(或忘记)。
除了显示集群资源的图表外,它还公开了Prometheus
指标。
安装
要安装k8spacket
,您需要安装 Helm 和 Grafana。此外,该工具需要 Hamad 的 Node Grafana API 插件(Node Graph API)。
在此处查看所有安装步骤。
用法
统计类型
-
connection
- 帮助了解在您的工作负载之间以及从/到外部客户端建立了多少连接。它会告诉您哪些套接字保持打开状态并可能导致问题。当您位于某个端口耗尽的 SNAT 网关(例如,Azure AKS
)之后,它会很有帮助。 -
bytes
- 显示工作负载发送或接收的字节数。 -
duration
- 计算连接的生命周期。
过滤器
by namespace
- 选择一个或多个 k8s 命名空间
-
by names included
- 为可视化选择工作负载名称 -
by names excluded
- 从可视化中排除工作负载名称
总结
如果您想知道集群中的 TCP 流量发生了什么,请尝试k8spacket
。当您看到外面的包裹泄漏时,关于切断交通 (network policy
) 的调查可能会很轻松。审查第三方图书馆以检查与世界的联系。