如何配置Prometheus抓取Kubernetes LoadBalancer Ingress字段?
问题描述
在Kubernetes集群中使用Prometheus Helm Chart监控服务,但无法让Prometheus发现或抓取Kubernetes Service的LoadBalancer Ingress字段。
Service配置
Name: postgres-xyz-postgresql-primary Namespace: xyz Labels: app.kubernetes.io/component=primary app.kubernetes.io/instance=postgres-app app.kubernetes.io/managed-by=Helm app.kubernetes.io/name=postgresql app.kubernetes.io/version=17.0.0 helm.sh/chart=postgresql-16.0.1 Annotations: meta.helm.sh/release-name: postgres-app meta.helm.sh/release-namespace: xyz Selector: app.kubernetes.io/component=primary,app.kubernetes.io/instance=postgres-app,app.kubernetes.io/name=postgresql Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: IPs: LoadBalancer Ingress: aoo000nnbbgghhsdfg-182496858.us-east-1.elb.amazonaws.com Port: tcp-postgresql 5432/TCP TargetPort: tcp-postgresql/TCP NodePort: tcp-postgresql 32599/TCP Endpoints: 10.0.91.92:5432 Session Affinity: None External Traffic Policy: Cluster
当前Prometheus抓取配置
- job_name: 'kubernetes-services' honor_labels: true metrics_path: /probe params: module: [http_2xx] kubernetes_sd_configs: - role: service relabel_configs: - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] action: keep regex: true - source_labels: [__address__] target_label: __param_target - target_label: __address__ replacement: blackbox - source_labels: [__param_target] target_label: instance - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] target_label: namespace - source_labels: [__meta_kubernetes_service_name] target_label: service
尝试添加以下relabel规则但未成功捕获LoadBalancer Ingress值:
- source_labels: [__meta_kubernetes_service_annotation_external_dns_hostname] target_label: loadbalancer_ingress
疑问
- 如何修改Prometheus的relabel_configs以在抓取时包含LoadBalancer Ingress字段?
- kubernetes_sd_configs中是否有对应LoadBalancer Ingress字段的特定标签或字段?
- 是否需要单独配置来显式针对LoadBalancer类型的Service?
额外信息
- Kubernetes版本:1.30
- Prometheus Helm Chart版本:prometheus-26.0.0
解决方案
1. 修改relabel_configs捕获LoadBalancer Ingress字段
直接使用Prometheus Kubernetes服务发现提供的内置元标签,添加以下relabel规则到你的relabel_configs中:
- source_labels: [__meta_kubernetes_service_load_balancer_ingress_hostname] target_label: loadbalancer_ingress action: replace
如果你的LoadBalancer Ingress是IP而非主机名,替换为__meta_kubernetes_service_load_balancer_ingress_ip即可。
若需仅针对LoadBalancer类型的Service保留该标签,可在规则前添加过滤条件:
- source_labels: [__meta_kubernetes_service_type] action: keep regex: LoadBalancer
2. kubernetes_sd_configs中对应LoadBalancer Ingress的元标签
是的,Prometheus针对LoadBalancer类型的Service提供了两个专属元标签:
__meta_kubernetes_service_load_balancer_ingress_hostname:对应Service的LoadBalancer Ingress主机名(如你的AWS ELB域名)__meta_kubernetes_service_load_balancer_ingress_ip:对应Service的LoadBalancer Ingress IP地址
这些标签仅在Service类型为LoadBalancer且Ingress字段已被云提供商分配后才会生成。
3. 是否需要单独配置针对LoadBalancer类型的Service?
根据需求决定:
- 若抓取作业仅需处理LoadBalancer类型的Service,可在
relabel_configs开头添加过滤规则,只保留目标类型的服务:
- source_labels: [__meta_kubernetes_service_type] action: keep regex: LoadBalancer
- 若需同时处理多类型Service,但仅为LoadBalancer类型添加
loadbalancer_ingress标签,可给relabel规则增加匹配条件:
- source_labels: [__meta_kubernetes_service_type, __meta_kubernetes_service_load_balancer_ingress_hostname] target_label: loadbalancer_ingress regex: LoadBalancer;(.*) replacement: $1
内容的提问来源于stack exchange,提问作者Atish Humbre
相关产品推荐
相关产品推荐

