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(社区推荐)。
cluster-admin 权限。
- 添加 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update - 创建命名空间
kubectl create namespace monitoring - 安装 kube-prometheus-stack
helm install prometheus-stack prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --set grafana.enabled=true \ --set alertmanager.enabled=true - 验证部署状态
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) |
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 自动发现并抓取目标指标:
4.5 验证 ServiceMonitor 生效
部署 ServiceMonitor 后,可通过以下方式验证 Prometheus 是否成功发现目标:
- 查看 Prometheus 目标页面
kubectl port-forward svc/prometheus-stack-kube-prom-prometheus 9090:9090 -n monitoring # 浏览器访问 http://localhost:9090/targets - 检查 ServiceMonitor 状态
kubectl get servicemonitor -n monitoring kubectl describe servicemonitor slo-app-monitor -n monitoring - 确认指标采集
# 在 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 实例的抓取负载。