你知道你不看的时候你的k8s集群在做什么吗?谁与他建立 TCP 通信?他调用了谁,例如,来自第三方库?

使用k8spacketGrafana,您可以可视化集群中的 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 插件还可以使用其他类型(vlanipvlanmacvlan),但都为容器 linux 命名空间创建网络接口,这是k8spacket嗅探器的主句柄。

k8spacket使用选项运行

主机网络:真

消除前面提到的隔离。它收集 TCP 流、处理数据并通过 API 公开结果以供Grafana使用。

此外,

  • k8spacket是一个 Kubernetes API 客户端,可以将嗅探到的工作负载解析为可视化上可见的集群资源名称(PodsServices)。

  • 它作为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) 的调查可能会很轻松。审查第三方图书馆以检查与世界的联系。