Prometheus中PodMonitor配置示例

以下是一个完整的 PodMonitor 配置示例(用于 Prometheus Operator),用于直接监控 Kubernetes 中的 Pod 指标(如无 Service 暴露的 Flink TaskManager、自定义应用等):


1. PodMonitor 配置示例

yaml 复制代码
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: flink-taskmanager-monitor   # PodMonitor 名称
  namespace: flink-production       # 需与被监控 Pod 同命名空间,或配置权限
  labels:
    app: flink-monitoring           # 可选:用于分类或筛选
spec:
  jobLabel: app                     # 使用 Pod 的 `app` 标签作为 Prometheus Job 名称
  selector:
    matchLabels:
      app: flink-taskmanager        # 匹配目标 Pod 的标签
      component: metrics            # 可选:进一步筛选 Pod
  namespaceSelector:
    any: false                      # 仅监控当前命名空间(flink-production)
    # matchNames:                  # 若需跨命名空间监控,使用此字段
    # - flink-production
  podMetricsEndpoints:
  - port: metrics                   # 对应 Pod 中定义的容器端口名称
    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. 配套的 Pod/Deployment 配置示例

确保被监控的 Pod 包含正确的标签和端口定义(以 Flink TaskManager 为例):

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flink-taskmanager
  namespace: flink-production
spec:
  selector:
    matchLabels:
      app: flink-taskmanager     # 必须与 PodMonitor 的 selector.matchLabels 匹配
      component: metrics         # 可选:用于更细粒度筛选
  template:
    metadata:
      labels:
        app: flink-taskmanager   # 标签必须匹配 PodMonitor 的 selector
        component: metrics
      annotations:
        prometheus.io/scrape: "true"   # 可选:通用 Prometheus 注解(兼容非 Operator 场景)
    spec:
      containers:
      - name: taskmanager
        image: flink:1.17
        ports:
        - name: metrics          # 端口名称必须与 PodMonitor 的 podMetricsEndpoints.port 一致
          containerPort: 9250    # 指标暴露端口(Flink TaskManager 默认 9250)
        args: ["taskmanager"]

3. 关键配置说明

配置项 说明
spec.selector 通过标签选择要监控的 Pod,必须与目标 Pod 的 metadata.labels 匹配。
podMetricsEndpoints.port 对应 Pod 容器中定义的 ports.name(如 metrics),确保名称一致。
namespaceSelector 默认监控当前命名空间,若需跨命名空间监控,需配置 matchNames 并授权 Prometheus 权限。
pathscheme 根据应用的指标暴露路径和协议调整(如 /metricshttp)。
RBAC 权限 若跨命名空间监控,需为 Prometheus ServiceAccount 配置 ClusterRole 和 ClusterRoleBinding。

4. Prometheus Operator 权限配置(跨命名空间)

如果 Prometheus 需要监控其他命名空间的 Pod,需添加以下 RBAC 配置:

yaml 复制代码
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus-pod-cross-ns
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus-pod-cross-ns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus-pod-cross-ns
subjects:
- kind: ServiceAccount
  name: prometheus-k8s      # Prometheus 的 ServiceAccount 名称
  namespace: monitoring     # Prometheus 所在的命名空间

5. 验证配置是否生效

  1. 检查 PodMonitor 状态

    bash 复制代码
    kubectl get podmonitor -n flink-production
    kubectl describe podmonitor flink-taskmanager-monitor -n flink-production
  2. 查看 Prometheus Targets

    访问 Prometheus Web UI -> Status -> Targets,确认对应 Job 状态为 UP


6. 完整流程图

复制代码
Prometheus Operator 部署在监控命名空间(如 `monitoring`)
  │
  │ 发现 PodMonitor 资源
  ▼
PodMonitor 配置指向 `flink-production` 命名空间的 Pod
  │
  │ 通过标签匹配 Pod `flink-taskmanager-xxx`
  ▼
Prometheus 直接抓取 Pod 的指标(`:9250/metrics`)

附:常见问题排查

  • 指标未抓取 :检查 Pod 的 labels 是否与 PodMonitor 的 selector.matchLabels 完全匹配。
  • 端口不匹配 :确认 Pod 容器的 ports.name 与 PodMonitor 的 podMetricsEndpoints.port 一致。
  • 权限问题:跨命名空间时确保 RBAC 配置正确。
  • 网络策略:确保 Prometheus 可访问 Pod 的指标端口(检查 NetworkPolicy)。

对比 ServiceMonitor 和 PodMonitor

特性 ServiceMonitor PodMonitor
监控对象 Service 背后的 Endpoints(Pod 集合) 直接监控 Pod
适用场景 服务通过 Service 统一暴露指标 Pod 无 Service 或需独立监控特定 Pod
配置复杂度 需配合 Service 定义 直接关联 Pod 标签
灵活性 适合固定服务名场景 适合动态或临时性 Pod(如 Job、DaemonSet)

根据实际需求选择监控方式。对于 Flink 集群,通常:

  • JobManager:推荐使用 ServiceMonitor(通过 Service 暴露)。
  • TaskManager:若需独立监控每个实例,可使用 PodMonitor。
相关推荐
艾迪的技术之路3 分钟前
redisson使用lock导致死锁问题
java·后端·面试
今天背单词了吗98021 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师24 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构39 分钟前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
Percep_gan1 小时前
idea的使用小技巧,个人向
java·ide·intellij-idea
缘来是庄1 小时前
设计模式之迭代器模式
java·设计模式·迭代器模式