k8s監控方案實踐補充(二):使用kube-state-metrics獲取資源狀態指標
文章目錄
- k8s監控方案實踐補充(二):使用kube-state-metrics獲取資源狀態指標
- 一、Metrics Server簡介
- 二、kube-state-metrics實戰部署
- 1. 創建RBAC(kube-state-metrics-rbac.yaml)
- 2. 創建Service(kube-state-metrics-svc.yaml)
- 3. 創建Deployment(kube-state-metrics-deploy.yaml)
- 4. 部署所有資源
- 總結
隨著容器化和微服務架構的不斷發展,系統的復雜性與日俱增,構建一套完善的監控與資源管理體系已成為保障系統穩定運行的關鍵。在前幾篇文章中,我們已經介紹了如何部署 Prometheus、Node Exporter、Grafana 以及 Alertmanager,并通過釘釘 Webhook 實現了監控告警的閉環。
在本篇補充文章中,我們將部署 Kubernetes 官方提供的資源對象狀態采集組件 —— kube-state-metrics。它通過訪問 API Server,實時導出 Pod、Deployment、StatefulSet、PVC 等 Kubernetes 對象的詳細狀態指標,為 Prometheus 提供更豐富的監控數據支持,幫助我們全面掌握集群運行狀態、資源對象的變化情況,并為告警配置和可視化展示打下基礎。
一、Metrics Server簡介
kube-state-metrics 是 Kubernetes 官方維護的 Exporter,專門用于收集集群中各類資源對象的狀態信息(如 Deployment 副本狀態、Pod 準備情況、PVC 是否綁定等),并以 Prometheus 支持的格式對外暴露。
它與 Metrics Server 的區別在于:
項目 | kube-state-metrics | Metrics Server |
---|---|---|
指標類型 | 對象狀態指標 | 資源使用率指標 |
示例指標 | Deployment 副本數、Pod 狀態、PVC 狀態等 | Pod/Node 的 CPU、內存使用率 |
數據持久化 | 否(需 Prometheus 拉取) | 否 |
適用場景 | 狀態監控、結構化分析、告警配置 | 實時資源監控、HPA 自動擴縮容 |
與 Metrics Server
不同,kube-state-metrics 不提供節點或 Pod 的實時資源使用數據(如 CPU、內存),而是專注于資源對象的狀態變更,例如:
- 某個 Pod 是否處于 Ready 狀態
- Deployment 的實際副本數是否滿足期望
- PVC 是否成功綁定
- Node 是否處于 NotReady 狀態
部署 kube-state-metrics
后,能夠實現以下功能:
- 為 Prometheus 提供更豐富的集群狀態指標來源
- 輔助構建針對 K8s 對象狀態的 Grafana 可視化面板
- 支持告警規則配置,如 “某 Deployment 副本不足” 或 “某 Node 不可用”
?? 需要注意的是,kube-state-metrics 只是將數據導出為指標,它本身不存儲數據,需要配合 Prometheus 進行拉取、存儲和查詢。
二、kube-state-metrics實戰部署
1. 創建RBAC(kube-state-metrics-rbac.yaml)
為 kube-state-metrics 配置必要的權限,允許其訪問集群中資源對象的狀態信息
---
apiVersion: v1
kind: ServiceAccount
metadata:name: kube-state-metricsnamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: kube-state-metrics
rules:
- apiGroups: [""]resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints", "secrets"]verbs: ["list", "watch"]
- apiGroups: ["extensions"]resources: ["daemonsets", "deployments", "replicasets"]verbs: ["list", "watch"]
- apiGroups: ["apps"]resources: ["statefulsets"]verbs: ["list", "watch"]
- apiGroups: ["batch"]resources: ["cronjobs", "jobs"]verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]resources: ["horizontalpodautoscalers"]verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kube-state-metrics
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: kube-state-metrics
subjects:
- kind: ServiceAccountname: kube-state-metricsnamespace: kube-system
2. 創建Service(kube-state-metrics-svc.yaml)
暴露 kube-state-metrics 服務端口,并添加 Prometheus 自動抓取注解
apiVersion: v1
kind: Service
metadata:annotations:prometheus.io/scrape: 'true' # 開啟 Prometheus 抓取name: kube-state-metricsnamespace: kube-systemlabels:app: kube-state-metrics
spec:ports:- name: kube-state-metricsport: 8080protocol: TCPselector:app: kube-state-metrics
3. 創建Deployment(kube-state-metrics-deploy.yaml)
部署 kube-state-metrics,使用前面創建的 ServiceAccount
apiVersion: apps/v1
kind: Deployment
metadata:name: kube-state-metricsnamespace: kube-system
spec:replicas: 1selector:matchLabels:app: kube-state-metricstemplate:metadata:labels:app: kube-state-metricsspec:serviceAccountName: kube-state-metricscontainers:- name: kube-state-metricsimage: harbor.local/k8s/kube-state-metrics:2.7.0ports:- containerPort: 8080
4. 部署所有資源
kubectl apply -f kube-state-metrics-rbac.yaml
kubectl apply -f kube-state-metrics-svc.yaml
kubectl apply -f kube-state-metrics-deploy.yaml
總結
🚀 本篇文章補充了 Kubernetes 集群監控的重要組成部分 —— kube-state-metrics 的部署與配置。通過該組件,解決了僅依賴 Metrics Server 無法全面反映集群資源狀態的問題,增強了 Prometheus 對 Kubernetes 對象(如 Deployment、Pod、Node 等)狀態指標的采集能力。
? 至此,基于 Metrics Server 和 kube-state-metrics 的 Kubernetes 集群監控方案已基本完善。結合 Prometheus、Alertmanager 和 Grafana,這套監控體系能夠幫助運維團隊全面掌控集群運行狀況,及時響應故障,提升整體運維效率和系統穩定性。