Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ Cloud Container Engine/ Guía del usuario/ Monitoreo y alarma/ Monitoreo de métricas personalizadas con prometheus
Actualización más reciente 2024-09-10 GMT+08:00

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.

  1. 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.
  2. 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

  3. Después de la creación, visite load balancer public IP:Service port para acceder a Prometheus.

  4. 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.

  1. 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.
  2. 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

  3. 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.

  1. 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.
  2. 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.

  3. 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.