【Prometheus】kubernetes-pods Job的详细说明


以下是关于 Prometheus 中 kubernetes-pods Job 的详细说明,涵盖其配置、工作原理、核心指标及最佳实践。


一、kubernetes-pods Job 的作用

kubernetes-pods 是 Prometheus 用于 自动发现并抓取 Kubernetes 集群中所有 Pod 暴露的监控指标 的配置项。它通过 Kubernetes API 动态发现 Pod,并根据标签或注解筛选目标,适用于以下场景:
监控应用自定义指标:抓取应用自身暴露的 Prometheus 指标(如 /metrics 端点)。
容器资源监控:结合 cAdvisor 收集容器 CPU、内存、磁盘等使用数据。
Sidecar 模式监控:抓取通过 Sidecar 容器暴露的指标(如 Istio Envoy 的统计信息)。


二、配置示例与解析

以下是一个典型的 kubernetes-pods Job 配置(位于 prometheus.yml 或 Prometheus Operator 的 PodMonitor 中):

scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:     # 使用 Kubernetes 服务发现
    - role: pod                # 发现所有 Pod
      namespaces:
        names: [default, monitoring]  # 可指定命名空间
    relabel_configs:
      # 筛选具有特定注解的 Pod
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      # 定义抓取路径和端口(从 Pod 注解中获取)
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        target_label: __metrics_path__
        regex: (.+)
        replacement: /$1
      - source_labels: [__address__,__meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        separator: ;
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2  
      # 添加常用标签
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)  # 将 Pod 标签复制为指标标签
      - source_labels: [__meta_kubernetes_namespace]
        target_label: namespace
      - source_labels: [__meta_kubernetes_pod_name]
        target_label: pod
      - source_labels: [__meta_kubernetes_pod_container_name]
        target_label: container

三、核心配置解析

1. 服务发现配置 (kubernetes_sd_configs)

role: pod:指定发现 Kubernetes 集群中的所有 Pod。
namespaces:限制发现的命名空间(默认发现所有命名空间)。

2. 重新标记 (relabel_configs)

筛选目标
通过 __meta_kubernetes_pod_annotation_* 元标签筛选需监控的 Pod。例如,仅抓取具有 prometheus.io/scrape: "true" 注解的 Pod:

- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
  action: keep
  regex: true

定义抓取路径和端口
从 Pod 注解中读取自定义的指标路径和端口:

# 示例 Pod 注解:
# prometheus.io/path: "/metrics"
# prometheus.io/port: "8080"
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
  target_label: __metrics_path__  # 抓取路径
  regex: (.+)
  replacement: /$1
- source_labels: [__address__,__meta_kubernetes_pod_annotation_prometheus_io_port]
  separator: ;
  regex: ([^:]+)(?::\d+)?;(\d+)
  target_label: __address__
  replacement: $1:$2
  action: replace

标签映射
将 Kubernetes 元数据(如命名空间、Pod 名称)转换为指标标签:

- action: labelmap
  regex: __meta_kubernetes_pod_label_(.+)  # 复制所有 Pod 标签
- source_labels: [__meta_kubernetes_namespace]
  target_label: namespace

四、采集的指标类型

通过 kubernetes-pods Job 抓取的指标取决于 Pod 内应用暴露的内容,常见类型包括:

1. 应用自定义指标

• 由应用自身通过 /metrics 端点暴露的业务指标(如 HTTP 请求数、处理延迟等)。
示例:

http_requests_total{method="GET", path="/api"} 203
app_processing_seconds_sum 150.6
2. cAdvisor 容器指标

• 当 Pod 属于 kubelet 时,暴露容器资源使用数据(需配置抓取 kubelet 的 /metrics/cadvisor 端点)。
示例:

container_cpu_usage_seconds_total{container="nginx"}
container_memory_working_set_bytes{container="redis"}
3. Sidecar 容器指标

• 如 Istio Envoy Sidecar 的流量指标:

istio_requests_total{destination_service="webapp"}
envoy_cluster_upstream_rq_timeout{cluster="outbound|80||backend"}

五、工作原理

  1. 服务发现
    Prometheus 调用 Kubernetes API 获取所有 Pod 的元数据(IP、端口、标签、注解等)。

  2. 目标生成
    根据 relabel_configs 规则筛选 Pod,并生成抓取目标列表。例如:
    • 仅保留注解 prometheus.io/scrape: "true" 的 Pod。
    • 从注解 prometheus.io/port 获取抓取端口。

  3. 指标抓取
    Prometheus 根据生成的目标地址(如 10.0.0.5:8080/metrics)定期拉取指标。

  4. 标签处理
    抓取到的指标会被添加 Kubernetes 元标签(如 namespace, pod, container),便于聚合查询。


六、最佳实践

1. 按需筛选 Pod

注解控制:仅抓取带有特定注解(如 prometheus.io/scrape: "true")的 Pod,避免全量采集。
命名空间隔离:限制 namespaces 范围,减少不必要的 API 查询。

2. 安全配置

RBAC 权限:确保 Prometheus 的 ServiceAccount 有权限访问 Pod 和端点。

# ClusterRole 示例
- apiGroups: [""]
  resources: ["pods", "nodes", "services"]
  verbs: ["get", "list", "watch"]
3. 性能优化

抓取间隔:根据指标更新频率调整 scrape_interval(默认 1 分钟)。
标签精简:通过 relabel_configs 删除无关标签,减少存储压力。

- action: labeldrop
  regex: "temp_.*"  # 删除以 temp_ 开头的标签
4. 与 ServiceMonitor 结合

• 在 Prometheus Operator 中,使用 PodMonitor 资源替代原生配置,更易管理:

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: app-monitor
spec:
  selector:
    matchLabels:
      app: my-app
  podMetricsEndpoints:
  - port: http-metrics
    path: /metrics

七、常见问题

1. 抓取目标为空

• 检查 Pod 是否具有 prometheus.io/scrape: "true" 注解。
• 确认 Prometheus 有权限访问 Kubernetes API。

2. 连接超时

• 确保 Pod 的指标端口已正确暴露(containerPort 定义)。
• 检查网络策略是否允许 Prometheus 访问 Pod IP。

3. 指标标签冲突

• 避免将具有相同名称的 Kubernetes 标签与应用指标标签混合,可通过 relabel_configs 重命名。


总结

kubernetes-pods Job 是 Prometheus 监控 Kubernetes 应用的核心配置,通过动态发现和标签重写,灵活抓取各类 Pod 暴露的指标。合理配置注解、权限和重标记规则,可大幅提升监控效率与数据质量。结合 Prometheus Operator 的 PodMonitorServiceMonitor,可实现更优雅的声明式管理。

你可能感兴趣的:(prometheus,kubernetes)