【Prometheus】核心配置架构与 Kubernetes 服务发现实战全解

admin / Prometheus / 已更新 2026-09-22 / 3405 字 · 约 21 分钟 / 655 次阅读 /

在云原生与微服务体系中,Prometheus 凭借其强大的多维数据模型、高效的时序数据库(TSDB)与灵活的 PromQL 查询语言,已成为事实上的监控标准。而在高动态的 Kubernetes 集群中,Pod 与节点频繁漂移、销毁与扩容,传统的静态 IP 目标配置完全无法满足需求。

深入理解 Prometheus 的核心配置体系、Relabeling(标签重写)流转机制以及针对 Kubernetes 的动态服务发现(Service Discovery),是构建企业级可观测性平台的核心基本功。

本文将从全局配置参数、抓取规则、标签重写引擎、Kubernetes 5 种服务发现角色以及生产降本场景进行全方位拆解。


一、Prometheus 配置体系与启动参数速查

Prometheus 的配置主要由两部分组成:CLI 命令行启动参数(控制进程级别运行时底层行为)与 prometheus.yml 主配置文件(控制抓取目标、规则计算与告警流向)。

1. 核心启动参数矩阵

启动参数项 默认配置值 生产建议 / 功能说明
--config.file prometheus.yml 指定主配置文件路径
--web.listen-address 0.0.0.0:9090 Web UI 与 API 监听端口,内网环境建议绑定内网 IP
--web.enable-lifecycle false 强烈建议开启! 允许通过 HTTP POST /-/reload 平滑热重载配置
--storage.tsdb.path data/ TSDB 数据落盘目录,建议挂载高性能独立 SSD
--storage.tsdb.retention.time 15d 数据保留周期(如 30d90d),超时冷数据自动清理
--query.timeout 2m 单次 PromQL 查询超时上限,避免大范围复杂查询把 Server 打崩
--query.max-concurrency 20 最大并发查询数,可根据服务器 CPU 核心数适度调大
--log.level info 日志输出级别:debuginfowarnerror

[!TIP] 零停机平滑热重载: 启动参数配置 --web.enable-lifecycle 后,若修改了抓取规则或告警策略,无需重启 Prometheus 进程: bash curl -X POST http://localhost:9090/-/reload


二、prometheus.yml 核心配置结构深度解析

prometheus.yml 由五个顶级配置段组成:

根配置段 核心功能与职责
global 全局公共配置:默认抓取间隔、规则计算周期及全局外部标签
alerting 告警管理器(Alertmanager)连接与实例发现配置
rule_files 告警规则与记录规则(Recording Rules)文件路径清单
scrape_configs 最核心模块:定义所有抓取任务(Job)、目标发现与指标过滤
remote_write / read 远程存储读写配置(如接入 VictoriaMetrics、Thanos 或 InfluxDB)

生产级标准骨架配置

# 1. 全局配置
global:
  scrape_interval: 15s      # 默认指标采集间隔 (推荐 15s-30s)
  evaluation_interval: 15s  # 告警与记录规则评估计算间隔
  scrape_timeout: 10s       # 单次拉取超时时间 (必须小于 scrape_interval)
  external_labels:          # 联邦集群或远程存储时区分来源的全局标签
    cluster: prod-k8s-01
    region: cn-beijing

# 2. 告警管理器关联
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['alertmanager.monitoring.svc:9093']

# 3. 告警与预聚合规则载入
rule_files:
  - "/etc/prometheus/rules/*.yml"

# 4. 抓取任务配置列表
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

# 5. 远程长期存储归档 (可选)
remote_write:
  - url: "http://victoriametrics:8428/api/v1/write"
    queue_config:
      capacity: 10000
      max_samples_per_send: 1000

三、Relabeling 标签重写引擎核心机制

Relabeling 是 Prometheus 数据管道中最强大、也最容易混淆的设计。Prometheus 提供了两个阶段的 Relabel 配置:

1. relabel_configs vs metric_relabel_configs

对比维度 relabel_configs (抓取前) metric_relabel_configs (抓取后)
执行时机 指标抓取请求发生之前 指标拉取成功之后、写入 TSDB 之前
操作对象 针对服务发现的元数据标签(以 __meta_ 开头)与 Target 目标 针对拉取到的具体时序数据指标样本(Series)
核心能力 动态改写 Target 的抓取地址(__address__)、Path、鉴权与过滤丢弃不可用 Target 过滤/丢弃高基数或不需要的 Metric 指标,修改已采集的标签值
资源消耗 仅在 Target 发现时计算一次,开销极低 每个抓取周期对所有采集到的时序样本逐条过滤,需注意正则性能

2. 六大 Action 动作矩阵

Action 类型 动作描述 典型生产应用场景
replace (默认) 根据 regex 匹配 source_labels,将结果写入 target_label 将元标签 __meta_kubernetes_pod_name 规范重命名为 pod
keep 仅保留匹配 regex 的 Target 或 Metric,其余丢弃 仅抓取配置了 prometheus.io/scrape=true 的服务
drop 凡是匹配 regex 的 Target 或 Metric 全部丢弃 丢弃开发测试环境容器,或丢弃 etcd_debugging_* 指标
labelmap 匹配标签名(Label Name),将捕获组重命名为新标签 提取所有 K8s Node/Pod 业务标签批量映射为 Prometheus 标签
labeldrop 匹配正则的标签将被从时序中移除 剔除版本号微变等高变动噪点标签,防止时序爆炸
hashmod 对源标签做 Hash 取模,将计算值写入目标标签 超大规模集群中将 Target 水平分片(Sharding)到多个 Server

四、Kubernetes 动态服务发现实战 (5 大角色全解)

Prometheus 采用 Pull 模式拉取指标,必须实时感知容器生命周期的动态变化。通过与 Kubernetes APIServer 交互,Prometheus 内置了 5 种原生角色(Role)的服务发现能力:

+-------------------------------------------------------------+
|                  Kubernetes API Server                      |
+-------------------------------------------------------------+
        |                |               |             |
        v                v               v             v
  [role: node]    [role: endpoints] [role: pod]  [role: ingress]
        |                |               |             |
+-------------------------------------------------------------+
|                Prometheus Relabeling 引擎                   |
+-------------------------------------------------------------+

1. 部署前置:RBAC 最小权限清单

Prometheus 访问 Kubernetes API 需要授予只读权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources: ["nodes", "nodes/proxy", "services", "endpoints", "pods"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["extensions", "networking.k8s.io"]
  resources: ["ingresses"]
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitoring

2. 角色一:role: node(宿主机与 Kubelet/cAdvisor 监控)

通过 APIServer 代理安全拉取各个物理节点 Node 及其 cAdvisor 容器性能指标:

- job_name: 'kubernetes-cadvisor'
  scheme: https
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  kubernetes_sd_configs:
    - role: node
  relabel_configs:
    # 1. 批量映射 Node 原生标签
    - action: labelmap
      regex: __meta_kubernetes_node_label_(.+)
    # 2. 将目标地址改写为 Kubernetes API Server 地址代理请求
    - target_label: __address__
      replacement: kubernetes.default.svc:443
    # 3. 将抓取路径重写为 cAdvisor 代理路径
    - source_labels: [__meta_kubernetes_node_name]
      regex: (.+)
      target_label: __metrics_path__
      replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

3. 角色二:role: endpoints(最核心的业务微服务采集)

这是 Kubernetes 生产中最核心的角色。一个 Service 会对应多个后端 Endpoints(即真实 Pod IP + Port):

- job_name: 'kubernetes-service-endpoints'
  kubernetes_sd_configs:
    - role: endpoints
  relabel_configs:
    # 规则 1: 仅保留配置了 prometheus.io/scrape=true 的 Endpoints
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
      action: keep
      regex: true
    # 规则 2: 支持通过 Annotation 动态覆盖 scheme (http 或 https)
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
      action: replace
      target_label: __scheme__
      regex: (https?)
      replacement: $1
    # 规则 3: 支持通过 Annotation 动态自定义 metrics_path (默认 /metrics)
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
      action: replace
      target_label: __metrics_path__
      regex: (.+)
      replacement: $1
    # 规则 4: 动态端口重写
    - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
      action: replace
      target_label: __address__
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
    # 规则 5: 规范业务维度标签
    - source_labels: [__meta_kubernetes_namespace]
      target_label: namespace
    - source_labels: [__meta_kubernetes_service_name]
      target_label: service

五、生产级典型实战场景

1. 生产指标降本:利用 metric_relabel_configs 丢弃高基数无效数据

在很多第三方组件(如 Etcd、Ingress-Nginx、Envoy)中,默认会暴露大量毫秒级、请求级别的调试指标,极易引发时序爆炸。可在抓取后直接丢弃:

scrape_configs:
  - job_name: 'etcd'
    static_configs:
      - targets: ['10.0.0.10:2379']
    metric_relabel_configs:
      # 丢弃所有 debugging 调试指标和 disk 日常操作明细指标
      - source_labels: [__name__]
        regex: etcd_(debugging|disk_backend_commit_rebalance).*
        action: drop

2. 跨地域多机房:Prometheus 联邦集群(Federation)汇聚

当业务跨越多个云厂商、多 IDC 或多个 K8s 集群时,可在每个边缘集群部署 Local Prometheus 采集高频明细,并在中心集群部署 Global Prometheus,通过 /federate 仅抓取预聚合指标:

scrape_configs:
  - job_name: 'federate-shanghai-cluster'
    scrape_interval: 30s
    honor_labels: true    # 保持边缘集群的原生标签不被覆盖
    metrics_path: '/federate'
    params:
      'match[]':
        - '{job="node-exporter"}'            # 仅汇聚主机监控
        - '{__name__=~"job:.*"}'             # 仅拉取边缘已预聚合的 Recording Rules
    static_configs:
      - targets:
        - 'prometheus-edge-shanghai.internal:9090'

六、总结与生产调优建议

  1. 善用 Annotation 自动化解耦:避免在 Prometheus 配置文件中写死静态 IP,全面推行 prometheus.io/scrape=true 规范,让业务交付与监控自动绑定;
  2. 严防时序基数爆炸:定期排查高基数指标,善用 metric_relabel_configsdroplabeldrop,阻断无业务价值指标入库;
  3. 分层分治架构:单集群时序规模超 200 万时,应及时采用 Federation 联邦或切换至 VictoriaMetrics / Thanos 等分布式架构。
admin

admin

云原生架构 · 全栈开发

感谢阅读本文!记录系统架构思考与实战复盘。专注于 Python、Django、PostgreSQL 与云原生容器化工程实践。