以下是关于 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
kubernetes_sd_configs
)• role: pod
:指定发现 Kubernetes 集群中的所有 Pod。
• namespaces
:限制发现的命名空间(默认发现所有命名空间)。
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 内应用暴露的内容,常见类型包括:
• 由应用自身通过 /metrics
端点暴露的业务指标(如 HTTP 请求数、处理延迟等)。
示例:
http_requests_total{method="GET", path="/api"} 203
app_processing_seconds_sum 150.6
• 当 Pod 属于 kubelet 时,暴露容器资源使用数据(需配置抓取 kubelet 的 /metrics/cadvisor
端点)。
示例:
container_cpu_usage_seconds_total{container="nginx"}
container_memory_working_set_bytes{container="redis"}
• 如 Istio Envoy Sidecar 的流量指标:
istio_requests_total{destination_service="webapp"}
envoy_cluster_upstream_rq_timeout{cluster="outbound|80||backend"}
服务发现
Prometheus 调用 Kubernetes API 获取所有 Pod 的元数据(IP、端口、标签、注解等)。
目标生成
根据 relabel_configs
规则筛选 Pod,并生成抓取目标列表。例如:
• 仅保留注解 prometheus.io/scrape: "true"
的 Pod。
• 从注解 prometheus.io/port
获取抓取端口。
指标抓取
Prometheus 根据生成的目标地址(如 10.0.0.5:8080/metrics
)定期拉取指标。
标签处理
抓取到的指标会被添加 Kubernetes 元标签(如 namespace
, pod
, container
),便于聚合查询。
• 注解控制:仅抓取带有特定注解(如 prometheus.io/scrape: "true"
)的 Pod,避免全量采集。
• 命名空间隔离:限制 namespaces
范围,减少不必要的 API 查询。
• RBAC 权限:确保 Prometheus 的 ServiceAccount 有权限访问 Pod 和端点。
# ClusterRole 示例
- apiGroups: [""]
resources: ["pods", "nodes", "services"]
verbs: ["get", "list", "watch"]
• 抓取间隔:根据指标更新频率调整 scrape_interval
(默认 1 分钟)。
• 标签精简:通过 relabel_configs
删除无关标签,减少存储压力。
- action: labeldrop
regex: "temp_.*" # 删除以 temp_ 开头的标签
• 在 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
• 检查 Pod 是否具有 prometheus.io/scrape: "true"
注解。
• 确认 Prometheus 有权限访问 Kubernetes API。
• 确保 Pod 的指标端口已正确暴露(containerPort
定义)。
• 检查网络策略是否允许 Prometheus 访问 Pod IP。
• 避免将具有相同名称的 Kubernetes 标签与应用指标标签混合,可通过 relabel_configs
重命名。
kubernetes-pods
Job 是 Prometheus 监控 Kubernetes 应用的核心配置,通过动态发现和标签重写,灵活抓取各类 Pod 暴露的指标。合理配置注解、权限和重标记规则,可大幅提升监控效率与数据质量。结合 Prometheus Operator 的 PodMonitor
或 ServiceMonitor
,可实现更优雅的声明式管理。