4. Prometheus Operator 部署:使用 Helm 部署到 K8s 集群

在生产环境中,手动编写 Prometheus、Alertmanager 的 YAML 清单并维护其配置是一项繁琐且易出错的工作。Prometheus Operator 通过引入 Kubernetes 自定义资源定义(CRD)和控制器模式,将 Prometheus 集群的部署、配置、服务发现与告警规则管理全部声明式化。本节将演示如何使用 Helm 3 在 K8s 集群中快速部署 Prometheus Operator,并验证核心组件运行状态。

4.1 部署前提与环境检查

在开始部署前,请确保目标集群满足以下条件:

检查项 要求 验证命令
Kubernetes 版本 ≥ 1.20 kubectl version --short
Helm 版本 ≥ 3.8 helm version
集群资源 至少 2 核 CPU、4 GB 内存 kubectl describe node
存储类 默认 StorageClass 已配置 kubectl get sc
kubectl 权限 cluster-admin 或 namespace 管理员 kubectl auth can-i create crd
推荐实践: 建议在独立的命名空间(如 monitoring)中部署 Operator,便于资源隔离和权限管理。后续所有监控组件均部署在该命名空间下。

4.2 添加 Helm 仓库与更新索引

Prometheus Operator 的官方 Helm Chart 由 prometheus-community 维护。执行以下命令添加仓库并拉取最新索引:

# 添加 prometheus-community 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 更新本地仓库缓存
helm repo update

# 搜索可用的 Operator Chart 版本
helm search repo prometheus-community/kube-prometheus-stack --versions

输出示例(版本号以实际为准):

NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION
prometheus-community/kube-prometheus-stack              56.0.0          v0.72.0         kube-prometheus-stack collects Kubernetes...
版本锁定: 生产环境务必指定 --version 参数固定 Chart 版本,避免自动升级导致 CRD 不兼容。建议在部署前查阅 Release Notes 确认版本兼容性。

4.3 自定义 values.yaml 配置

直接使用默认参数部署会启动大量组件(如 Grafana、Node Exporter、kube-state-metrics 等)。对于网关 Pod 异常检测场景,我们按需裁剪配置。以下是一个面向生产的最小化 values.yaml 示例:

# values.yaml — 面向网关监控的最小化配置
# 全局设置
global:
  rbac:
    create: true
    pspEnabled: false

# 核心 Operator 配置
prometheusOperator:
  enabled: true
  logLevel: info
  # 启用 CRD 清理,避免残留
  cleanupCustomResource: true

# Prometheus 实例配置
prometheus:
  enabled: true
  # 使用默认的 prometheus 实例名称
  prometheusSpec:
    replicas: 1
    retention: 7d
    resources:
      requests:
        cpu: 500m
        memory: 1Gi
      limits:
        cpu: 1
        memory: 2Gi
    # 启用对自定义 ServiceMonitor 的自动发现
    serviceMonitorSelectorNilUsesHelmValues: false
    ruleSelectorNilUsesHelmValues: false

# Alertmanager 配置
alertmanager:
  enabled: true
  alertmanagerSpec:
    replicas: 1
    resources:
      requests:
        cpu: 100m
        memory: 256Mi

# 关闭非必需组件
grafana:
  enabled: false
kubeStateMetrics:
  enabled: false
nodeExporter:
  enabled: false
prometheus-node-exporter:
  enabled: false
kubelet:
  enabled: false
关键参数说明:
  • serviceMonitorSelectorNilUsesHelmValues: false — 允许 Operator 发现所有命名空间下的 ServiceMonitor,不局限于 Helm 标签。
  • ruleSelectorNilUsesHelmValues: false — 允许加载所有命名空间下的 PrometheusRule 资源。
  • cleanupCustomResource: true — 卸载 Chart 时自动删除关联的 CRD 实例,避免残留。

4.4 执行 Helm 部署

使用 helm install 命令部署 Prometheus Operator。建议先执行 --dry-run 预览生成的 YAML 清单:

# 创建监控命名空间
kubectl create namespace monitoring

# 预览部署清单(不实际安装)
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --values values.yaml \
  --version 56.0.0 \
  --dry-run

# 确认无误后执行实际安装
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --values values.yaml \
  --version 56.0.0

部署成功后,Helm 会输出安装摘要:

NAME: prometheus-stack
LAST DEPLOYED: Mon Jan 15 10:30:00 2024
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace monitoring get pods -l "release=prometheus-stack"

4.5 验证部署结果

部署完成后,执行以下命令验证核心组件是否正常运行:

# 查看 Pod 状态
kubectl -n monitoring get pods

# 预期输出示例
NAME                                                     READY   STATUS    RESTARTS   AGE
prometheus-stack-kube-prome-operator-7d8f9c6b9f-abc12    1/1     Running   0          2m
prometheus-stack-kube-prome-prometheus-0                 2/2     Running   0          2m
prometheus-stack-kube-prome-alertmanager-0               2/2     Running   0          2m

# 查看 CRD 是否注册
kubectl get crd | grep monitoring.coreos.com

# 预期输出
alertmanagerconfigs.monitoring.coreos.com         2024-01-15T10:30:00Z
alertmanagers.monitoring.coreos.com               2024-01-15T10:30:00Z
podmonitors.monitoring.coreos.com                 2024-01-15T10:30:00Z
probes.monitoring.coreos.com                      2024-01-15T10:30:00Z
prometheuses.monitoring.coreos.com                2024-01-15T10:30:00Z
prometheusrules.monitoring.coreos.com             2024-01-15T10:30:00Z
servicemonitors.monitoring.coreos.com             2024-01-15T10:30:00Z
thanosrulers.monitoring.coreos.com                2024-01-15T10:30:00Z
快速健康检查: 使用 kubectl -n monitoring port-forward svc/prometheus-stack-kube-prome-prometheus 9090:9090 将 Prometheus Web UI 映射到本地,访问 http://localhost:9090/targets 查看所有采集目标的状态。所有 Target 应显示 UP 状态。

4.6 组件架构与数据流

下图展示了部署完成后,Prometheus Operator 各组件之间的协作关系以及数据采集路径:

Prometheus Operator 组件架构与数据流 Prometheus Operator 组件架构与数据流 Kubernetes API ServiceMonitor CRD PrometheusRule CRD Prometheus Operator 控制器 CRD 监听 & 调和 Prometheus 采集引擎 规则评估 Alertmanager 告警去重 / 分组 路由 / 静默 网关 Pod /metrics 端点 业务指标暴露 监听 CRD 变更 生成配置 拉取 /metrics 推送告警 数据流说明: ① Operator 监听 K8s API 中的 ServiceMonitor/PrometheusRule CRD → ② 自动生成 Prometheus 采集配置与告警规则 → ③ Prometheus 从网关 Pod 的 /metrics 端点拉取指标 → ④ 触发告警规则后推送至 Alertmanager。

4.7 卸载与清理

如需卸载 Prometheus Operator 并清理所有资源(包括 CRD 实例),执行以下命令:

# 卸载 Helm Release(保留 CRD 定义)
helm uninstall prometheus-stack --namespace monitoring

# 彻底删除所有 CRD 实例(谨慎操作)
kubectl delete crd alertmanagerconfigs.monitoring.coreos.com
kubectl delete crd alertmanagers.monitoring.coreos.com
kubectl delete crd podmonitors.monitoring.coreos.com
kubectl delete crd probes.monitoring.coreos.com
kubectl delete crd prometheuses.monitoring.coreos.com
kubectl delete crd prometheusrules.monitoring.coreos.com
kubectl delete crd servicemonitors.monitoring.coreos.com
kubectl delete crd thanosrulers.monitoring.coreos.com

# 删除命名空间(将删除其下所有资源)
kubectl delete namespace monitoring
CRD 清理风险: 如果集群中其他应用也依赖 monitoring.coreos.com 的 CRD,删除 CRD 会导致相关资源无法访问。建议仅当确认无其他依赖时再执行 CRD 删除操作。

4.8 部署后检查清单

完成部署后,使用以下清单逐项确认环境就绪:

序号 检查项 验证方法 预期结果
1 Operator Pod 运行中 kubectl -n monitoring get pod -l app.kubernetes.io/name=prometheus-operator 1/1 Running
2 Prometheus Pod 运行中 kubectl -n monitoring get pod -l app.kubernetes.io/name=prometheus 2/2 Running
3 Alertmanager Pod 运行中 kubectl -n monitoring get pod -l app.kubernetes.io/name=alertmanager 2/2 Running
4 CRD 已注册 kubectl get crd | grep monitoring.coreos.com | wc -l ≥ 8
5 ServiceMonitor 可创建 kubectl -n monitoring apply -f - <<EOF apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: test spec: endpoints: - port: http selector: matchLabels: app: test EOF servicemonitor.monitoring.coreos.com/test created
6 Prometheus Web UI 可达 kubectl -n monitoring port-forward svc/prometheus-stack-kube-prome-prometheus 9090:9090 浏览器访问 localhost:9090 显示 Targets 页面

至此,Prometheus Operator 已成功部署到 K8s 集群中。下一阶段将基于 Operator 的 CRD 体系,为网关 Pod 定义 ServiceMonitor 和 PrometheusRule,实现指标采集与异常检测规则的声明式管理。