如何监控K8s集群中Pod的外部网络收发流量?
Kubernetes Pod 外部网络流量监控方案
方法1:借助支持流量标记的CNI插件
- 像Calico、Cilium这类CNI原生支持流量追踪与标记,能直接区分内外集群流量:
- Cilium + Hubble:启用Hubble的metrics采集后,
hubble_flows_total指标会自带source_is_external、destination_is_external标签,直接通过这两个标签过滤就能得到Pod的外部收发流量(比如sum by (pod) (hubble_flows_total{source_is_external="true",direction="ingress"})统计外部流入Pod的流量)。 - Calico:通过Calico Felix组件暴露的
calico_flow_*指标,结合集群CIDR配置,过滤源/目的IP不在集群范围内的流量,就能统计外部流量。
- Cilium + Hubble:启用Hubble的metrics采集后,
方法2:基于eBPF的精准流量统计
- 用eBPF工具直接在节点层面追踪Pod的网络请求,无需修改CNI:
- 自定义eBPF程序:编写简单的eBPF程序,挂载到socket或网络协议栈,判断每个数据包的源IP是否属于集群CIDR(Pod CIDR、Service CIDR),然后统计对应Pod的外部收发字节数,导出为Prometheus指标。
- 现成工具:比如Pixie,它用eBPF自动注入节点,无需额外配置就能追踪Pod的内外流量,直接提供
px_k8s_pod_network_bytes_total这类带traffic_direction(internal/external)标签的指标。
方法3:扩展现有Prometheus指标维度
- 针对现有的
container_network_receive_bytes_total和container_network_transmit_bytes_total指标,补充内外区分的标签:- 开发自定义exporter:定期从Kubernetes API获取集群的Pod CIDR、Service CIDR,然后读取节点上每个Pod的网络统计(从cgroup的
net_cls或/proc下的网络文件),判断流量的源/目的IP范围,生成带external标签的新指标(比如container_network_external_receive_bytes_total)。 - 结合kube-state-metrics:用kube-state-metrics获取Pod与Service的关联关系,再通过node-exporter的
node_network_receive_bytes_total指标,过滤对应NodePort/LoadBalancer服务的流量,关联到后端Pod。
- 开发自定义exporter:定期从Kubernetes API获取集群的Pod CIDR、Service CIDR,然后读取节点上每个Pod的网络统计(从cgroup的
方法4:替换专用流量监控工具
- 如果k8spacket不符合需求,可以尝试:
- Weave Scope:虽然主打可视化,但也能导出包含内外流量区分的Prometheus指标,通过
scope_pod_network_*系列指标即可统计Pod外部流量。 - Istio:如果集群用了Service Mesh,Istio的
istio_request_bytes_total和istio_response_bytes_total指标自带source_workload_namespace、destination_workload_namespace标签,可通过判断命名空间是否属于集群内部(或源IP是否外部)来过滤。
- Weave Scope:虽然主打可视化,但也能导出包含内外流量区分的Prometheus指标,通过
内容的提问来源于stack exchange,提问作者Ali Rezvani
相关产品推荐
相关产品推荐

