一、什么是 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