Skip to main content

K8S 监控组件 kube-state-metrics

先决条件

  • Kubernetes 1.28+
  • kubectl 1.28+

kube-state-metrics 组件介绍

上面我们配置了自动发现 Endpoints 的监控,但是这些监控数据都是应用内部的监控,需要应用本身提供一个 /metrics 接口,或者对应的 exporter 来暴露对应的指标数据,但是在 Kubernetes 集群上 Pod、DaemonSet、Deployment、Job、CronJob 等各种资源对象的状态也需要监控,这也反映了使用这些资源部署的应用的状态。比如:

  • 我调度了多少个副本?现在可用的有几个?
  • 多少个 Pod 是 running/stopped/terminated 状态?
  • Pod 重启了多少次?
  • 我有多少 job 在运行中等等

通过查看前面从集群中拉取的指标(这些指标主要来自 apiserver 和 kubelet 中集成的 cAdvisor),并没有具体的各种资源对象的状态指标。对于 Prometheus 来说,当然是需要引入新的 exporter 来暴露这些指标,Kubernetes 提供了一个 kube-state-metrics 就是我们需要的。kube-state-metrics 关注于获取 Kubernetes 各种资源的最新状态,如 deployment 或者 daemonset。

与 metric-server 的对比

  • metric-server 是从 APIServer 中获取 cpu、内存使用率这种监控指标,并把他们发送给存储后端,如 influxdb 或云厂商,当前的核心作用是为 HPA 等组件提供决策指标支持。
  • kube-state-metrics 关注于获取 Kubernetes 各种资源的最新状态,如 deployment 或者 daemonset,metric-server 仅仅是获取、格式化现有数据,写入特定的存储,实质上是一个监控系统。而 kube-state-metrics 是获取集群最新的指标。

Prometheus 这种监控系统,并不会去用 metric-server 中的数据,他都是自己做指标收集、集成的,但 Prometheus 可以监控 metric-server 本身组件的监控状态并适时报警,这里的监控就可以通过 kube-state-metrics 来实现,如 metric-server Pod 的运行状态。

版本选择

kube-state-metrics 插件版本和 K8S 版本有要兼容性要求,在安装之前先查看本地 K8S 集群版本,我这里 K8S 版本为 v1.28.4。

而后再查看 kube-state-metrics 插件的版本兼容矩阵 Compatibility matrix

因此选择安装 v2.11.0 这个版本,到对应版本的 examples/standard (标准模式)路径下获取 .yaml 配置文件。

git clone https://github.com/kubernetes/kube-state-metrics.git
cd kube-state-metrics/examples/standard

安装

上面为 Prometheus 配置了 Endpoints 的自动发现,所以我们可以给 kube-state-metrics 的 Service 配置上对应的 annotations 来自动被发现,然后直接创建即可:

# service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: exporter
app.kubernetes.io/name: kube-state-metrics
app.kubernetes.io/version: 2.11.0
name: kube-state-metrics
namespace: kube-system
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
spec:
clusterIP: None
ports:
- name: http-metrics
port: 8080 # 8080 是 metrics
targetPort: http-metrics
- name: telemetry
port: 8081 # 8081是kube-state-metrics应用本身指标的端口
targetPort: telemetry
selector:
app.kubernetes.io/name: kube-state-metrics

部署:

$ ls -l kube-state-metrics-v2.11.0/
total 20
-rw-r--r-- 1 root root 418 Oct 9 10:56 cluster-role-binding.yaml
-rw-r--r-- 1 root root 1665 Oct 9 10:56 cluster-role.yaml
-rw-r--r-- 1 root root 1198 Oct 9 11:04 deployment.yaml
-rw-r--r-- 1 root root 234 Oct 9 10:56 service-account.yaml
-rw-r--r-- 1 root root 581 Oct 9 11:05 service.yaml

$ cd kube-state-metrics-v2.11.0/
$ kubectl apply -f .

Pod 正常就可以被 Prometheus 采集到指标了:

当然如果你也想监控 kube-state-metrics 本身的相关指标,则需要单独配置使用 8081 端口作为指标的端口了。

使用 kube-state-metrics 的一些典型场景:

  • 存在执行失败的 Job: kube_job_status_failed
  • 集群节点状态错误: kube_node_status_condition{condition="Ready", status!="true"}==1
  • 集群中存在启动失败的 Pod:kube_pod_status_phase{phase=~"Failed|Unknown"}==1
  • 最近 30 分钟内有 Pod 容器重启: changes(kube_pod_container_status_restarts_total[30m])>0

参考文档