跳转至

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。

要安装 kube-state-metrics 非常简单,直接将代码 Clone 到集群中(能用 kubectl 工具操作就行),不过需要注意兼容的版本:

kube-state-metrics 版本

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

默认的镜像为 gcr 的,这里我们可以将 deployment.yaml 下面的镜像替换成 cnych/kube-state-metrics:v2.3.0,此外我们上面为 Prometheus 配置了 Endpoints 的自动发现,所以我们可以给 kube-state-metrics 的 Service 配置上对应的 annotations 来自动被发现,然后直接创建即可:

☸ ➜ cat 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.3.0
  name: kube-state-metrics
  namespace: kube-system
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "8080" # 8081是kube-state-metrics应用本身指标的端口
......
☸ ➜ kubectl apply -f https://p8s.io/docs/k8s/manifests/prometheus/kube-state-metrics

部署完成后正常就可以被 Prometheus 采集到指标了:

kube-state-metrics target

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

此外 kube-state-metrics 还内置实现了一些自动分片功能,可以通过 --shard--total-shards 参数进行配置。现在还有一个实验性功能,如果将 kube-state-metrics 部署在 StatefulSet 中,它可以自动发现其命名位置,以便自动配置分片,这是一项实验性功能,可能以后会被移除。

要启用自动分片,必须运行一个 kube-state-metrics 的 StatefulSet,并且必须通过 --pod--pod-namespace 标志将 pod 名称和名称空间传递给 kube-state-metrics 进程。可以参考 /examples/autosharding 目录下面的示例清单文件进行说明,但是我们应谨慎使用分片,并应设置额外的监控,以确保分片设置按预期运行(例如,配置了总分片中每个分片的实例)。

使用 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