Kube-state-metrics 可观测性最佳实践

    Kube-state-metrics 介绍

    Kube-state-metrics 是 Kubernetes 生态系统中的一个开源项目,主要用来收集和报告集群中各种资源的实时状态信息。

    工作原理

    • Kube-state-metrics 连接到 Kubernetes API 服务器,并公开一个 HTTP 端点,提供集群中各个对象的状态所生成的指标。
    • 它使用 client-go 库与 Kubernetes API 服务器通信,监听资源的增、删、改事件,并从中提取出有用的度量数据。

    应用场景

    • 异常检测:通过监控 Pod 状态、Node 状态等指标,及时发现和解决潜在问题。
    • 性能优化:监控 Deployment 副本数、CPU/内存使用情况等指标,对集群性能进行优化。
    • 安全审计:监控容器网络流量、文件系统使用情况等指标,发现异常行为,及时识别安全风险。

    部署 Kube-state-metrics

    提示:若环境已存在,请忽略

    安装 Helm (此处为在线安装方式)

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    

    安装 kube-promethues

    kube-promethues 安装包采用了 Bitnami 的Helm chart 方案,包括组件 Node-Exporter、Kube-state-metrics、Blackbox-Exporter、Promethues组件等,安装比较方便,Bitnami 官方地址:https://github.com/bitnami/charts/tree/main/bitnami/kube-prometheus

    通过社区获取最新版本 Chart 包

    helm pull oci://registry-1.docker.io/bitnamicharts/kube-prometheus
    

    Values 文件配置说明

    tar xf kube-prometheus-9.6.3.tgz
    vim kube-prometheus/values.yaml
    
    global:
      # 修改为私有仓库项目地址 
      imageRegistry: ""
      ## E.g.
      ## imagePullSecrets:
      ##   - myRegistryKeySecretName
      ##
      # 此处 修改为私有仓库密钥的secret 名称
      imagePullSecrets: []
      
      # 此处df-nfs-storage 修改为集群内可用的 storageClass
      defaultstorageClass: "df-nfs-storage"
      # 此处df-nfs-storage 修改为集群内可用的 storageClass
      storageClass: "df-nfs-storage"
      ## Compatibility adaptations for Kubernetes platforms
      ##
      compatibility:
        ## Compatibility adaptations for Openshift
        ##
        openshift:
          ## @param global.compatibility.openshift.adaptSecurityContext Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation)
          ##
          adaptSecurityContext: auto
    ## @section Common parameters
    ....
    

    执行部署

    • 在安装 Chart 包 时,部署的 namespace需要与 datakit 采集器 配置的namespace 保持一致
    • 如此处为: namespaces = ["datakit"]

    执行以下命令进行部署

    cd kube-prometheus
    
    helm upgrade -i -n datakit --create-namespace  datakit . 
    

    部署完成效果,可以查看到已部署的 kube-state-metrics 组件

    kubectl get pod -n  datakit
    
    NAME                                                            READY   STATUS    RESTARTS      AGE
    kube-promethues-kube-prome-blackbox-exporter-56cf84fbc4-hfr9k   1/1     Running   0             9d
    kube-promethues-kube-prome-operator-7fcc5c6987-7bqzp            1/1     Running   0             9d
    kube-promethues-kube-state-metrics-769859db74-xf24c             1/1     Running   0             9d
    kube-promethues-node-exporter-j6ssj                             1/1     Running   0             9d
    prometheus-kube-promethues-kube-prome-prometheus-0              2/2     Running   0             6h41m
    

    观测云

    观测云是一款功能强大的统一可观测平台,它提供了对多云环境、云原生应用、中间件以及各类应用程序的实时监控和分析能力。部署在 Kubernetes 集群中的 kube-state-metrics 会暴露一个 metrics 端点,DataKit 通过这个端点拉取指标数据。DataKit 通过 ConfigMap 挂载额外的配置文件,或者通过环境变量直接在 Kubernetes 的 DaemonSet 配置中设置。这样,DataKit 就可以根据用户的配置,定期从 kube-state-metrics 收集指标数据,并将其发送到观测云平台。

    下面介绍在 K8S 集群部署 kube-state-metrics 组件,采集集群资源指标并通过 DataKit 进行收集、存储,最后通过观测云用于数据的可视化展示。

    部署 DataKit

    登录观测云控制台,点击「集成」 -「DataKit」 - 「Kubernetes」,下载 datakit.yaml,拷贝第 3 步中的 token。

    编辑 datakit.yaml ,把 token 粘贴到 ENV_DATAWAY 环境变量值中“token=”后面,把 datakit.yaml 上传到可以连接到 Kubernetes 集群的主机上,执行如下命令:

    kubectl apply -f datakit.yaml
    kubectl get pod -n datakit
    

    在 datakit.yaml 中配置 ConfigMap 资源来收集 kube-state-metrics 的指标数据。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: datakit-conf
      namespace: datakit
    data:
        kubernetesprometheus.conf: |-
          [inputs.kubernetesprometheus]
            
            [[inputs.kubernetesprometheus.instances]]
              role       = "service"
              namespaces = ["datakit"]
              selector   = "app.kubernetes.io/name=kube-state-metrics"
    
              scrape     = "true"
              scheme     = "http"
              port       = "__kubernetes_service_port_http_port"
              path       = "/metrics"
              params     = ""
              interval   = "15s"
    
              [inputs.kubernetesprometheus.instances.custom]
                measurement        = "kube-state-metrics"
                job_as_measurement = true
                [inputs.kubernetesprometheus.instances.custom.tags]
                  cluster_name_k8s       = "promethues-cluster"
                  job           = "kube-state-metrics"
                  svc_name      = "__kubernetes_service_name"
                  pod_name      = "__kubernetes_service_target_name"
                  pod_namespace = "__kubernetes_service_target_namespace"
              [inputs.kubernetesprometheus.instances.auth]
                bearer_token_file      = "/var/run/secrets/kubernetes.io/serviceaccount/token"
                [inputs.kubernetesprometheus.instances.auth.tls_config]
                  insecure_skip_verify = true
                  cert     = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    

    然后在 datakit.yaml 中的 volumeMounts 下挂载 kubernetesprometheus.conf 。

    - mountPath: /usr/local/datakit/conf.d/kubernetesprometheus/kubernetesprometheus.conf
      name: datakit-conf
      subPath: kubernetesprometheus.conf
      readOnly: true
    

    最后,执行以下命令重启 datakit 。

    kubectl delete -f datakit.yaml
    kubectl apply -f datakit.yaml
    

    关键指标

    登录观测云控制台,点击「指标」 -「指标管理」,输入“kube-state-metrics”,就能查询采集到的指标。

    监控 kube-state-metrics 采集的主机指标时,主要需要从以下维度进行,通过综合监控这些维度,可以确保主机的主要指标项:

    • Kube-state-metrics 通过监听 Kubernetes API 服务器生成有关资源对象的状态指标,例如 Deployment、Node、Pod 等。
    • 它提供了包括 CronJob、DaemonSet、Deployment、Job 等多种 Kubernetes 资源的指标。
    • 这些指标包括对象的状态、标签、注解、启动和终止时间等信息。

    以下是 Kube-state-metrics 采集主机指标的关键指标目录:

    指标名称 指标含义
    kube_pod_info Pod信息,用于计算特定节点上实际运行的Pod数量
    kube_node_status_allocatable 节点可分配资源情况,包括CPU、内存和Pods
    kube_pod_container_resource_requests Pod容器资源请求量,包括CPU和内存
    kube_node_status_capacity 节点的总资源容量,包括CPU和内存
    kube_deployment_status_replicas Deployment的期望副本数
    kube_deployment_status_replicas_updated Deployment更新后的副本数
    kube_deployment_status_replicas_unavailable Deployment不可用的副本数
    kube_statefulset_status_replicas_ready StatefulSet就绪的副本数
    kube_statefulset_status_replicas StatefulSet的总副本数
    kube_pod_status_phase Pod的状态,包括Running、Succeeded、Failed、Pending、Unknown
    kube_pod_container_status_running 正在运行的容器数量
    kube_pod_container_status_waiting 处于等待状态的容器数量
    kube_pod_container_status_terminated 已终止的容器数量
    kube_pod_container_status_restarts_total 容器重启次数
    kube_hpa_status_current_replicas HPA当前的副本数
    kube_hpa_spec_max_replicas HPA配置的最大副本数
    kube_hpa_spec_min_replicas HPA配置的最小副本数
    kube_job_status_succeeded 成功完成的Job数量
    kube_job_status_active 活跃的Job数量
    kube_job_status_failed 失败的Job数量
    kube_persistentvolumeclaim_status_phase PVC的状态,包括Bound和非Bound状态

    这些指标覆盖了 Kubernetes 集群中的多个重要方面,包括 Pod、节点、Deployment、StatefulSet、HPA、Job 和 PVC 等资源的监控,帮助用户全面了解集群的运行状态和性能。

    监控视图

    基于关键指标定义的视图如下:

    监控器

    监控器主要包如下:

    Pod 状态异常告警

    • 指标名称:kube_pod_status_phase
    • 告警规则:当 Pod 状态长时间处于 Pending、Failed 或 Unknown 时触发告警。

    Pod 频繁重启告警

    • 指标名称:kube_pod_container_status_restarts_total
    • 告警规则:当容器在一定时间内重启次数超过阈值时触发告警。

    PVC 状态异常告警

    • 指标名称:kube_persistentvolumeclaim_status_phase
    • 告警规则:当 PVC 长时间处于非 Bound 状态时触发告警。

    Daemonset Miss Scheduled Exception 告警

    • 指标名称: kube_daemonset_status_number_misscheduled
    • 告警规则:这个指标直接提供了未正确调度的 DaemonSet Pod 的数量,可设置告警

    Deployment 副本数异常告警

    • 指标名称:kube_deployment_status_replicaskube_deployment_status_replicas_unavailable
    • 告警规则:当 Deployment 的实际副本数与期望副本数不一致,或者不可用的副本数超过阈值时触发告警。

    StatefulSet 副本就绪异常告警

    • 指标名称:kube_statefulset_status_replicas_readykube_statefulset_status_replicas
    • 告警规则:当 StatefulSet 就绪的副本数与总副本数不一致时触发告警。

    总结

    Kube-state-metrics 通过提供实时状态数据,通过观测云 Kubernetes Prometheus Discovery 方式帮助监控 Kubernetes 集群性能和资源使用情况,这对于快速发现和解决集群问题、优化资源分配和提高集群可靠性非常关键。

    联系我们

    加入社区

    微信扫码
    加入官方交流群

    立即体验

    在线开通,按量计费,真正的云服务!

    立即开始

    选择观测云版本

    代码托管平台