更新时间:2024-12-04 GMT+08:00

云原生监控插件

插件简介

云原生监控插件(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
  • 自3.8.0版本起,自定义指标采集将默认不再采集kube-system和monitoring命名空间下的组件指标,若您有相关负载在这两个命名空间下,建议使用Pod MonitorService Monitor的方式采集。
  • 自3.8.0版本起,默认不再采集etcd-server、kube-controller、kube-scheduler、autoscaler、fluent-bit、volcano-agent、volcano-scheduler、otel-collector的指标,您可按需开启。

    开启方式:前往“配置项与密钥”页面并切换至monitoring命名空间,单击名为persistent-user-config的配置项的“编辑YAML”按钮,按需移除customSettings字段下serviceMonitorDisable或podMonitorDisable中的配置或置为空数组。

    ...
       customSettings:
          podMonitorDisable: []
          serviceMonitorDisable: []

权限说明

云原生监控插件中的node-exporter组件会监控Docker的存储磁盘空间,需要读取宿主机的/var/run/docker.sock的获取Docker的info的数据。

node-exporter运行需要以下特权:

  • cap_dac_override:读取Docker的info的数据。

安装插件

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

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

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

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

  3. 配置相关参数。

    • 对接三方:将普罗数据上报至第三方监控系统,需填写第三方监控系统的地址和Token,并选择是否跳过证书认证。
    • 自定义指标采集:以服务发现的形式自动采集应用的指标。
    • 普罗高可用:高可用会在集群中将Prometheus-server、Prometheus-operator、thanos-query、custom-metrics-apiserver、alertmanager组件按多实例方式部署。
    • 采集分片数:将采集Targets分配到不同的Prometheus分片实例上,可以增加指标的采集吞吐上限,但会消耗更多的资源,建议在集群规模较大时设置。
    • 采集周期:设置采集时间间隔周期。
    • 存储:选择用于存储监控数据的磁盘类型和大小。卸载插件时存储卷不随插件删除

      若monitoring命名空间下已存在可使用的PVC(名称为pvc-prometheus-server),将使用该存储作为存储源。

    • 调度策略:可单独配置插件各个组件的节点亲和性和污点容忍能力。可以配置多个调度策略,不配置亲和节点键和容忍节点污点键则默认不开启对应的调度策略。
      • 作用范围:可选择调度策略生效的插件实例,默认对全部实例生效。当指定组件实例名称时,将覆盖全部实例所配置的调度策略。
      • 亲和节点标签键:填写节点标签键,为插件实例设置节点亲和性。
      • 亲和节点标签值:填写节点标签值,为插件实例设置节点亲和性。
      • 容忍节点污点键:目前仅支持污点键级别的污点容忍策略,组件可以调度到拥有该污点键的节点。

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

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

    • 如需使用自定义指标创建弹性伸缩策略,请确认云原生监控插件的部署模式为Server模式,然后参考以下步骤:
      1. 采集应用上报的自定义指标至Prometheus,详情请参见使用云原生监控插件监控自定义指标
      2. 将Prometheus采集到的自定义指标聚合到API Server,可供HPA策略使用,详情请参见使用自定义指标创建HPA策略
    • 如果您需要使用该插件为工作负载弹性伸缩提供系统资源指标(如CPU、内存使用量),还需要开启Metric API,详情请参见通过Metrics API提供资源指标。配置完成后,可使用Prometheus采集系统资源指标。(不推荐)

组件说明

安装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

使用自定义指标创建HPA策略

云原生监控插件的部署模式是Server模式时,才能使用自定义指标HPA功能,您可在user-adapter-config配置项中配置HPA弹性策略需要的自定义指标。

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

以下案例中使用使用云原生监控插件监控自定义指标中的nginx指标(nginx_connections_accepted)作为配置示例。

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

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

    自定义采集规则示例如下:
    rules:
    # 匹配指标名称是nginx_connections_accepted的指标,必须确认指标名称,否则HPA控制器无法获取到指标
    - seriesQuery: '{__name__=~"nginx_connections_accepted",container!="POD",namespace!="",pod!=""}'
      resources:
        # 指定Pod和命名空间资源
        overrides:
          namespace:
            resource: namespace
          pod:
            resource: pod
      name:
        #使用nginx_connections_accepted"
        matches: "nginx_connections_accepted"
        #使用nginx_connections_accepted_per_second来代表该指标,该名称即在HPA的自定义策略中的自定义指标名称
        as: "nginx_connections_accepted_per_second"
        #通过计算表达式rate(nginx_connections_accepted[2m])来代表是每秒的请求接收量
      metricsQuery: 'rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[2m])'

  4. 重新部署monitoring命名空间下的custom-metrics-apiserver工作负载。
  5. 在左侧导航栏中选择“工作负载”,找到需要创建HPA策略的工作负载单击“更多>弹性伸缩”。您可在“自定义策略”中选择上述参数创建弹性伸缩策略。

采集Pod所有labels和annotations

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

    采集labels时,在原有的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 | grep kube_pod_labels

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