之前的写法:把 pod ip 写入配置文件。如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 - job_name: 'service-endpoints-metrics' kubernetes_sd_configs: - role: endpoints metrics_path: /actuator/prometheus static_configs: - targets: ['172.20.87.93:8088' ] labels: app: idk-sdk - targets: ['172.20.232.20:8088' ] labels: app: idk-sdk - targets: ['172.20.87.192:8088' ] labels: app: idk-sdk - targets: ['172.20.86.26:8088' ] labels: app: idk-sdk - targets: ['172.20.60.87:8088' ] labels: app: idk-sdk - targets: ['172.20.22.247:8088' ] labels: app: idk-sdk - targets: ['172.20.83.23:8088' ] labels: app: idk-tsp - targets: ['172.20.22.165:8088' ] labels: app: idk-tsp - targets: ['172.20.63.105:8088' ] labels: app: idk-tsp - targets: ['idk-mob-app:8088' ] labels: app: idk-app
痛点分析:
在 Kubernetes 中,直接使用 Pod IP 进行监控存在明显的局限性:一旦 Pod 发生重新部署或被节点驱逐,Pod IP 就会发生漂移,导致监控端必须频繁手动更新目标 IP。
如果转而使用 Service 地址进行监控,在单副本(Single Pod)情况下尚可正常工作;但若处于多副本(Multiple Pods)场景下,Service 自带的负载均衡(轮询机制)会导致每次监控指标抓取(Scrape)流量被随机分发到不同的 Pod 上。这不仅会导致时序数据出现剧烈的指标跳变(Data Fluctuation),还会引发 Counter(计数器)等类型的数据因无法正确累加而产生成倍的统计偏差(而正常的业务预期应当是获取所有 Pod 的数据总和)。
如果你的 kubeconfig 只有某个命名空间的权限,则需要指定命名空间,不然会因为权限被拒绝无法继续执行下去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - job_name: 'vos-metrics' metrics_path: '/actuator/prometheus' kubernetes_sd_configs: - role: endpoints kubeconfig_file: /app/kube-config namespaces: names: - llll relabel_configs: - source_labels: [__meta_kubernetes_service_name ] target_label: app111 - source_labels: [__meta_kubernetes_pod_ip ] target_label: instance
这样就算没有所有权限也可以进行抓取到 service endpoint metrics 了