
你知道你的 K8s 集群在你没使用的时候在做什么吗?谁与他建立 TCP 了通信?他调用了谁?通过使用 k8spacket
和 Grafana
,我们可以可视化集群中的 TCP 流量,这样可以了解工作负载是如何相互通信。检查建立了多少连接,交换了多少字节,以及这些连接处于活动状态的时间。
介绍
k8spacket
是用 Golang 编写的一个工具,它使用 gopacket
第三方库来嗅探工作负载上的 TCP 数据包(传入和传出),它在运行的容器网络接口上创建 TCP 监听器。当 Kubernetes 创建一个新容器的时候,CNI 插件负责提供与其他容器或从集群到外部世界通信的可能性。最常见的方法是使用 linux 命名空间来隔离网络,使用 veth pair 来连接隔离的命名空间和网桥。除了桥接类型外,CNI 插件还可以使用其他类型(vlan、ipvlan、macvlan),但都是为容器 linux 命名空间创建一个网络接口,这是 k8spacket 嗅探器的主要句柄。
k8spacket
运行的时候会使用 hostNetwork: true
选项,这样可以消除前面提到的隔离现象,它通过收集 TCP 流、处理数据并通过 API 暴露结果以供 Grafana 使用。此外,
k8spacket
是一个 Kubernetes API 客户端,可以将嗅探到的工作负载解析为可视化的集群资源名称(Pods 和 Services)。它作为 DaemonSet 启动以侦听所有节点上的网络接口。 如果有新的(或旧的)网络接口要观察(或忘记),已实现的监听器每 10 秒(默认)检查一次。

除了显示集群资源的图表外,它还暴露了 Prometheus 指标。

安装
要安装 k8spacket,我们需要安装 Helm 和 Grafana。此外,该工具需要 Hamad 的 Node Grafana API 插件(Node Graph API)。
helm repo add k8spacket https://k8spacket.github.io/k8spacket-helm-chart
helm install k8spacket --namespace k8spacket k8spacket/k8spacket --create-namespace
将 Node Graph API 插件和数据源添加到您的 Grafana 实例,您可以手动完成或更改 Grafana Chart 的 helm 值,例如:
grafana:
env:
GF_INSTALL_PLUGINS: hamedkarbasi93-nodegraphapi-datasource
datasources:
nodegraphapi-plugin-datasource.yaml:
apiVersion: 1
datasources:
- name: "Node Graph API"
jsonData:
url: "http://k8spacket.k8spacket.svc.cluster.local:8080"
access: "proxy"
basicAuth: false
isDefault: false
readOnly: false
type: "hamedkarbasi93-nodegraphapi-datasource"
typeLogoUrl: "public/plugins/hamedkarbasi93-nodegraphapi-datasource/img/logo.svg"
typeName: "node-graph-plugin"
orgId: 1
version: 1
使用方法
统计类型
connection
- 帮助了解在工作负载之间以及从或到外部客户端建立了多少连接。它会告诉您哪些套接字保持打开状态并可能导致问题。当您使用端口耗尽的某些 SNAT 网关(例如,Azure AKS)时,它会很有帮助。bytes
- 显示工作负载发送或接收的字节数。duration
- 计算连接的生命周期。

过滤器
按命名空间 - 选择一个或多个 K8s 命名空间

按包含的名称 - 选择工作负载名称以进行可视化 按名称排除 - 从可视化中排除工作负载名称

Github 仓库:https://github.com/k8spacket/k8spacket