以下是一个完整的 ServiceMonitor 配置示例(用于 Prometheus Operator),用于监控 Kubernetes 中的服务(如 Flink JobManager/TaskManager):
1. ServiceMonitor 配置示例
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: flink-jobmanager-monitor # ServiceMonitor 名称namespace: flink-production # 需与被监控 Service 同命名空间,或配置权限labels:app: flink-monitoring # 可选:用于分类或筛选
spec:jobLabel: app # 使用 Service 的 `app` 标签作为 Prometheus Job 名称selector:matchLabels:app: flink-jobmanager # 匹配目标 Service 的标签component: metrics # 可选:进一步筛选 ServicenamespaceSelector:any: false # 仅监控当前命名空间(flink-production)# matchNames: # 若需跨命名空间监控,使用此字段# - flink-productionendpoints:- port: metrics # 对应 Service 中定义的端口名称path: /metrics # 指标暴露路径(根据实际应用调整)interval: 15s # 抓取间隔scheme: http # 协议(http 或 https)# 若需 TLS 配置tlsConfig:insecureSkipVerify: true # 跳过证书验证(测试环境用)# 若需 Basic Auth 认证# basicAuth:# username:# name: prometheus-secret# key: username# password:# name: prometheus-secret# key: password
2. 配套的 Service 配置示例
确保被监控的 Service 包含正确的标签和端口定义:
apiVersion: v1
kind: Service
metadata:name: flink-jobmanager-servicenamespace: flink-productionlabels:app: flink-jobmanager # 必须与 ServiceMonitor 的 selector.matchLabels 匹配component: metrics # 可选:用于更细粒度筛选
spec:type: ClusterIPports:- name: metrics # 端口名称必须与 ServiceMonitor 的 endpoints.port 一致port: 9249 # 指标暴露端口(根据实际应用调整,如 Flink 默认 9249)targetPort: 9249selector:app: flink-jobmanager # 关联到具体 Pod 的标签component: jobmanager
3. 关键配置说明
配置项 | 说明 |
---|---|
spec.selector | 通过标签选择要监控的 Service,必须与目标 Service 的 metadata.labels 匹配。 |
endpoints.port | 对应 Service 中定义的 ports.name (如 metrics ),确保名称一致。 |
namespaceSelector | 默认监控当前命名空间,若需跨命名空间监控,需配置 matchNames 并授权 Prometheus 权限。 |
path 和 scheme | 根据应用的指标暴露路径和协议调整(如 Flink 的 /metrics 和 http )。 |
RBAC 权限 | 若跨命名空间监控,需为 Prometheus ServiceAccount 配置 ClusterRole 和 ClusterRoleBinding。 |
4. Prometheus Operator 权限配置(跨命名空间)
如果 Prometheus 需要监控其他命名空间的服务,需添加以下 RBAC 配置:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: prometheus-cross-ns
rules:
- apiGroups: [""]resources: ["services", "endpoints", "pods"]verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: prometheus-cross-ns
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: prometheus-cross-ns
subjects:
- kind: ServiceAccountname: prometheus-k8s # Prometheus 的 ServiceAccount 名称namespace: monitoring # Prometheus 所在的命名空间
5. 验证配置是否生效
-
检查 ServiceMonitor 状态:
kubectl get servicemonitor -n flink-production kubectl describe servicemonitor flink-jobmanager-monitor -n flink-production
-
查看 Prometheus Targets:
访问 Prometheus Web UI -> Status -> Targets,确认对应 Job 状态为 UP。
6. 完整流程图
Prometheus Operator 部署在监控命名空间(如 `monitoring`)││ 发现 ServiceMonitor 资源▼
ServiceMonitor 配置指向 `flink-production` 命名空间的 Service││ 通过标签匹配 Service `flink-jobmanager-service`▼
Prometheus 抓取 Service 后端 Pod 的指标(`:9249/metrics`)
附:常见问题排查
- 指标未抓取:检查 Service 的
labels
是否与 ServiceMonitor 的selector.matchLabels
完全匹配。 - 端口不匹配:确认 Service 的
ports.name
与 ServiceMonitor 的endpoints.port
一致。 - 权限问题:跨命名空间时确保 RBAC 配置正确。
- 网络策略:确保 Prometheus 可访问目标 Pod 的指标端口。
根据实际应用调整端口、路径和标签即可适配到其他服务(如 Kafka、Redis 等)。