Grafana Agent在Kubernetes中仅抓取一个服务副本的问题排查
问题原因及解决方案
你现在的问题核心是:用Kubernetes Service域名作为target时,K8s会自动做负载均衡,Prometheus每次请求只会打到单个Pod,自然抓不到所有副本的metrics。
解决办法(推荐用K8s服务发现)
把static_configs换成Kubernetes服务发现配置,让Prometheus自动发现所有匹配标签的Pod,而非通过Service转发。示例配置如下:
- job_name: my-service honor_labels: true metrics_path: /metrics scheme: http kubernetes_sd_configs: - role: pod namespaces: names: - default relabel_configs: # 只保留带有app=my-service标签的Pod - source_labels: [__meta_kubernetes_pod_label_app] regex: my-service action: keep # 把Pod的8080端口作为metrics端口 - source_labels: [__meta_kubernetes_pod_container_port_number] regex: 8080 action: keep # 给metrics添加上Pod名称标签,方便后续排查 - source_labels: [__meta_kubernetes_pod_name] target_label: pod
为什么这个能解决问题?
Kubernetes服务发现会直接枚举集群中符合条件的所有Pod IP,Prometheus会挨个抓取每个Pod的metrics端点,不会被Service的负载均衡挡住。而且Pod扩容/缩容时,配置会自动同步,不用手动修改targets。
额外注意事项
- 确保你的Pod spec里已经声明了8080端口(
containerPort: 8080),否则服务发现可能识别不到端口 - 在Grafana面板中对请求计数指标做聚合时,记得用
sum by (xxx)(比如sum by (method) (request_count)),把所有Pod的计数加起来,才能得到全局统计数据
内容的提问来源于stack exchange,提问作者Andy Troschke
相关产品推荐
相关产品推荐

