基于 Prometheus Operator 配置组件监控

66 阅读3分钟

一、什么是 Prometheus Operator

Prometheus 是一个开源的系统监控和报警工具,可从已配置的作业中抓取指标,所有抓到的数据会存在本地,并用规则处理,比如聚合数据、生成新的时间序列,或者触发告警。其广泛用于云原生和容器环境。

Prometheus Operator 是一个在 Kubernetes 里,用于简化 Prometheus 及相关组件部署和管理的工具,其可配合 ServiceMonitor 或 PodMonitor,自动发现要监控的服务、Pod。

二、组件如何配置

以flink operator为例,其原本的 values.yaml 中,官方已经配置了metrics吐出,每5分钟吐出到日志当中,这种方式的metrics查看必须去pod的日志中寻找,metrics 混在日志流中,看着十分不方便。

 kubernetes.operator.metrics.reporter.slf4j.factory.class: org.apache.flink.metrics.slf4j.Slf4jReporterFactory
  kubernetes.operator.metrics.reporter.slf4j.interval: 5 MINUTE

为了方便查询metrics,实现可视化以及配置告警,Prometheus的配置方法应运而生,具体配置流程如下。

1、创建 templates/service.yaml

作用: 为 Flink Operator 创建一个 Kubernetes Service,暴露 metrics 端口,以便 Prometheus Operator “能抓到指标”

为什么需要:

  • Flink Operator 容器内部会在某个端口暴露 Prometheus 指标
  • 但 Pod 的端口默认不能被外部访问,且 pod 重启后 ip 也会改变
  • Service 就像一个"门牌号",让 Prometheus 能够通过稳定的地址访问到这个端口

关键配置:

spec:
  type: ClusterIP
  ports:
  - port: {{ .Values.metrics.port }}
    targetPort: metrics
    protocol: TCP
    name: metrics

工作流程: Prometheus → Service (9999) → Pod (9999) → Flink Operator 进程

2、创建 templates/servicemonitor.yaml

作用: 告诉 Prometheus Operator "去哪里抓取指标"

为什么需要:

  • Prometheus Operator 不会自动发现所有 Service
  • ServiceMonitor 是一个 CRD(自定义资源),专门用来配置"抓取规则"
  • 它告诉 Prometheus:
    • 抓取哪个 Service(通过 selector 匹配)
    • 多久抓取一次(interval)
    • 从哪个端口抓取(port: metrics)

关键配置:

spec: 
    selector:
        matchLabels:
          # 匹配带有这些标签的 Service(就是我们创建的 metrics Service)
          app.kubernetes.io/name: flink-operator

    endpoints:
    - port: metrics        # 抓取 Service 的 metrics 端口
    interval: 30s        # 每 30 秒抓取一次
    scrapeTimeout: 10s   # 抓取超时时间

工作流程: Prometheus Operator 读取 ServiceMonitor → 生成 Prometheus 抓取配置 → Prometheus 定期访问 Service 的 metrics 端口 → 获取指标数据并存储

3、修改 values.yaml

(1)启用 Prometheus Reporter

修改前:

kubernetes.operator.metrics.reporter.slf4j.factory.class: org.apache.flink.metrics.slf4j.Slf4jReporterFactory
  kubernetes.operator.metrics.reporter.slf4j.interval: 5 MINUTE
  • 只有 Slf4j reporter,指标只会输出到日志
  • 无法被 Prometheus 抓取

修改后:

 # Prometheus metrics reporter
  kubernetes.operator.metrics.reporter.prom.factory.class: org.apache.flink.metrics.prometheus.PrometheusReporterFactory
  kubernetes.operator.metrics.reporter.prom.port: 9999

  # Slf4j metrics reporter (for logging)
  kubernetes.operator.metrics.reporter.slf4j.factory.class: org.apache.flink.metrics.slf4j.Slf4jReporterFactory
  kubernetes.operator.metrics.reporter.slf4j.interval: 5 MINUTE

作用:

  • 添加了 Prometheus reporter,在 9999 端口暴露 HTTP 接口
  • 保留了 Slf4j reporter,日志里也能看到指标(双保险)
  • Flink 支持同时配置多个 reporter

(2)配置 Metrics 端口和 ServiceMonitor

修改前:

metrics:
    port:  # 空的,没有暴露端口

修改后:

 metrics:
    port: 9999  # 暴露 9999 端口
    serviceLabels: {}  # 可以给 Service 添加额外标签
    serviceMonitor:
      enabled: true    # 启用 ServiceMonitor
      interval: 30s    # 每 30 秒抓取一次
      scrapeTimeout: 10s
      # ... 其他可选配置

作用:

  • port: 9999:触发创建 Service(service.yaml 里有 {{- if .Values.metrics.port }})
  • serviceMonitor.enabled: true:触发创建 ServiceMonitor
  • 其他参数:控制 Prometheus 的抓取行为

(4)整体工作流程

整体工作流程

  1. Helm 部署时:
     ├─ 读取 values.yaml 配置
     ├─ 渲染 templates/flink-operator.yaml
     │   └─ 容器暴露 9999 端口(因为 metrics.port: 9999)
     ├─ 渲染 templates/service.yaml
     │   └─ 创建 Service,映射到 Pod 的 9999 端口
     └─ 渲染 templates/servicemonitor.yaml
         └─ 创建 ServiceMonitor

  2. Flink Operator 启动时:
     ├─ 读取 flink-conf.yaml 配置
     ├─ 初始化 Prometheus reporter
     └─ 在 9999 端口启动 HTTP 服务器,暴露 /metrics 接口

  3. Prometheus Operator 运行时:
     ├─ 监听 ServiceMonitor 资源
     ├─ 发现新的 ServiceMonitor
     ├─ 更新 Prometheus 的抓取配置
     └─ Prometheus 开始每 30 秒访问 Service:9999/metrics

  4. 查看指标:
     ├─ Prometheus UI:可以查询指标
     ├─ Grafana:可以创建监控面板
     └─ 直接访问:curl http://<service-ip>:9999/metrics