使用云原生监控插件监控自定义指标
CCE提供了云原生监控插件,支持使用Prometheus监控自定义指标。
本文将通过一个Nginx应用的示例演示如何使用Prometheus监控自定义指标,步骤如下:
- 安装并访问云原生监控插件
CCE提供了集成Prometheus功能的插件,支持一键安装。
- 准备应用
您需要准备一个应用镜像,该应用需要提供监控指标接口供Prometheus采集,且监控数据需要满足Prometheus的规范。
- 监控自定义指标
在集群中使用该应用镜像部署工作负载,将自动上报自定义监控指标至Prometheus。
自定义指标监控支持四种配置方式。
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。
约束与限制
- 使用Prometheus监控自定义指标时,应用程序需要提供监控指标接口,详情请参见Prometheus监控数据采集说明。
- 使用Pod/Service Annotations的方式暂不支持采集kube-system与monitoring命名空间下的指标,如需采集这两个命名空间下的指标,请通过Pod Monitor与Service Monitor的方式配置。
- 本文使用Nginx应用示例会拉取nginx/nginx-prometheus-exporter:0.9.0镜像,需要为应用部署的节点添加EIP或先将此镜像上传到SWR,以免部署应用失败。
安装并访问云原生监控插件
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“插件中心”,在右侧找到云原生监控插件,单击“安装”。该插件除提供Prometheus监控能力外,还支持将监控数据与容器智能分析对接。
安装插件时请关注以下配置,其余配置可根据需求填写,详情请参见云原生监控插件。
- 插件安装完成后会在集群中部署一系列工作负载和Service。其中Prometheus的Server端会在monitoring命名空间下以有状态工作负载进行部署。
您可以创建一个公网LoadBalancer类型Service,这样就可以从外部访问Prometheus。
- 登录CCE控制台,选择一个已安装Prometheus的集群,在左侧导航栏中选择“服务”。
- 单击右上角“YAML创建”,创建一个公网LoadBalancer类型的Service。
apiVersion: v1 kind: Service metadata: name: prom-lb #服务名称,可自定义 namespace: monitoring labels: app: prometheus component: server annotations: kubernetes.io/elb.id: 038ff*** #请替换为集群所在VPC下的ELB实例ID,且ELB实例为公网访问类型 spec: ports: - name: cce-service-0 protocol: TCP port: 88 #服务端口号,可自定义 targetPort: 9090 #Prometheus的默认端口号,无需更改 selector: #标签选择器可根据Prometheus Server实例的标签进行调整 app.kubernetes.io/name: prometheus prometheus: server type: LoadBalancer
- 创建完成后在浏览器访问“负载均衡公网IP地址:服务端口”,访问Prometheus。
图1 访问Prometheus
准备应用
自行开发的应用程序需要提供监控指标接口供采集,且监控数据需要满足Prometheus的规范,详情请参见Prometheus监控数据采集说明。
本文以Nginx为例采集监控数据,Nginx本身有个名叫ngx_http_stub_status_module的模块,这个模块提供了基本的监控功能,通过在nginx.conf的配置可以提供一个对外访问Nginx监控数据的接口。
- 登录一台可连接公网的Linux虚拟机,且要求可执行Docker命令。
- 创建一个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; } } }
- 使用该配置制作一个镜像,创建Dockerfile文件。
vi Dockerfile
Dockerfile文件内容如下所示:FROM nginx:1.21.5-alpine ADD nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
- 使用上面Dockerfile构建镜像并上传到SWR镜像仓库,镜像名称为nginx:exporter。上传镜像的具体方法请参见客户端上传镜像。
- 在左侧导航栏选择“我的镜像”,单击右侧“客户端上传”,在弹出的页面中单击“生成临时登录指令”,单击复制登录指令。
- 在集群节点上执行上一步复制的登录指令,登录成功会显示“Login Succeeded”。
- 执行如下命令构建镜像,镜像名称为nginx,版本为exporter。
docker build -t nginx:exporter .
- 为镜像打标签并上传至镜像仓库,其中镜像仓库地址和组织名称请根据实际情况修改。
docker tag nginx:exporter swr.ap-southeast-1.myhuaweicloud.com/dev-container/nginx:exporter docker push swr.ap-southeast-1.myhuaweicloud.com/dev-container/nginx:exporter
- 查看应用指标。
- 使用nginx:exporter创建工作负载。
- 登录到容器中,并通过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。
应用部署成功后,访问Prometheus,根据job名称查询自定义监控指标。
可以查询到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"}
方法二:配置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
应用部署成功后,访问Prometheus,查询自定义监控指标。通过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"}
方法三:配置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携带的标签,能被选择器选中
应用部署成功后,访问Prometheus,查询自定义监控指标。通过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"}
方法四:配置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
应用部署成功后,访问Prometheus,查询自定义监控指标。通过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"}