文章中如果有图看不到,可以点这里去 csdn 看看。从那边导过来的,文章太多,没法一篇篇修改好。

【监控】Prometheus Operator 详解【工程化 & Thanos 组合架构】

一、Prometheus Operator 简介

  • Prometheus Operator 是由 CoreOS(后被 Red Hat 收购)开源的 Kubernetes Operator,专门用于简化 Prometheus 及相关组件(Alertmanager、Grafana)的部署与管理。

  • 它通过 CRD(CustomResourceDefinition) 扩展 Kubernetes API,对外提供声明式配置。

  • 主要 CRD 包括:

    • Prometheus(Prometheus 集群实例)
    • ServiceMonitor(服务指标发现规则)
    • PodMonitor(Pod 指标发现规则)
    • Alertmanager(告警管理集群)
    • PrometheusRule(告警与录制规则)

二、Prometheus Operator 关键流程

1. 整体架构

CRDs 定义
Prometheus/ServiceMonitor/Alertmanager
用户提交 CR YAML
Prometheus Operator Controller
Reconcile 循环
生成 StatefulSet/Deployment
生成 ConfigMap/Secret
更新 Service / Endpoint
Prometheus 实例运行

2. 核心 Reconcile 循环(源码逻辑简化)

Operator 基于 Kubernetes Controller 模式,典型逻辑为:

for {
    // Step 1: 监听 Prometheus/ServiceMonitor/Alertmanager 等 CR 事件
    cr := watchCRD()

    // Step 2: 校验配置合法性
    validate(cr)

    // Step 3: 对比 Desired State 与 Actual State
    desired := buildK8sResources(cr)
    actual := getClusterResources(cr)

    // Step 4: 调谐差异,执行增删改操作
    sync(desired, actual)

    // Step 5: 更新 CR 的 Status 字段
    updateStatus(cr)
}
  • 核心点

    • Operator 并不是直接运行 Prometheus,而是 生成 StatefulSet + ConfigMap + Service 等 K8s 资源,让 K8s 保证运行状态。
    • Prometheus 配置文件由 Operator 自动生成(避免用户手工维护复杂的 prometheus.yml)。

三、Prometheus Operator 工程化实现建议

1. 升级策略

  • 无损升级:利用 StatefulSet 滚动更新,保证一个实例升级时,其他副本仍能工作。
  • 多版本灰度:使用 spec.replicas > 1 + PodDisruptionBudget 保证最少可用实例数。
  • 版本管理:建议采用 Helm + GitOps(ArgoCD / FluxCD) 统一控制 Operator 与 CRD 版本。
滚动更新 Pod
逐步替换 ConfigMap
全部升级完成
旧 Prometheus 实例
新 Prometheus 实例
验证可用性
Prometheus 集群稳定

2. 备份策略

  • 配置备份

    • 定期导出 Prometheus Operator 所管理的 CR(YAML),存储于 Git 或对象存储。

    • 示例:

      kubectl get prometheus -A -o yaml > backup/prometheus.yaml
      kubectl get servicemonitor -A -o yaml > backup/servicemonitor.yaml
      kubectl get prometheusrule -A -o yaml > backup/rules.yaml
      
  • 数据备份

    • Prometheus 默认存储在 PVC(PersistentVolumeClaim) 上,使用外部快照工具(Velero / Restic / CSI Snapshots)进行定期快照。
    • 也可将数据写入 远程存储(如 Thanos / Cortex / Mimir),避免单点丢失。

3. 恢复策略

  • 配置恢复

    • 将备份的 CRD YAML 重新 kubectl apply 到集群,Operator 会自动重建 StatefulSet 和配置文件。
  • 数据恢复

    • 如果使用了 PVC 快照,直接恢复 PVC 并绑定到 StatefulSet。
    • 如果接入 Thanos / Cortex,Prometheus 实例无状态化,可快速重建并自动恢复历史数据。
UserGitOps RepoPrometheus OperatorPrometheus StatefulSet提交恢复 CR YAMLArgoCD 同步资源创建/更新 StatefulSet + PVCPrometheus 集群恢复成功UserGitOps RepoPrometheus OperatorPrometheus StatefulSet

四、工程化落地最佳实践

配置管理

  • 所有 CR(Prometheus/ServiceMonitor/Alertmanager/PrometheusRule)纳入 GitOps。
  • 使用 Kustomize/Helm 管理多环境差异。

高可用架构

  • Prometheus Operator 管理的 Prometheus 建议运行 2 副本以上 StatefulSet
  • 配合 Thanos Sidecar 提供远程存储与 Query 聚合。

可观测性

  • Operator 本身提供 metrics,可纳入 Prometheus 监控,保证 Operator 健康。
  • 监控 Prometheus 实例的 uptsdb_wal_truncate_duration_seconds 等关键指标。

安全性

  • 对 Prometheus/Alertmanager 使用 RBAC + NetworkPolicy 控制访问范围。
  • 对 PrometheusRules 做 CRD Validation,避免错误规则导致 OOM。

📌 总结:

  • Prometheus Operator 通过 CRD + Reconcile 循环 实现 Prometheus 及相关组件的自动化管理。
  • 在工程化落地中,应重点关注 升级滚动策略配置 & 数据备份恢复远程存储与高可用性设计

五、Prometheus Operator + Thanos 架构

Thanos 组件
Prometheus StatefulSet 集群
Prometheus Operator
用户提交 CRDs (YAML)
Sidecar
Sidecar
Thanos Store
对象存储对接 S3/GCS
Thanos Query
统一聚合查询
Thanos Compactor
数据压缩/合并
Prometheus-0 Pod
附带 PVC
Prometheus-1 Pod
附带 PVC
Thanos Sidecar-0
Thanos Sidecar-1
监听 CRDs
生成 StatefulSet / ConfigMap / Secret
Prometheus CR
ServiceMonitor CR
PrometheusRule CR
Alertmanager CR
用户 Grafana / API 查询
Alertmanager StatefulSet

六、流程解读

  1. 用户通过 CRDs 提交配置

    • Prometheus / ServiceMonitor / PrometheusRule / Alertmanager。
    • Operator 监听到 CRD 变化,生成 K8s 原生资源(StatefulSet、ConfigMap、Service 等)。
  2. Prometheus StatefulSet 管理监控数据采集

    • Prometheus Pod 定期抓取 ServiceMonitor 定义的目标指标。
    • 每个 Prometheus Pod 附带一个 PVC,存储本地时序数据。
  3. Thanos Sidecar 与远程存储集成

    • Sidecar 将本地数据上传到对象存储(S3、GCS、Ceph RGW 等)。
    • Thanos Store 提供历史数据访问,Thanos Query 聚合多 Prometheus 数据源。
  4. Alertmanager 集群管理告警

    • Operator 生成的 Alertmanager StatefulSet 管理告警通知(邮件、Slack、钉钉等)。
  5. Grafana / API 查询

    • 用户通过 Grafana / API 查询数据 → Thanos Query → 聚合 Prometheus + 对象存储中的历史数据。

七、工程化实现建议(生产级)

高可用性

  • Prometheus StatefulSet 建议至少 2 副本,配合 Thanos Sidecar 统一出口。
  • 使用 PodDisruptionBudget 保证至少一个 Prometheus 可用。

数据存储

  • 对接 Thanos,避免单点故障和 PVC 限制。
  • 对象存储建议使用 版本化 + 生命周期管理

升级

  • Operator + CRDs 使用 Helm/ArgoCD 管理,滚动升级避免中断。
  • Prometheus/Alertmanager StatefulSet 逐 Pod 滚动更新。

备份与恢复

  • 配置:所有 CRDs (YAML) 纳入 GitOps 管理。
  • 数据:通过 Thanos + 对象存储保障,PVC 仅作为缓存层。

监控 Operator 本身

  • 采集 prometheus_operator_* 指标,确保 CRDs 与实际资源同步正常。

👉 这样,一个 Prometheus Operator + Thanos 的完整生产级方案就出来了:

  • Operator 管理声明式 CRDs → 自动生成资源
  • Prometheus 负责实时采集
  • Thanos 提供历史存储 + 高可用聚合
  • Alertmanager 负责告警通知
  • Grafana/Query API 提供统一查询

八、Prometheus Operator 升级/灰度流程(时序图)

用户(GitOps/Helm)Prometheus CRDPrometheus OperatorStatefulSetPrometheus-0 PodPrometheus-1 PodThanos Query(聚合层)提交新版本 CR (v2.49.0 → v2.50.0)触发 Reconcile更新 StatefulSet 模板 (新版本镜像)滚动升级策略 (maxUnavailable=1)删除旧 Pod (v2.49.0)Pod 重建 (v2.50.0)注册新实例 (继续采集)删除旧 Pod (v2.49.0)Pod 重建 (v2.50.0)注册新实例 (继续采集)返回聚合数据 (无中断)用户(GitOps/Helm)Prometheus CRDPrometheus OperatorStatefulSetPrometheus-0 PodPrometheus-1 PodThanos Query(聚合层)
posted @ 2025-10-03 15:51  NeoLshu  阅读(0)  评论(0)    收藏  举报  来源