Monitoreo de métricas personalizadas con prometheus
Puede utilizar AOM ICAgent para obtener datos métricos personalizados de cargas de trabajo como se describe en Supervisión de métricas personalizadas en AOM. También puede instalar el complemento prometheus en un clúster y usar Prometheus como plataforma de monitoreo.
Restricciones
Para usar prometheus para monitorear las métricas personalizadas, la aplicación debe proporcionar una API de monitorización de métricas. Para obtener más información, véase Recopilación de datos de monitorización de Prometheus.
Recopilación de datos de monitorización de Prometheus
Prometheus invoca periódicamente a la API de monitorización métrica (/metrics por defecto) de una aplicación para obtener datos de monitorización. La aplicación debe proporcionar la API de monitorización métrica para que Prometheus invoque, y los datos de monitorización deben cumplir con las siguientes especificaciones de Prometheus:
# TYPE nginx_connections_active gauge nginx_connections_active 2 # TYPE nginx_connections_reading gauge nginx_connections_reading 0
Prometheus ofrece clientes en varios idiomas. Para obtener más información sobre los clientes, consulte Prometheus CLIENT LIBRARIES. Para obtener más información sobre cómo desarrollar un exportador, consulte WRITING EXPORTERS. La comunidad de Prometheus ofrece varios exportadores externos que pueden ser utilizados directamente. Para obtener más información, consulte EXPORTERS AND INTEGRATIONS.
Instalación del complemento
Instale el complemento basado en la versión del clúster y los requisitos reales.
- prometheus: solo admite los clústeres de v1.21 o anteriores.
- kube-prometheus-stack: solo admite los clústeres de v1.23 o posterior. Además de las capacidades de monitorización de prometheus, este complemento proporciona interconexión entre los datos de monitorización y Container Intelligent Analysis (CIA).
Acceso a Prometheus
Después de instalar el complemento de prometheus, puede desplegar una serie de cargas de trabajo y Services. El StatefulSet de Prometheus se refiere al Prometheus Server.
Puede crear un LoadBalancer Service de red pública para que se pueda acceder a Prometheus desde una red externa.
Una vez completada la creación, haga clic en la dirección de acceso para acceder a Prometheus.
- Inicie sesión en la consola de CCE, seleccione un clúster con el complemento de prometheus instalado y elija Networking en el panel de navegación.
- Haga clic en Create from YAML en la esquina superior derecha para crear un Service de LoadBalancer de red pública para la aplicación de Prometheus con estado.
apiVersion: v1 kind: Service metadata: name: prom-lb #Service name, which can be customized. namespace: monitoring labels: app: prometheus component: server annotations: kubernetes.io/elb.id: 038ff*** #Replace it with the ID of the public networkload balancer in the VPC to which the cluster belongs. spec: ports: - name: cce-service-0 protocol: TCP port: 88 #Service port, which can be customized. targetPort: 9090 #Default port of Prometheus. Retain the default value. selector: app: prometheus component: server release: cceaddon-prometheus type: LoadBalancer
- Después de la creación, visite load balancer public IP:Service port para acceder a Prometheus.
- Elija Status > Targets para ver los objetivos monitoreados por Prometheus.
Preparación de una aplicación
Esta sección utiliza Nginx como ejemplo para describir cómo recopilar datos de monitoreo. Las aplicaciones autodesarrolladas necesitan proporcionar API de monitoreo de métricas para que Prometheus pueda invocar. Para obtener más información, véase Recopilación de datos de monitorización de Prometheus.
Nginx tiene un módulo llamado ngx_http_stub_status_module que proporciona funciones básicas de monitorización. Puede configurar el archivo nginx.conf para proporcionar una API para que los sistemas externos accedan a los datos de supervisión de Nginx. Como se muestra en la siguiente figura, después de agregar la configuración del servidor a http, Nginx puede proporcionar una API para que los sistemas externos accedan a los datos de monitorización de 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; } } }
Guarde la configuración anterior en el archivo nginx.conf y utilice la configuración para crear una nueva imagen. El archivo Dockerfile es el siguiente:
FROM nginx:1.21.5-alpine ADD nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
Utilice el archivo Dockerfile anterior para crear una imagen y subirla a SWR. El nombre de la imagen es nginx:exporter. Para obtener más información sobre cómo cargar una imagen, consulte Carga de una imagen a través de un cliente de motor de contenedores.
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
Después de ejecutar un contenedor con nginx:exporter de imagen, puede obtener datos de monitorización de Nginx llamando a http://<ip_address> 8080/stub_status. < ip_address > indica la dirección IP del contenedor. Los datos de seguimiento son los siguientes:
# 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
Métricas de supervisión personalizadas
El formato de datos de los datos de seguimiento proporcionados por nginx:exporter no cumple con los requisitos de Prometheus. Es necesario convertir el formato de datos al formato requerido por Prometheus. Para convertir el formato de las métricas de Nginx, utilice nginx-prometheus-exporter. Despliegue nginx:exporter y nginx-prometheus-exporter en el mismo pod y agregue las siguientes anotaciones durante el despliegue. Entonces Prometheus puede recopilar automáticamente las métricas.
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' # Replace it with the address of the image you uploaded to 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
En la descripción anterior:
- prometheus.io/scrape indica si se debe permitir que Prometheus recopile datos de monitorización de pods. El valor es true.
- prometheus.io/port indica el puerto para recopilar datos de monitorización.
- prometheus.io/path indica el URL de la API para recopilar datos de supervisión. Si este parámetro no está definido, se utiliza el valor predeterminado /metrics.
- prometheus.io/scheme: protocolo utilizado para la recogida de datos. El valor puede ser http o https.
Después de desplegar la aplicación, un pod con una ruta de recopilación del puerto 9113 se puede encontrar en Status > Targets.
En la página de la ficha Graph, escriba nginx. Las métricas relacionadas con Nginx se muestran en Prometheus.
Acceso a Grafana
El complemento de prometheus tiene Grafana (una herramienta de visualización de código abierto) instalada e interconectada con Prometheus. Puede crear un Service de LoadBalancer de red pública para que pueda acceder a Grafana desde la red pública y ver los datos de monitorización de Prometheus en Grafana.
Haga clic en la dirección de acceso para acceder a Grafana y seleccione un panel adecuado para ver el contenido agregado.
- Inicie sesión en la consola de CCE, seleccione un clúster con el complemento de prometheus instalado y elija Networking en el panel de navegación.
- Haga clic en Create from YAML en la esquina superior derecha para crear un Service de red pública de LoadBalancer para Grafana.
apiVersion: v1 kind: Service metadata: name: grafana-lb #Service name, which can be customized. namespace: monitoring labels: app: grafana annotations: kubernetes.io/elb.id: 038ff*** #Replace it with the ID of the public networkload balancer in the VPC to which the cluster belongs. spec: ports: - name: cce-service-0 protocol: TCP port: 80 #Service port, which can be customized. targetPort: 3000 #Default port of Grafana. Retain the default value. selector: app: grafana type: LoadBalancer
- Después de la creación, visite load balancer public IP:Service port para acceder a Grafana y seleccione un panel adecuado para ver los datos agregados.
Persistencia de los datos de Grafana
Actualmente, los datos de Grafana en el complemento de prometheus no son persistentes. Si se reinicia el contenedor de Grafana, se perderán los datos. Puede montar el almacenamiento en la nube en el contenedor de Grafana para lograr la persistencia de los datos de Grafana.
- Utilice kubectl para conectarse al clúster donde reside el clúster de Grafana. Para obtener más información, véase Conexión a un clúster con kubectl.
- Cree el PVC de un disco de EVS.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: grafana-pvc namespace: monitoring annotations: everest.io/disk-volume-type: SSD labels: failure-domain.beta.kubernetes.io/region: ap-southeast-1 failure-domain.beta.kubernetes.io/zone: ap-southeast-1a spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: csi-disk
El disco de EVS y el nodo donde reside Grafana deben estar en la misma AZ. De lo contrario, el disco de EVS no se puede conectar.
- failure-domain.beta.kubernetes.io/region: región donde reside el disco de EVS.
- failure-domain.beta.kubernetes.io/zone: AZ donde reside el disco de EVS.
- storage: tamaño del disco de EVS. Configure este parámetro según sea necesario.
También puede crear discos de EVS en la consola de CCE. Para obtener más información, véase (Consola) Creación automática de un disco de EVS.
- Modifique la configuración de la carga de trabajo de Grafana y monte el disco de EVS.
kubectl edit deploy grafana -n monitoring
Agregue el disco de EVS al contenedor en el archivo YAML, como se muestra en la siguiente figura. El nombre de PVC debe ser el mismo que el de 2 y la ruta de montaje debe ser /var/lib/grafana.
Además, la política de actualización debe modificarse para la carga de trabajo de Grafana. El número máximo de pods es 1.
... template: spec: volumes: - name: cce-pvc-grafana persistentVolumeClaim: claimName: grafana-pvc ... containers: - volumeMounts: - name: cce-pvc-grafana mountPath: /var/lib/grafana ... strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1
Guarde la configuración. Se actualizará la carga de trabajo de Grafana y se montará el disco de EVS.