Kubernetes如何监控统计每个Ingress的流量吞吐量
统计NGINX Ingress单实例流量的实现方法
有多种成熟方案可以实现按Ingress维度统计收发流量,裸金属部署的K8s集群不需要额外适配,按需选择即可:
方案1:基于访问日志临时统计
NGINX Ingress Controller的默认访问日志已经内置了所需的维度字段,不需要额外修改配置就可以直接用:
- 日志内置字段
$ingress_name、$ingress_namespace可以定位到具体的Ingress资源 $request_length对应单请求的接收字节数,$bytes_sent对应单请求的发送字节数
如果只是临时统计特定时间段的流量,可以直接进入Ingress Controller Pod执行日志聚合命令,示例如下:
# 先确认日志字段顺序,根据你实际的日志模板调整awk的字段索引 kubectl logs -n ingress-nginx <你的Ingress Controller Pod名称> | grep '"ingress":"<目标Ingress名称>"' | awk '{recv+=$12; send+=$19} END {print "总接收流量:"recv/1024/1024" MB\n总发送流量:"send/1024/1024" MB"}'
方案2:基于Prometheus指标长期监控
如果需要持续统计、做流量趋势看板,直接用NGINX Ingress默认暴露的Prometheus指标聚合即可:
- 接收流量统计指标:
nginx_ingress_controller_request_size_bytes,按ingress、namespace标签分组求和即可得到对应Ingress的累计接收流量 - 发送流量统计指标:
nginx_ingress_controller_response_size_bytes,按ingress、namespace标签分组求和即可得到对应Ingress的累计发送流量
如果需要按时间窗口统计,使用increase函数即可,示例PromQL(统计最近1小时的流量):
# 接收流量 increase(nginx_ingress_controller_request_size_bytes{namespace="业务命名空间", ingress="目标Ingress名称"}[1h]) # 发送流量 increase(nginx_ingress_controller_response_size_bytes{namespace="业务命名空间", ingress="目标Ingress名称"}[1h])
如果集群已经部署了Prometheus+Grafana栈,直接导入官方的NGINX Ingress监控面板就能直接看到所有Ingress的实时、历史流量数据,不需要自行编写查询规则。
方案3:开启VTS模块做细粒度统计
如果需要更丰富的流量统计能力(比如按路由路径拆分、QPS关联统计、流量计费等),可以开启NGINX Ingress内置的VTS(Virtual Host Traffic Status)模块,开启后会输出更多维度的流量统计指标,满足复杂统计需求。
注意事项
不要使用节点网卡层面的流量做统计,该维度的流量包含了集群内部通信、其他业务的流量,无法精确拆分到单个Ingress的七层请求流量。
内容的提问来源于stack exchange,提问作者Quang Linh Le
相关产品推荐
相关产品推荐

