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,这套监控体系能够帮助运维团队全面掌控集群运行状况,及时响应故障,提升整体运维效率和系统稳定性。