如何让Prometheus动态配置可伸缩Kubernetes Pod的IP以抓取指标?
在Kubernetes环境中,要让Prometheus自动追踪扩缩容的Pod并抓取指标,核心是利用Prometheus的Kubernetes服务发现机制,以下是几种实用方案:
方案1:通过Service + Endpoints动态发现(最常用)
这种方案依赖Kubernetes Service的Endpoints自动更新特性,当Pod扩缩容时,Endpoints会同步新增/删除Pod IP,Prometheus通过监听Endpoints实现动态抓取。
给目标Pod打统一标签
确保所有需要被抓取的Pod都带有相同标签,比如app: metrics-app。创建对应Service
定义一个Service,selector匹配上述标签,并暴露metrics端口:apiVersion: v1 kind: Service metadata: name: metrics-app-service namespace: default spec: selector: app: metrics-app ports: - name: metrics port: 9090 targetPort: 9090 # 对应Pod中metrics监听的端口配置Prometheus抓取规则
在Prometheus的scrape_configs中添加以下配置,过滤出目标Service的Endpoints:scrape_configs: - job_name: 'metrics-app' kubernetes_sd_configs: - role: endpoints namespaces: names: - default # 替换为Pod所在命名空间 relabel_configs: # 只保留标签为app=metrics-app的Service对应的Endpoints - source_labels: [__meta_kubernetes_service_label_app] regex: metrics-app action: keep # 只保留端口名为metrics的端点 - source_labels: [__meta_kubernetes_endpoint_port_name] regex: metrics action: keep # 拼接目标地址(如果端口不是默认的,替换为实际端口) - target_label: __address__ replacement: '$1:9090'
方案2:直接基于Pod服务发现
如果不想创建Service,可以直接让Prometheus发现带有指定标签的Pod,适合更灵活的场景。
配置Prometheus抓取规则:
scrape_configs: - job_name: 'metrics-app-pods' kubernetes_sd_configs: - role: pod namespaces: names: - default relabel_configs: # 过滤标签为app=metrics-app的Pod - source_labels: [__meta_kubernetes_pod_label_app] regex: metrics-app action: keep # 保留包含metrics端口的容器 - source_labels: [__meta_kubernetes_pod_container_port_name] regex: metrics action: keep # 拼接Pod IP和端口作为抓取地址 - source_labels: [__meta_kubernetes_pod_ip, __meta_kubernetes_pod_container_port_number] separator: ':' target_label: __address__
方案3:通过Prometheus Operator自动化管理
如果用Prometheus Operator来管理Prometheus实例,直接通过ServiceMonitor资源实现自动化配置,无需手动修改Prometheus配置文件。
创建ServiceMonitor资源
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: metrics-app-monitor namespace: monitoring # 替换为Prometheus所在命名空间 labels: release: prometheus # 匹配Prometheus实例的标签(需和Prometheus CR的标签一致) spec: selector: matchLabels: app: metrics-app # 匹配目标Service的标签 endpoints: - port: metrics # Service中定义的metrics端口名称 path: /metrics interval: 30s # 抓取间隔 namespaceSelector: matchNames: - default # 目标Service所在命名空间验证效果
Prometheus Operator会自动将ServiceMonitor的配置同步到Prometheus实例,当Pod扩缩容时,Service的Endpoints更新后,Prometheus会自动开始抓取新Pod的指标。
注意事项
- 确保网络策略允许Prometheus所在命名空间访问目标Pod的metrics端口,避免抓取失败。
- 可以通过Prometheus UI的「Service Discovery」页面,查看当前发现的目标列表,验证配置是否生效。
- 如果Pod的metrics端点需要认证,需在抓取配置中添加对应认证参数(如
basic_auth)。
内容的提问来源于stack exchange,提问作者Faramarz Qoshchi

