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, 云成本管理, 可观测性, 子域名突变, 客户端加密, 客户端加密, 客户端加密, 容器网络, 成本优化, 提示注入, 日志审计, 网络性能, 自定义请求头, 跨区域流量, 集群管理