首页/云/可观测性速查/kubernetes_sd:Kubernetes 服务发现
Prometheus 与采集64 条

kubernetes_sd:Kubernetes 服务发现

kubernetes_sd_configs 以集群 API 为数据源,按 role(node、pod、service、endpoints 等)生成目标候选,再用 relabel 筛选与改写;是采集 K8s 工作负载的标准方式。

可观测性速查云更新于 2026-10-13

kubernetes_sd 是什么

kubernetes_sd_configs 让 Prometheus 直接以 Kubernetes API 为数据源发现抓取目标:按 role 生成候选目标,每个候选带一组 __meta_kubernetes_* 元标签,再用 relabel_configs 筛选、改写后成为真正的抓取目标。Pod 频繁重建、IP 不断变化的集群里,用服务发现替代静态列表是标准做法,它也是 Prometheus Operator 生成抓取配置的底层机制。

基本信息

适用平台Kubernetes(Prometheus 2.x)
配置位置scrape_configs 下的 kubernetes_sd_configs
认证方式集群内用 ServiceAccount,集群外用 kubeconfig
关键机制role 生成候选 + relabel 筛选
元标签前缀__meta_kubernetes_
常用 rolenode / pod / service / endpoints / ingress

典型使用场景

  • 抓取集群内应用的 /metrics:用 pod 或 endpoints role 发现真实后端
  • 采集节点资源指标:用 node role 发现 kubelet 的地址与端口
  • 用 Pod 注解(prometheus.io/scrape)让应用自助声明是否被抓取
  • 按命名空间或标签做多租户隔离,只采本团队的目标
  • 集群外 Prometheus 通过 API Server 发现集群内目标并统一接入
  • 配合 kube-state-metrics 与 cAdvisor 补齐对象状态与资源用量两个视角

按 Pod 注解筛选抓取目标

按 Pod 注解筛选抓取目标
- job_name: kubernetes-pods
  kubernetes_sd_configs:
    - role: pod                      # 按 Pod 生成候选目标
  relabel_configs:
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
      action: keep                   # 只保留声明要抓取的 Pod
      regex: 'true'
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
      target_label: __metrics_path__ # 覆盖默认 /metrics 路径
      regex: '(.+)'
    - source_labels: [__meta_kubernetes_namespace]
      target_label: namespace        # 保留租户维度便于查询

常用 role

role对应的目标典型用途
node集群节点(kubelet)节点资源指标
podPod IP 与容器端口应用指标抓取
serviceService 虚拟 IPService 级端点发现
endpointsEndpoints 的每个后端按真实后端抓取
ingressIngress 规则入口探测类场景
生产中通常由 Prometheus Operator 或平台自动化生成这套配置,手写时优先从官方示例起步,避免 relabel 规则遗漏。
endpoints role 的候选是每个真实后端地址,比 service role 的虚拟 IP 更贴近实际流量;直接用虚拟 IP 抓取会丢失单实例粒度。
relabel 之后还有 metric_relabel_configs,它作用于抓到的样本而非目标;两者配合能同时控制目标数量与序列数量。
role 的选择决定标签维度:pod role 带 pod、namespace 与 container 维度,endpoints role 带 service 与 endpoint 维度,按需要的下钻粒度挑 role。
集群规模大时服务发现本身也有开销:API Server 的 watch 连接、元标签数量都会随对象数增长,抓取频率与范围要一并评估。

易错点

  • __meta_* 标签只在 relabel 阶段可用,写进 target_label 前要确认来源标签真实存在
  • API server 权限或网络不通时服务发现静默失败,Targets 页面显示空列表
  • keep 规则正则写错会把全部候选丢弃,现象是目标一个都没有而非报错
  • Pod 未暴露容器端口时需要用注解补端口,只按注解抓取会漏掉端口未声明的目标
  • 抓取范围过宽(如全命名空间的 pod)会让目标与序列量暴涨,应按标签或命名空间收敛
  • 换 role 后旧标签消失,依赖这些标签的看板与告警会变成空图,切换前先确认下游引用

数据来源与参考

  • Prometheus 文档 · kubernetes_sd_config
  • prometheus-operator 项目文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌