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

使用云原生监控插件监控自定义指标

CCE提供了云原生监控插件,支持使用Prometheus监控自定义指标。

本文将通过一个Nginx应用的示例演示如何使用Prometheus监控自定义指标,步骤如下:

  1. 安装云原生监控插件

    CCE提供了集成Prometheus功能的插件,支持一键安装。

  2. 准备应用

    您需要准备一个应用镜像,该应用需要提供监控指标接口供Prometheus采集,且监控数据需要满足Prometheus的规范

  3. 监控自定义指标

    在集群中使用该应用镜像部署工作负载,将自动上报自定义监控指标至Prometheus。

    自定义指标监控支持四种配置方式。

约束与限制

  • 使用Prometheus监控自定义指标时,应用程序需要提供监控指标接口,详情请参见Prometheus监控数据采集说明
  • 使用Pod/Service Annotations的方式暂不支持采集kube-system与monitoring命名空间下的指标,如需采集这两个命名空间下的指标,请通过Pod Monitor与Service Monitor的方式配置。
  • 本文使用Nginx应用示例会拉取nginx/nginx-prometheus-exporter:0.9.0镜像,需要为应用部署的节点添加EIP或先将此镜像上传到SWR,以免部署应用失败。

Prometheus监控数据采集说明

Prometheus通过周期性的调用应用程序的监控指标接口(默认为“/metrics”)获取监控数据,应用程序需要提供监控指标接口供Prometheus调用,且监控数据需要满足Prometheus的规范,如下所示。

# TYPE nginx_connections_active gauge
nginx_connections_active 2
# TYPE nginx_connections_reading gauge
nginx_connections_reading 0

Prometheus提供了各种语言的客户端,客户端具体请参见Prometheus CLIENT LIBRARIES,开发Exporter具体方法请参见WRITING EXPORTERS。Prometheus社区提供丰富的第三方exporter可以直接使用,具体请参见EXPORTERS AND INTEGRATIONS

安装云原生监控插件

云原生监控插件:该插件支持v1.17及以后的集群版本。
  • 3.8.0及以上版本,需要确认插件配置中开启自定义指标采集。

  • 3.8.0以下版本,无需配置自定义指标采集开关。

准备应用

自行开发的应用程序需要提供监控指标接口供采集,且监控数据需要满足Prometheus的规范,详情请参见Prometheus监控数据采集说明

本文以Nginx为例采集监控数据,Nginx本身有个名叫ngx_http_stub_status_module的模块,这个模块提供了基本的监控功能,通过在nginx.conf的配置可以提供一个对外访问Nginx监控数据的接口。

  1. 登录一台可连接公网的Linux虚拟机,且要求可执行Docker命令。
  2. 创建一个nginx.conf文件,如下所示,在http下添加server配置即可让nginx提供对外访问的监控数据的接口。

    user  nginx;
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
        sendfile        on;
        #tcp_nopush     on;
        keepalive_timeout  65;
        #gzip  on;
        include /etc/nginx/conf.d/*.conf;
    
        server {
          listen 8080;
          server_name  localhost;
          location /stub_status {
             stub_status on;
             access_log off;
          }
        }
    }

  3. 使用该配置制作一个镜像,创建Dockerfile文件。

    vi Dockerfile
    Dockerfile文件内容如下所示:
    FROM nginx:1.21.5-alpine
    ADD nginx.conf /etc/nginx/nginx.conf
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]

  4. 使用上面Dockerfile构建镜像并上传到SWR镜像仓库,镜像名称为nginx:exporter。

    1. 在左侧导航栏选择“我的镜像”,单击右侧“客户端上传”,在弹出的页面中单击“生成临时登录指令”,单击复制登录指令。
    2. 在集群节点上执行上一步复制的登录指令,登录成功会显示“Login Succeeded”。
    3. 执行如下命令构建镜像,镜像名称为nginx,版本为exporter。
      docker build -t nginx:exporter .
    4. 为镜像打标签并上传至镜像仓库,其中镜像仓库地址和组织名称请根据实际情况修改。
      docker tag nginx:exporter {swr-address}/{group}/nginx:exporter
      docker push {swr-address}/{group}/nginx:exporter

  5. 查看应用指标。

    1. 使用nginx:exporter创建工作负载。
    2. 登录到容器中,并通过http://<ip_address>:8080/stub_status获取到nginx的监控数据,其中<ip_address>为容器的IP地址,监控数据如下所示。
      # curl http://127.0.0.1:8080/stub_status
      Active connections: 3 
      server accepts handled requests
       146269 146269 212 
      Reading: 0 Writing: 1 Waiting: 2

方法一:配置Pod Annotations监控自定义指标

当Pod的Annotations配置符合Prometheus采集规范的规则后,Prometheus会自动采集这些Pod暴露的指标。

如上所述的nginx:exporter提供的监控数据,其数据格式并不满足Prometheus的要求,需要将其转换成Prometheus需要的格式,可以使用nginx-prometheus-exporter来转换Nginx的指标,将nginx:exporter和nginx-prometheus-exporter部署到同一个Pod,并在部署时添加如下Annotations就可以自动被Prometheus采集监控指标。

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx-exporter
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-exporter
  template:
    metadata:
      labels:
        app: nginx-exporter
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9113"
        prometheus.io/path: "/metrics"
        prometheus.io/scheme: "http"
    spec:
      containers:
        - name: container-0
          image: 'nginx:exporter'      # 替换为您上传到SWR的镜像地址
          resources:
            limits:
              cpu: 250m
              memory: 512Mi
            requests:
              cpu: 250m
              memory: 512Mi
        - name: container-1
          image: 'nginx/nginx-prometheus-exporter:0.9.0'
          command:
            - nginx-prometheus-exporter
          args:
            - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status'
      imagePullSecrets:
        - name: default-secret

其中

  • prometheus.io/scrape:表示是否需要prometheus采集Pod的监控数据,取值为true。
  • prometheus.io/port:表示采集监控数据接口的端口,由需要采集的应用决定。本示例中采集端口为9113。
  • prometheus.io/path:表示采集监控数据接口的URL,如不配置则默认为“/metrics”
  • prometheus.io/scheme:表示采集的协议,值可以填写http或https。

应用部署成功后,访问云原生监控插件,查询自定义监控指标。

可以查询到nginx相关的自定义监控指标,通过job名称可以判断出是根据Pod配置上报的。

nginx_connections_accepted{cluster="2048c170-8359-11ee-9527-0255ac1000cf", cluster_category="CCE", cluster_name="cce-test", container="container-0", instance="10.0.0.46:9113", job="monitoring/kubernetes-pods", kubernetes_namespace="default", kubernetes_pod="nginx-exporter-77bf4d4948-zsb59", namespace="default", pod="nginx-exporter-77bf4d4948-zsb59", prometheus="monitoring/server"}
图1 查看监控指标

方法二:配置Service Annotations监控自定义指标

当Service的Annotations配置符合Prometheus采集规范的规则后,Prometheus会自动采集这些Service暴露的指标。

Service Annotations使用方法和Pod Annotations基本相同,主要是采集的指标的适用场景不同,Pod Annotations更关注Pod的资源使用情况,Service Annotations侧重于对该业务的请求等指标。

部署示例应用如下:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx-test
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
        - name: container-0
          image: 'nginx:exporter'      # 替换为您上传到SWR的镜像地址
          resources:
            limits:
              cpu: 250m
              memory: 512Mi
            requests:
              cpu: 250m
              memory: 512Mi
        - name: container-1
          image: 'nginx/nginx-prometheus-exporter:0.9.0'
          command:
            - nginx-prometheus-exporter
          args:
            - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status'
      imagePullSecrets:
        - name: default-secret

部署示例Service如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx-test
  labels:
    app: nginx-test
  namespace: default
  annotations: 
    prometheus.io/scrape: "true"  # 配置为 true 表示开启服务发现
    prometheus.io/port: "9113"  # 配置为采集指标暴露的端口号
    prometheus.io/path: "/metrics" # 填写指标暴露的 URI 路径,一般是 /metrics
spec:
  selector:
    app: nginx-test
  externalTrafficPolicy: Cluster
  ports:
    - name: cce-service-0
      targetPort: 80
      nodePort: 0
      port: 8080
      protocol: TCP
    - name: cce-service-1
      protocol: TCP
      port: 9113
      targetPort: 9113
  type: NodePort

查看指标,通过Service名称可以判断出该指标是根据Service配置上报的。

nginx_connections_accepted{app="nginx-test", cluster="2048c170-8359-11ee-9527-0255ac1000cf", cluster_category="CCE", cluster_name="cce-test", instance="10.0.0.38:9113", job="nginx-test", kubernetes_namespace="default", kubernetes_service="nginx-test", namespace="default", pod="nginx-test-78cfb65889-gtv7z", prometheus="monitoring/server", service="nginx-test"}
图2 查看监控指标

方法三:配置Pod Monitor监控自定义指标

云原生监控插件提供了基于PodMonitor与ServiceMonitor配置指标采集任务的能力。Prometheus Operator将watch的PodMonitor的变化,通过Prometheus的reload机制,将Prometheus的采集任务热更新至Prometheus的实例中。

Prometheus Operator定义的CRD资源github地址:https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/charts/crds/crds

部署示例应用如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test2
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test2
  template:
    metadata:
      labels:
        app: nginx-test2
    spec:
      containers:
      - image: nginx:exporter     # 替换为您上传到SWR的镜像地址
        name: container-0
        ports:
        - containerPort: 9113      # 指标暴露的端口号
          name: nginx-test2        # 该名称是后续配置PodMonitor时相匹配的名称
          protocol: TCP
        resources:
          limits:
            cpu: 250m
            memory: 300Mi
          requests:
            cpu: 100m
            memory: 100Mi
      - name: container-1
        image: 'nginx/nginx-prometheus-exporter:0.9.0'
        command:
          - nginx-prometheus-exporter
        args:
          - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status'
      imagePullSecrets:
        - name: default-secret

配置Pod Monitor示例如下:

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: podmonitor-nginx   # PodMonitor的名称
  namespace: monitoring    # 所属命名空间,建议使用monitoring  
spec:
  namespaceSelector:       # 匹配工作负载所在的命名空间
    matchNames:
    - default              # 工作负载所属的命名空间
  jobLabel: podmonitor-nginx
  podMetricsEndpoints:
  - interval: 15s 
    path: /metrics            # 工作负载暴露指标的路径
    port: nginx-test2         # 工作负载暴露指标的port名称
    tlsConfig:
      insecureSkipVerify: true
  selector:  
    matchLabels:
      app: nginx-test2   # Pod携带的标签,能被选择器选中

查看指标,通过job名称可以判断出该指标是根据PodMonitor配置上报的。

nginx_connections_accepted{cluster="2048c170-8359-11ee-9527-0255ac1000cf", cluster_category="CCE", cluster_name="cce-test", container="container-0", endpoint="nginx-test2", instance="10.0.0.44:9113", job="monitoring/podmonitor-nginx", namespace="default", pod="nginx-test2-746b7f8fdd-krzfp", prometheus="monitoring/server"}
图3 查看监控指标

方法四:配置Service Monitor监控自定义指标

云原生监控插件提供了基于PodMonitor与ServiceMonitor配置指标采集任务的能力。Prometheus Operator将watch的ServiceMonitor的变化,通过Prometheus的reload机制,将Prometheus的采集任务热更新至Prometheus的实例中。

Prometheus Operator定义的CRD资源github地址:https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/charts/crds/crds

部署示例应用如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test3
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test3
  template:
    metadata:
      labels:
        app: nginx-test3
    spec:
      containers:
      - image: nginx:exporter        # 替换为您上传到SWR的镜像地址
        name: container-0
        resources:
          limits:
            cpu: 250m
            memory: 300Mi
          requests:
            cpu: 100m
            memory: 100Mi
      - name: container-1
        image: 'nginx/nginx-prometheus-exporter:0.9.0'
        command:
          - nginx-prometheus-exporter
        args:
          - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status'
      imagePullSecrets:
        - name: default-secret

部署示例Service如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx-test3
  labels:
    app: nginx-test3
  namespace: default
spec:
  selector:
    app: nginx-test3
  externalTrafficPolicy: Cluster
  ports:
    - name: cce-service-0
      targetPort: 80
      nodePort: 0
      port: 8080
      protocol: TCP
    - name: servicemonitor-ports
      protocol: TCP
      port: 9113
      targetPort: 9113
  type: NodePort

配置Service Monitor示例如下:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: servicemonitor-nginx
  namespace: monitoring
spec:
  # 配置service中的暴露指标的port的名称
  endpoints:
  - path: /metrics
    port: servicemonitor-ports
  jobLabel: servicemonitor-nginx
  # 采集任务的作用范围,如果不配置,默认为default
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      app: nginx-test3

查看指标,通过endpoint名称可以判断出该指标是根据ServiceMonitor配置上报的。

nginx_connections_accepted{cluster="2048c170-8359-11ee-9527-0255ac1000cf", cluster_category="CCE", cluster_name="cce-test", endpoint="servicemonitor-ports", instance="10.0.0.47:9113", job="nginx-test3", namespace="default", pod="nginx-test3-6f8bccd9-f27hv", prometheus="monitoring/server", service="nginx-test3"}