使用AOM监控自定义指标
CCE支持上传自定义指标到AOM,节点上的ICAgent会定期调用负载中配置的监控指标接口读取监控数据,然后上传到AOM上。
负载的自定义指标接口可以在创建时配置。本文将通过一个Nginx应用的示例演示如何上报自定义监控指标到AOM,步骤如下:
- 准备应用
您需要准备一个应用镜像,该应用需要提供监控指标接口供ICAgent采集,且监控数据需要满足Prometheus的规范。
- 部署应用并转换指标
在集群中使用该应用镜像部署工作负载,将自动上报自定义监控指标。
- 配置验证
前往AOM查看自定义指标是否采集成功。
约束与限制
- ICAgent兼容Prometheus的监控数据规范,Pod提供的自定义指标必须满足Prometheus的监控数据规范才能够被ICAgent采集,参见Prometheus监控数据采集说明。
- ICAgent仅支持上报Gauge指标类型的指标。
- ICAgent调用自定义指标的接口周期为1分钟,不支持修改。
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监控数据采集说明。
本文以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
部署应用并转换指标
如上所述的nginx:exporter提供的监控数据,其数据格式并不满足Prometheus的要求,需要将其转换成Prometheus需要的格式,可以使用nginx-prometheus-exporter来转换Nginx的指标,如下所示。
使用nginx:exporter和nginx-prometheus-exporter部署到同一个Pod,如下所示。
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: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"prometheus","path":"/metrics","port":"9113","names":""}]' 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
nginx/nginx-prometheus-exporter:0.9.0需要从公网拉取,需要集群节点绑定公网IP。
nginx-prometheus-exporter需要一个启动命令,nginx-prometheus-exporter -nginx.scrape-uri=http://127.0.0.1:8080/stub_status,用于获取nginx的监控数据。
另外Pod需要添加一个annotations,metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"prometheus","path":"/metrics","port":"9113","names":""}]'。
配置验证
应用部署后,可以通过访问Nginx构造一些访问数据,然后在AOM中查看是否能够获取到相应的监控数据。
- 获取Nginx Pod名称。
$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-exporter-78859765db-6j8sw 2/2 Running 0 4m
- 登录容器执行命令访问Nginx。
$ kubectl exec -it nginx-exporter-78859765db-6j8sw -- /bin/sh Defaulting container name to container-0. Use 'kubectl describe pod/nginx-exporter-78859765db-6j8sw -n default' to see all of the containers in this pod. / # curl http://localhost <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> / #
- 登录AOM,在左侧目录选择“监控 > 指标浏览”,查看Nginx相关的监控指标,如“nginx_connections_active”。
图3 查看监控指标