Kube-State-Metrics(KSM)是监听 Kubernetes API Server 并将对象状态转化为 Prometheus 指标的服务,需正确部署(含 RBAC)、暴露 /metrics 端点、并在 Prometheus 中配置抓取任务以采集 Pod、Deployment 等资源状态数据。

在 Kubernetes 中,Kube-State-Metrics(KSM) 是一个独立的、轻量级的服务,它不采集节点或容器运行时指标(那是 cAdvisor 或 kubelet 的事),而是专门监听 API Server,将各类 Kubernetes 对象(如 Pod、Deployment、Service、Node 等)的当前状态“翻译”成 Prometheus 可识别的指标格式(即 key-value 时间序列)。要正确使用它收集对象状态数据,关键在于部署、配置和与 Prometheus 集成三步到位。
确保 Kube-State-Metrics 正确部署并具备最小权限
KSM 必须以 Pod 形式运行在集群中,并拥有读取所需资源的 RBAC 权限。官方推荐使用 Helm 或 manifests 部署:
- 使用 Helm(推荐):
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts,然后helm install kube-state-metrics prometheus-community/kube-state-metrics - 若手动部署,必须包含 ServiceAccount、ClusterRole(至少含
nodes、pods、deployments、services等 resource 的list和watch权限)、ClusterRoleBinding 和 Deployment - 检查 Pod 是否就绪:
kubectl get pods -n kube-system | grep kube-state-metrics;确认日志无permission denied类错误
确认指标端点可访问且暴露了目标对象类型
KSM 默认通过 /metrics HTTP 端点暴露指标,通常由其 Service(ClusterIP)暴露。验证方式:
- 执行
kubectl port-forward -n kube-system svc/kube-state-metrics 8080:8080,再访问http://localhost:8080/metrics - 搜索类似
kube_pod_status_phase{phase="Running"}或kube_deployment_status_replicas_available的指标,确认存在且有数值 - 如需限制采集范围(例如只关心 Deployment 和 Pod),可在 Deployment 的 args 中添加
--resources=pods,deployments,避免冗余指标和性能开销
在 Prometheus 中正确配置抓取任务
Prometheus 需要主动拉取 KSM 暴露的指标。常见方式是通过 ServiceMonitor(Prometheus Operator)或 static_configs:
- 若用 Prometheus Operator:创建
ServiceMonitor资源,namespaceSelector和selector需匹配 KSM Service 的 namespace 和 label(如app.kubernetes.io/name: kube-state-metrics) - 若用静态配置:在
scrape_configs中添加 job,static_configs指向 KSM Service DNS 名(如kube-state-metrics.kube-system.svc.cluster.local:8080) - 务必设置
honor_labels: true(避免 label 冲突),并建议加relabel_configs过滤掉不需要的指标或标准化标签(如添加cluster标签)
验证指标是否进入 Prometheus 并可查询
部署完成后,在 Prometheus Web UI 的 Graph 页面尝试以下查询:
-
count by (phase) (kube_pod_status_phase)—— 查看各 Pod 状态分布 -
kube_deployment_status_replicas_available{deployment=~"my-app.*"}—— 查看指定 Deployment 的可用副本数 -
rate(kube_job_status_succeeded[1h])—— 查看 Job 成功完成速率(需启用 jobs 资源) - 若查不到数据,先检查 Prometheus Targets 页面是否显示该 job 为 UP;再确认 KSM 日志是否有 watch 错误或连接 API Server 超时

















