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