4. Prometheus Operator 部署:Helm 安装、CRD 资源、ServiceMonitor 配置

在 Kubernetes 集群中部署 Prometheus 生态,推荐使用 Prometheus Operator。它通过自定义资源定义(CRD)将 Prometheus 与 Alertmanager 的运维逻辑声明式地映射为 Kubernetes 原生资源,大幅降低配置管理与版本升级的复杂度。本章将围绕 Helm 安装、核心 CRD 资源解析以及 ServiceMonitor 配置展开,为后续误差预算指标采集奠定基础。

4.1 Helm 安装 Prometheus Operator

Helm 是 Kubernetes 的包管理工具,使用官方 Chart 可快速部署完整 Operator 栈。以下步骤基于 Helm 3.x 与 kube-prometheus-stack Chart(社区推荐)。

前置条件: 确保集群已安装 Helm 客户端,且具备 cluster-admin 权限。
  1. 添加 Helm 仓库
    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    helm repo update
  2. 创建命名空间
    kubectl create namespace monitoring
  3. 安装 kube-prometheus-stack
    helm install prometheus-stack prometheus-community/kube-prometheus-stack \
      --namespace monitoring \
      --set grafana.enabled=true \
      --set alertmanager.enabled=true
  4. 验证部署状态
    kubectl get pods -n monitoring
    kubectl get crd | grep monitoring

安装完成后,集群中会自动创建 Prometheus、Alertmanager、Grafana 实例以及所有必需的 CRD 资源。

4.2 核心 CRD 资源解析

Prometheus Operator 引入了多个 CRD,用于声明式管理监控组件。下表列出与误差预算台账最相关的 CRD 及其用途:

CRD 名称 API 版本(示例) 核心用途
Prometheus monitoring.coreos.com/v1 定义 Prometheus 实例的规格、副本数、存储、保留策略等
Alertmanager monitoring.coreos.com/v1 定义 Alertmanager 集群配置、路由、抑制规则
ServiceMonitor monitoring.coreos.com/v1 定义如何从 Service 抓取指标(标签匹配、端点、间隔)
PodMonitor monitoring.coreos.com/v1 定义如何从 Pod 直接抓取指标(无需 Service)
PrometheusRule monitoring.coreos.com/v1 定义告警规则与记录规则(Recording Rules)
关键理解: ServiceMonitor 是连接“应用服务”与“Prometheus 实例”的桥梁。误差预算指标采集依赖 ServiceMonitor 自动发现目标端点。

4.3 ServiceMonitor 配置详解

ServiceMonitor 通过标签选择器关联 Kubernetes Service,并指定抓取路径、端口、间隔等参数。以下是一个面向误差预算应用的典型配置:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: slo-app-monitor
  namespace: monitoring
  labels:
    release: prometheus-stack   # 必须与 Prometheus CR 的 serviceMonitorSelector 匹配
spec:
  selector:
    matchLabels:
      app: slo-app              # 匹配目标 Service 的标签
  endpoints:
  - port: metrics               # Service 中定义的端口名称
    interval: 15s               # 抓取间隔,建议与 SLO 窗口对齐
    path: /metrics              # 指标暴露路径
    scheme: http
  namespaceSelector:
    matchNames:
    - production                # 限定只抓取 production 命名空间

配置要点:

  • 标签匹配: spec.selector.matchLabels 必须与目标 Service 的 labels 一致。
  • release 标签: Prometheus CR 通过 serviceMonitorSelector 筛选 ServiceMonitor,默认匹配 release: prometheus-stack。
  • 抓取间隔: 误差预算计算通常基于 1 分钟或 5 分钟窗口,建议间隔 ≤ 30s 以保证数据粒度。
  • 命名空间限制: 使用 namespaceSelector 控制采集范围,避免跨命名空间干扰。

4.4 ServiceMonitor 与 Prometheus 关联流程

下图展示了 ServiceMonitor 如何驱动 Prometheus 自动发现并抓取目标指标:

ServiceMonitor 驱动 Prometheus 自动发现流程 ServiceMonitor CR Prometheus Operator Prometheus 实例 Kubernetes Service 应用 Pod (metrics) 抓取目标列表 说明:ServiceMonitor 通过标签匹配 Service,Operator 自动生成抓取配置,Prometheus 定期拉取 /metrics 端点

4.5 验证 ServiceMonitor 生效

部署 ServiceMonitor 后,可通过以下方式验证 Prometheus 是否成功发现目标:

  1. 查看 Prometheus 目标页面
    kubectl port-forward svc/prometheus-stack-kube-prom-prometheus 9090:9090 -n monitoring
    # 浏览器访问 http://localhost:9090/targets
  2. 检查 ServiceMonitor 状态
    kubectl get servicemonitor -n monitoring
    kubectl describe servicemonitor slo-app-monitor -n monitoring
  3. 确认指标采集
    # 在 Prometheus UI 的 Graph 页面查询
    up{job="slo-app"}
常见问题: 如果目标显示为 0 up / 1 down,请检查 Service 端口名称是否与 ServiceMonitor 中 port 字段一致,以及 namespaceSelector 是否覆盖目标命名空间。

4.6 多环境 ServiceMonitor 策略

在误差预算台账场景中,通常需要区分生产、预发、测试环境。推荐使用 命名空间隔离 + 标签继承 策略:

环境 命名空间 ServiceMonitor 标签 抓取间隔
生产 production env: prod 15s
预发 staging env: staging 30s
测试 testing env: test 60s

通过为每个环境创建独立的 ServiceMonitor,并利用 Prometheus CR 的 serviceMonitorNamespaceSelector 限制采集范围,可避免指标混淆,同时降低 Prometheus 实例的抓取负载。

4.7 本章小结