更新时间:2024-01-24 GMT+08:00

kube-prometheus-stack

插件简介

kube-prometheus-stack通过使用Prometheus-operator和Prometheus,提供简单易用的端到端Kubernetes集群监控能力。

开源社区地址:https://github.com/prometheus/prometheus

约束与限制

在默认配置下,插件中的kube-state-metrics组件不采集Kubernetes资源的所有的labels和annotation。如需采集,您需要手动在启动参数中开启采集开关,并同时检查名称为kube-state-metrics的ServiceMonitor中采集白名单是否添加相应指标,详情请参见采集Pod所有labels和annotations

安装插件

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“插件管理”,在右侧找到kube-prometheus-stack,单击“安装”
  2. 在安装插件页面,进行规格配置。

    • 部署模式:3.7.1及以上版本的插件支持选择部署模式。
      • Agent模式:本地不存储数据,占用资源较少,但是不支持HPA能力。

        使用Agent模式时,由于本地不再存储监控数据,因此必须对接AOM或第三方监控系统。

      • Server模式:本地存储数据,占用资源较多,支持所有能力。
    • 容器:插件创建的组件实例,详情请参见组件说明。您可以根据需求选择相应的规格或自定义规格。

  3. 配置相关参数。

    • 对接三方:将普罗数据上报至第三方监控系统,需填写第三方监控系统的地址和Token,并选择是否跳过证书认证。
    • 普罗高可用:高可用会在集群中将Prometheus-server、Prometheus-operator、thanos-query、custom-metrics-apiserver、alertmanager组件按多实例方式部署。
    • 安装grafana:通过 grafana 可视化浏览普罗监控数据。grafana 会默认创建大小为 5 GiB 的存储卷,卸载插件时 grafana 的存储卷不随插件被删除。首次登录默认用户名与密码均为 admin,登录后会立即让您修改密码。
    • 采集周期:采集监控数据的周期。
    • 调度策略:可单独配置插件各个组件的节点亲和性和污点容忍能力。可以配置多个调度策略,不配置亲和节点键和容忍节点污点键则默认不开启对应的调度策略。
      • 作用范围:可选择调度策略生效的插件实例,默认对全部实例生效。当指定组件实例名称时,将覆盖全部实例所配置的调度策略。
      • 亲和节点标签键:填写节点标签键,为插件实例设置节点亲和性。
      • 亲和节点标签值:填写节点标签值,为插件实例设置节点亲和性。
      • 容忍节点污点键:目前仅支持污点键级别的污点容忍策略,组件可以调度到拥有该污点键的节点。

  4. 完成以上配置后,单击“安装”

    插件安装完成后,根据您的使用需求,可能还需进行以下操作:

    • 如果您需要使用该插件为工作负载弹性伸缩提供系统资源指标(如CPU、内存使用量),还需要开启Metric API,详情请参见通过Metrics API提供资源指标。配置完成后,可使用Prometheus采集系统资源指标,无需重复安装metrics-server插件。
    • 如需采集自定义的指标,还需配置自定义指标的采集规则,配置完成后可以实现自定义指标的监控告警,并且支持使用自定义指标创建弹性伸缩策略。详情请参见使用Prometheus监控自定义指标
    • 如果您在安装插件时同时选择了安装grafana,您可以访问grafana查看数据大盘。

组件说明

安装kube-prometheus-stack插件创建的Kubernetes资源,全部都创建在monitoring命名空间下。

表1 kube-prometheus-stack组件

容器组件

说明

资源类型

prometheusOperator

(负载名称:prometheus-operator)

根据自定义资源(Custom Resource Definition / CRDs)来部署和管理Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理,是整个系统的控制中心。

Deployment

prometheus

(负载名称:prometheus-server)

Operator根据自定义资源Prometheus类型中定义的内容而部署Prometheus Server集群,这些自定义资源可以看作是用来管理Prometheus Server集群的StatefulSets资源。

StatefulSet

alertmanager

(负载名称:alertmanager-alertmanager)

插件的告警中心,主要用于接收Prometheus发送的告警并通过去重、分组、分发等能力管理告警信息。

StatefulSet

thanosSidecar

仅在高可用模式下部署。和prometheus-server运行在同一个Pod中,用于实现普罗指标数据的持久化存储。

Container

thanosQuery

仅在高可用模式下部署。PromQL查询的入口,能够对来自Store或Prometheus的相同指标进行重复数据删除。

Deployment

adapter

(负载名称:custom-metrics-apiserver)

将自定义指标聚合到原生的Kubernetes API Server。

Deployment

kubeStateMetrics

(负载名称:kube-state-metrics)

将Prometheus的metrics数据格式转换成K8s API接口能识别的格式。kube-state-metrics组件在默认配置下,不采集K8s资源的所有labels和annotation。如需采集,请参考采集Pod所有labels和annotations进行配置。

说明:

该组件如果存在多个Pod,只会有一个Pod暴露指标。

Deployment

nodeExporter

(负载名称:node-exporter)

每个节点上均有部署,收集Node级别的监控数据。

DaemonSet

grafana

(负载名称:grafana)

可视化浏览普罗监控数据。grafana会默认创建大小为5 GiB的存储卷,卸载插件时grafana的存储卷不随插件被删除。

Deployment

clusterProblemDetector

(负载名称:cluster-problem-detector)

用于监控集群异常。

Deployment

通过Metrics API提供资源指标

容器和节点的资源指标,如CPU、内存使用量,可通过Kubernetes的Metrics API获得。这些指标可以直接被用户访问,比如用kubectl top命令,也可以被HPA或者CustomedHPA使用,根据资源使用率使负载弹性伸缩。

插件可为Kubernetes提供Metrics API,但默认未开启,若要将其开启,需要创建以下APIService对象:

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    app: custom-metrics-apiserver
    release: cceaddon-prometheus
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: custom-metrics-apiserver
    namespace: monitoring
    port: 443
  version: v1beta1
  versionPriority: 100

可以将该对象保存为文件,命名为metrics-apiservice.yaml,然后执行以下命令:

kubectl create -f metrics-apiservice.yaml

执行kubectl top pod -n monitoring命令,若显示如下,则表示Metrics API能正常访问:

# kubectl top pod -n monitoring
NAME                                                      CPU(cores)   MEMORY(bytes)
......
custom-metrics-apiserver-d4f556ff9-l2j2m                  38m          44Mi
......

卸载插件时,需要执行以下kubectl命令,同时删除APIService对象,否则残留的APIService资源将导致metrics-server插件安装失败。

kubectl delete APIService v1beta1.metrics.k8s.io

配置自定义指标的采集规则

新版本的kube-prometheus-stack插件不再提供自定义配置的指标,即user-adapter-config配置项(历史版本插件中该配置项的名称为adapter-config)中不再配置指标采集规则,请您自行添加。关于采集规则配置详情请参见Metrics Discovery and Presentation Configuration。如您从老版本插件升级至新版,则原有的该配置会被继承,不会丢失。

使用Prometheus监控自定义指标时,应用程序需要提供监控指标接口,详情请参见Prometheus监控数据采集说明

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“配置项与密钥”
  2. 切换至“monitoring”命名空间,在“配置项”页签找到user-adapter-config配置项(历史版本插件中该配置项的名称为adapter-config),并单击“更新”
  3. “配置数据”中单击config.yaml对应的“编辑”按钮,在rules字段下添加自定义指标采集规则。修改完成后单击“确定”保存配置。

    如果您需要增加多个采集规则,可在rules字段下添加多个配置,关于采集规则配置详情请参见Metrics Discovery and Presentation Configuration

    自定义采集规则示例如下:
    rules:
    # 此规则匹配以秒为单位的累积cAdvisor指标
    - seriesQuery: '{__name__=~"^container_.*",container!="POD",namespace!="",pod!=""}'
      resources:
        # 指定Pod和命名空间资源
        overrides:
          namespace:
            resource: namespace
          pod:
            resource: pod
      name:
        #删除`container_`前缀和`_seconds_total`后缀,使用(.*)中捕获的内容作为指标名称
        matches: "^container_(.*)_seconds_total$"
      #查询指标,其中`.Series`和`.LabelMatchers`在Go语言中可用,此处使用分隔符`<<`和`>>`避免与prometheus查询语言冲突
      metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[2m])) by (<<.GroupBy>>)'

    上述示例仅采集Pod基本指标,如需采集自定义指标请根据官方指导自行添加或修改规则。

  4. 重新部署monitoring命名空间下的custom-metrics-apiserver工作负载。

访问grafana

如果在安装插件时安装了grafana,可以通过名为grafana的Service访问,grafana Service类型为节点访问,如果是从外网访问,可以给节点绑定EIP,通过节点端口访问。

如下图,访问地址为 http://{{节点EIP}}:30913

采集Pod所有labels和annotations

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“工作负载”
  2. 切换至“monitoring”命名空间,在“无状态负载”页签找到kube-state-metrics负载,并单击“升级”
  3. 在容器配置的“生命周期”中,编辑启动命令。

    在原有的kube-state-metrics的启动参数最后添加:
    --metric-labels-allowlist=pods=[*],nodes=[node,failure-domain.beta.kubernetes.io/zone,topology.kubernetes.io/zone]
    如需采集annotations时,则在启动参数中以相同方法添加参数:
    --metric-annotations-allowlist=pods=[*],nodes=[node,failure-domain.beta.kubernetes.io/zone,topology.kubernetes.io/zone]

    编辑启动命令时,请勿修改其他原有的启动参数,否则可能导致组件异常。

  4. kube-state-metrics将开始采集Pod和node的labels/annotations指标,查询kube_pod_labels/kube_pod_annotations是否在普罗的采集任务中。

    kubectl get servicemonitor kube-state-metrics -nmonitoring -oyaml | kube_pod_labels

更多kube-state-metrics的启动参数请参见kube-state-metrics/cli-arguments