polarsignals/kubezonnet

GitHub: polarsignals/kubezonnet

基于 eBPF 的 Kubernetes 跨可用区网络流量监控工具,帮助识别和优化云环境中的跨区流量成本。

Stars: 175 | Forks: 7

# kubezonnet 针对基于 Cilium 的集群(运行在 Legacy host routing 模式下),使用 Prometheus 进行 **KUBE**rnetes 跨可用区 **ZON**e **NET**work 网络监控。 ## 为什么需要它? 虽然云服务商对同可用区的流量通常不收费,但跨可用区流量并非如此;如果在网络上传输大量数据,这很容易成为主要的成本因素。因此,了解哪些工作负载导致了跨可用区流量至关重要。 ### 文章 阅读 The New Stack 文章:[eBPF 工具识别 Kubernetes 跨可用区网络流量](https://thenewstack.io/ebpf-tool-identifies-cross-zone-kubernetes-network-traffic/) 阅读我们的博客文章:[kubezonnet:监控 Kubernetes 中的跨可用区网络流量](https://www.polarsignals.com/blog/posts/2025/01/09/introducing-kubezonnet) ## 部署 Kubezonnet 旨在部署在 Kubernetes 上,因此无需特殊操作,只需应用 manifest 文件即可: ``` kubectl apply -f https://raw.githubusercontent.com/polarsignals/kubezonnet/refs/heads/main/deploy/kubezonnet.yaml ``` 容器镜像发布于: * agent: `ghcr.io/polarsignals/kubezonnet-agent` * server: `ghcr.io/polarsignals/kubezonnet-server` ## 需求 * Cilium 作为 CNI(运行在 Legacy host routing 模式,否则 netfilter 无法正常工作,GKE dataplane v2 集群使用此模式) * Linux Kernel 6.4+(netfilter eBPF 程序仅从 6.4 版本开始添加) ## 它是如何工作的? Kubezonnet 由两个组件组成: * kubezonnet-agent:使用带有 netfilter postrouting hook 的 eBPF 收集所有 Pod 网络流量的统计信息,并将统计信息发送到 server。此组件部署在所有节点上。它按源 IP 和目标 IP 聚合统计信息,并每 10 秒将其发送到 server。 * kubezonnet-server:聚合从 agent 发送的统计信息,解析网络统计信息对应的实际 pod、node 和 zone 关系,然后在 Prometheus metrics endpoint 上暴露这些统计信息。此组件可以每个集群部署一次,或者每个可用区部署一次(同样是为了节省跨可用区流量)。 ## 我该如何使用它? ### Metrics kubezonnet 的 server 部分在端口 8080 上暴露了一个 Prometheus metrics endpoint,可以被 Prometheus 抓取。设置完成后,`pod_cross_zone_network_traffic_bytes_total` 计数器将可用。 这将显示过去 5 分钟内每秒跨可用区网络流量排名前 20 的 Pod,单位为兆字节 (MB)。 ``` topk(20, rate(pod_cross_zone_network_traffic_bytes_total[5m])) / 1e6 ``` 在尝试理解云账单时,一段时间内的累计数量可能比当前使用量更有趣。此查询将显示过去一周内跨可用区网络流量排名前 20 的 Pod,单位为吉字节 (GB): ``` topk(20, increase(pod_cross_zone_network_traffic_bytes_total[1w])) / 1e9 ``` ### 日志 Server 还会记录类似于流日志的内容,可用于更详细地了解网络流量。每当 agent 发送统计信息时(每 10 秒),它们都会打印源 Pod 和目标 Pod 以及相关的网络流量。 ## 限制 * 目前仅支持 IPv4。 * 流量统计使用 IP 数据包大小,因此跳过了 IP 报头部分。建议使用这些统计信息来了解流量比例,而不将其用于计量目的或与其他包含 IP 报头的较低级别网络统计信息进行比较。 ## 路线图 * 支持 IPv6。 * 按工作负载(deployment、statefulset 等)汇总指标,因为要获得相同的洞察力并不需要 Pod 级别的粒度,而当需要更高粒度时,可以使用日志。 ## 致谢 许多人在将本项目的一些片段组合在一起的过程中提供了帮助。按无特定顺序排列,包括但不限于: * [Dylan Reimerink](https://github.com/dylandreimerink) * [Casey Callendrello](https://github.com/squeed) * [Chance Zibolski](https://github.com/chancez) * [Florian Lehner](https://github.com/florianl)
标签:API集成, Cilium, Docker镜像, GKE, Linux内核, Netfilter, NPM, PKI, Polarsignals, 云成本管理, 可观测性, 子域名突变, 客户端加密, 客户端加密, 客户端加密, 容器网络, 成本优化, 提示注入, 日志审计, 网络性能, 自定义请求头, 跨区域流量, 集群管理