En este tema se describe cómo implementar la extensión TKG v1.3.1 para Prometheus. Prometheus es un sistema de supervisión de sistemas y servicios. Recopila métricas de destinos configurados a intervalos determinados, evalúa las expresiones de las reglas, muestra los resultados y puede activar alertas si se observa alguna condición como verdadera. Alertmanager controla las alertas generadas por Prometheus y las enruta a sus endpoints receptores. Implemente la extensión de TKG para Prometheus para generar y ver métricas para los clústeres de Tanzu Kubernetes.

Requisitos previos de la extensión

Cumpla los siguientes requisitos antes de implementar la extensión TKG v1.3.1 para Prometheus con Alertmanager para la supervisión de clústeres. Además de los requisitos generales, la supervisión de Prometheus requiere una clase de almacenamiento persistente predeterminada. Se puede crear un clúster con una clase de almacenamiento persistente predeterminada o especificar uno en el archivo de configuración de Prometheus al implementar la extensión. Consulte Revisar los requisitos previos de almacenamiento persistente para las extensiones de TKG.

Implementar la extensión Prometheus

La extensión TKG para Prometheus instala varios contenedores. Para obtener más información, consulte https://prometheus.io/.
Contenedor Tipo de recurso Réplicas Descripción
prometheus-alertmanager Implementación 1 Controla las alertas enviadas por las aplicaciones cliente, como el servidor Prometheus.
prometheus-cadvisor DaemonSet 5 Analiza y expone datos de rendimiento y uso de recursos de los contenedores que se están ejecutando.
prometheus-kube-state-metrics Implementación 1 Supervisa el estado y la capacidad del nodo, la conformidad del conjunto de réplicas, el pod, el estado del trabajo y el trabajo cron, las solicitudes de recursos y los límites.
prometheus-node-exporter DaemonSet 5 Exportador de métricas de hardware y SO expuestas por los kernels.
prometheus-pushgateway Implementación 1 Servicio que le permite insertar métricas de los trabajos que no se pueden extraer.
prometheus-server Implementación 1 Proporciona funcionalidades básicas, como la extracción, el procesamiento de reglas y las alertas.
La extensión está configurada para extraer los contenedores del registro público de VMware en https://projects.registry.vmware.com/. Si utiliza un registro privado, cambie la URL del endpoint en los valores de datos y las configuraciones de extensión para que coincidan. Consulte Configurar la extensión Prometheus.
  1. Asegúrese de haber completado cada uno de los requisitos previos de la extensión. Consulte Requisitos previos de la extensión.
  2. Cambie el directorio a la extensión Prometheus.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/monitoring/prometheus
  3. Cree el espacio de nombres tanzu-system-monitoring, así como los objetos de función y la cuenta de servicio Prometheus.
    kubectl apply -f namespace-role.yaml
  4. Cree un archivo de valores de datos de Prometheus.

    El archivo de valores de datos de ejemplo proporciona la configuración mínima.

    cp prometheus-data-values.yaml.example prometheus-data-values.yaml
  5. Configure la extensión Prometheus mediante la actualización de prometheus-data-values.yaml. Consulte Configurar la extensión Prometheus para ver una descripción de los campos y las opciones.
    Si el clúster no se aprovisiona con una clase de almacenamiento persistente predeterminada, puede especificarla en el archivo de valores de datos. Además, asegúrese de que el espacio de nombres tenga suficiente almacenamiento para las notificaciones de volumen persistente.
    monitoring:
      prometheus_server:
        image:
          repository: projects.registry.vmware.com/tkg/prometheus
        pvc:
          storage_class: vwt-storage-policy
          storage: "8Gi"
      alertmanager:
        image:
          repository: projects.registry.vmware.com/tkg/prometheus
        pvc:
          storage_class: vwt-storage-policy
          storage: "8Gi"
    ...      
    
  6. Cree el secreto de Prometheus con el archivo prometheus-data-values.
    kubectl create secret generic prometheus-data-values --from-file=values.yaml=prometheus-data-values.yaml -n tanzu-system-monitoring
    

    El secreto de prometheus-data-values se crea en el espacio de nombres de tanzu-system-monitoring. Compruébelo mediante kubectl get secrets -n tanzu-system-monitoring.

  7. Implemente la extensión Prometheus.
    kubectl apply -f prometheus-extension.yaml

    Cuando finalice correctamente, se creará la aplicación Prometheus: app.kappctrl.k14s.io/prometheus created.

  8. Compruebe el estado de la aplicación Prometheus.
    kubectl get app prometheus -n tanzu-system-monitoring
    El estado debe cambiar de Reconciling a Reconcile succeeded. Si el estado es Reconcile failed, consulte Solucionar problemas.
  9. Vea información detallada sobre la aplicación Prometheus.
    kubectl get app prometheus -n tanzu-system-monitoring -o yaml
  10. Compruebe los DaemonSets de Prometheus.
    kubectl get daemonsets -n tanzu-system-monitoring
  11. Compruebe las implementaciones de Prometheus.
    kubectl get deployments -n tanzu-system-monitoring

Solucionar problemas de implementación de Prometheus

Si se produce un error en la implementación o la reconciliación, ejecute kubectl get pods -A para ver el estado de los pods. En condiciones normales, debería ver los pods con el estado Running. Si el estado es ImagePullBackOff o ImageCrashLoopBackOff, quiere decir que la imagen del contenedor no se pudo extraer del registro . Compruebe la URL en los valores de datos y los archivos YAML de extensión, y asegúrese de que sean precisos.

Compruebe los registros del contenedor, en los que name-XXXX es el nombre único del pod cuando ejecuta kubectl get pods -A:
kubectl logs pod/prometheus-alertmanager-XXXXX -c prometheus-alertmanager -n tanzu-system-monitoring
kubectl logs pod/prometheus-server-XXXXX -c prometheus-server -n tanzu-system-monitoring

Actualizar la extensión Prometheus

Actualice la configuración de una extensión de Prometheus que esté implementada en un clúster de Tanzu Kubernetes.

  1. Obtenga los valores de datos de Prometheus del secreto.
    kubectl get secret prometheus-data-values -n tanzu-system-monitoring -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > prometheus-data-values.yaml
    
  2. Actualice el secreto de los valores de datos de Prometheus.
    kubectl create secret generic prometheus-data-values --from-file=values.yaml=prometheus-data-values.yaml -n tanzu-system-monitoring -o yaml --dry-run | kubectl replace -f-
    
    La extensión Prometheus se conciliará con los valores de datos actualizados.
    Nota: De forma predeterminada, kapp-controller sincronizará las aplicaciones cada 5 minutos. La actualización debería tener efecto en 5 minutos o menos. Si desea que la actualización se aplique inmediatamente, cambie los valores de syncPeriod en prometheus-extension.yaml a un valor menor y aplique la extensión de Fluent Bit mediante kubectl apply -f prometheus-extension.yaml.
  3. Compruebe el estado de la extensión.
    kubectl get app prometheus -n tanzu-system-monitoring

    El estado debe cambiar a Reconcile Succeeded una vez que Prometheus se actualice.

  4. Vea el estado detallado y solucione los problemas.
    kubectl get app prometheus -n tanzu-system-monitoring -o yaml

Eliminar la extensión Prometheus

Elimine la extensión Prometheus de un clúster de Tanzu Kubernetes.
Nota: Complete los pasos en orden. No elimine el espacio de nombres, la cuenta de servicio ni los objetos de función antes de eliminar totalmente la aplicación de Prometheus. De lo contrario, podría provocar errores en el sistema.
Precaución: Prometheus y Grafana utilizan el mismo espacio de nombres. La eliminación del espacio de nombres destruye cualquier extensión que se haya implementado allí. Si se implementa Grafana, no elimine el espacio de nombres antes de eliminar Grafana.
  1. Cambie el directorio a la extensión Prometheus.
    cd /extensions/monitoring/prometheus/
  2. Elimine la aplicación Prometheus.
    kubectl delete app prometheus -n tanzu-system-monitoring

    Resultado esperado: app.kappctrl.k14s.io "prometheus" deleted.

  3. Compruebe que el aplicación Prometheus se haya eliminado.
    kubectl get app prometheus -n tanzu-system-monitoring

    Resultado esperado: apps.kappctrl.k14s.io "prometheus" not found.

  4. Elimine el espacio de nombres tanzu-system-monitoring, así como los objetos de función y la cuenta de servicio de Prometheus.
    Advertencia: No lleve a cabo este paso si Grafana está implementado.
    kubectl delete -f namespace-role.yaml
  5. Si desea volver a implementar Prometheus, elimine el secreto prometheus-data-values.
    kubectl delete secret prometheus-data-values -n tanzu-system-monitoring

    Resultado esperado: secret "prometheus-data-values" deleted.

Actualizar la extensión Prometheus

Si tiene una extensión de Prometheus existente implementada, puede actualizarla a la versión más reciente.
  1. Exporte el mapa de configuración de Prometheus y guárdelo como copia de seguridad.
    kubectl get configmap prometheus -n tanzu-system-monitoring -o 'go-template={{ index .data "prometheus.yaml" }}' > prometheus-configmap.yaml
    
  2. Elimine la implementación de Prometheus existente. Consulte Eliminar la extensión Prometheus.
  3. Implemente la extensión Prometheus. Consulte Implementar la extensión Prometheus.

Configurar la extensión Prometheus

La configuración de Prometheus se establece en /extensions/monitoring/prometheus/prometheus-data-values.yaml.
Tabla 1. Parámetros de configuración de Prometheus
Parámetro Descripción Tipo Predeterminado
monitoring.namespace Espacio de nombres en el que se implementará Prometheus string tanzu-system-monitoring
monitoring.create_namespace La marca indica si se debe crear el espacio de nombres especificado por monitoring.namespace booleano false
monitoring.prometheus_server.config.prometheus_yaml Detalles de configuración del clúster de Kubernetes que se pasarán a Prometheus archivo yaml prometheus.yaml
monitoring.prometheus_server.config.alerting_rules_yaml Reglas de alerta detalladas definidas en Prometheus archivo yaml alerting_rules.yaml
monitoring.prometheus_server.config.recording_rules_yaml Reglas de registro detalladas definidas en Prometheus archivo yaml recording_rules.yaml
monitoring.prometheus_server.service.type Tipo de servicio para exponer Prometheus. Valores admitidos: ClusterIP string ClusterIP
monitoring.prometheus_server.enable_alerts.kubernetes_api Habilitar alertas de SLO para la API de Kubernetes en Prometheus booleano true
monitoring.prometheus_server.sc.aws_type Tipo de AWS definido para storageclass en AWS string gp2
monitoring.prometheus_server.sc.aws_fsType Tipo de sistema de archivos de AWS definido para storageclass en AWS string ext4
monitoring.prometheus_server.sc.allowVolumeExpansion Definir si se permite la expansión de volumen para storageclass en AWS booleano true
monitoring.prometheus_server.pvc.annotations Anotaciones de clase de almacenamiento mapa {}
monitoring.prometheus_server.pvc.storage_class Clase de almacenamiento que se utilizará para la notificación de volumen persistente. De forma predeterminada, es nulo y se utiliza el aprovisionador predeterminado. string nulo
monitoring.prometheus_server.pvc.accessMode Defina el modo de acceso para la notificación de volumen persistente. Valores compatibles: ReadWriteOnce, ReadOnlyMany, ReadWriteMany string ReadWriteOnce
monitoring.prometheus_server.pvc.storage Definir tamaño de almacenamiento para notificación de volumen persistente string 8Gi
monitoring.prometheus_server.deployment.replicas Cantidad de réplicas de Prometheus entero 1
monitoring.prometheus_server.image.repository Ubicación del repositorio con la imagen de Prometheus. El valor predeterminado es el registro de VMware público. Cambie este valor si utiliza un repositorio privado (p. ej., un entorno aislado). string projects.registry.vmware.com/tkg/prometheus
monitoring.prometheus_server.image.name Nombre de la imagen de Prometheus string prometheus
monitoring.prometheus_server.image.tag Etiqueta de la imagen de Prometheus. Es posible que este valor tenga que actualizarse si va a actualizar la versión. string v2.17.1_vmware.1
monitoring.prometheus_server.image.pullPolicy Directiva de extracción de imágenes de Prometheus string IfNotPresent
monitoring.alertmanager.config.slack_demo Configuración de notificaciones de Slack para Alertmanager string
slack_demo:
  name: slack_demo
  slack_configs:
  - api_url: https://hooks.slack.com
    channel: '#alertmanager-test'
monitoring.alertmanager.config.email_receiver Configuración de notificaciones de correo electrónico para Alertmanager string
email_receiver:
  name: email-receiver
  email_configs:
  - to: [email protected]
    send_resolved: false
    from: [email protected]
    smarthost: smtp.eample.com:25
    require_tls: false
monitoring.alertmanager.service.type Tipo de servicio para exponer Alertmanager. Valores admitidos: ClusterIP string ClusterIP
monitoring.alertmanager.image.repository Ubicación del repositorio con la imagen de Alertmanager. El valor predeterminado es el registro de VMware público. Cambie este valor si utiliza un repositorio privado (p. ej., un entorno aislado). string projects.registry.vmware.com/tkg/prometheus
monitoring.alertmanager.image.name Nombre de la imagen de Alertmanager string alertmanager
monitoring.alertmanager.image.tag Etiqueta de la imagen de Alertmanager. Es posible que este valor tenga que actualizarse si va a actualizar la versión. string v0.20.0_vmware.1
monitoring.alertmanager.image.pullPolicy Directiva de extracción de imágenes de Alertmanager string IfNotPresent
monitoring.alertmanager.pvc.annotations Anotaciones de clase de almacenamiento mapa {}
monitoring.alertmanager.pvc.storage_class Clase de almacenamiento que se utilizará para la notificación de volumen persistente. De forma predeterminada, es nulo y se utiliza el aprovisionador predeterminado. string nulo
monitoring.alertmanager.pvc.accessMode Defina el modo de acceso para la notificación de volumen persistente. Valores compatibles: ReadWriteOnce, ReadOnlyMany, ReadWriteMany string ReadWriteOnce
monitoring.alertmanager.pvc.storage Definir tamaño de almacenamiento para notificación de volumen persistente string 2Gi
monitoring.alertmanager.deployment.replicas Cantidad de réplicas de Alertmanager entero 1
monitoring.kube_state_metrics.image.repository Repositorio que contiene la imagen de kube-state-metircs. El valor predeterminado es el registro de VMware público. Cambie este valor si utiliza un repositorio privado (p. ej., un entorno aislado). string projects.registry.vmware.com/tkg/prometheus
monitoring.kube_state_metrics.image.name Nombre contiene la imagen kube-state-metircs string kube-state-metrics
monitoring.kube_state_metrics.image.tag Etiqueta de la imagen de kube-state-metircs. Es posible que este valor tenga que actualizarse si va a actualizar la versión. string v1.9.5_vmware.1
monitoring.kube_state_metrics.image.pullPolicy directiva de extracción de imágenes de kube-state-metircs string IfNotPresent
monitoring.kube_state_metrics.deployment.replicas Cantidad de réplicas de kube-state-metrics entero 1
monitoring.node_exporter.image.repository Repositorio que contiene la imagen de node-exporter. El valor predeterminado es el registro de VMware público. Cambie este valor si utiliza un repositorio privado (p. ej., un entorno aislado). string projects.registry.vmware.com/tkg/prometheus
monitoring.node_exporter.image.name Nombre de la imagen de node-exporter string node-exporter
monitoring.node_exporter.image.tag Etiqueta de la imagen de node-exporter. Es posible que este valor tenga que actualizarse si va a actualizar la versión. string v0.18.1_vmware.1
monitoring.node_exporter.image.pullPolicy directiva de extracción de imágenes de nodo-exporter string IfNotPresent
monitoring.node_exporter.hostNetwork Si se establece en hostNetwork: true, el pod puede utilizar el espacio de nombres de red y los recursos de red del nodo. booleano false
monitoring.node_exporter.deployment.replicas Cantidad de réplicas de node-exporter entero 1
monitoring.pushgateway.image.repository Repositorio que contiene la imagen de pushgateway. El valor predeterminado es el registro de VMware público. Cambie este valor si utiliza un repositorio privado (p. ej., un entorno aislado). string projects.registry.vmware.com/tkg/prometheus
monitoring.pushgateway.image.name Nombre de la imagen de pushgateway string pushgateway
monitoring.pushgateway.image.tag Etiqueta de la imagen de pushgateway. Es posible que este valor tenga que actualizarse si va a actualizar la versión. string v1.2.0_vmware.1
monitoring.pushgateway.image.pullPolicy Directiva de extracción de imágenes de pushgateway string IfNotPresent
monitoring.pushgateway.deployment.replicas Cantidad de réplicas de pushgateway entero 1
monitoring.cadvisor.image.repository Repositorio que contiene la imagen de cadvisor. El valor predeterminado es el registro de VMware público. Cambie este valor si utiliza un repositorio privado (p. ej., un entorno aislado). string projects.registry.vmware.com/tkg/prometheus
monitoring.cadvisor.image.name Nombre de la imagen de cadvisor string cadvisor
monitoring.cadvisor.image.tag Etiqueta de la imagen de cadvisor. Es posible que este valor tenga que actualizarse si va a actualizar la versión. string v0.36.0_vmware.1
monitoring.cadvisor.image.pullPolicy Directiva de extracción de imágenes de cadvisor string IfNotPresent
monitoring.cadvisor.deployment.replicas Cantidad de réplicas de cadvisor entero 1
monitoring.ingress.enabled Habilita/deshabilita la entrada para Prometheus y Alertmanager booleano

false

Para utilizar la entrada, establezca este campo en true e implemente Contour. Para acceder a Prometheus, actualice sus /etc/hosts locales con una entrada que asigne prometheus.system.tanzu a una dirección IP del nodo de trabajo.

monitoring.ingress.virtual_host_fqdn Nombre de host para acceder a Prometheus y Alertmanager string prometheus.system.tanzu
monitoring.ingress.prometheus_prefix Prefijo de ruta de acceso para Prometheus string /
monitoring.ingress.alertmanager_prefix Prefijo de ruta de acceso para Alertmanager string /alertmanager/
monitoring.ingress.tlsCertificate.tls.crt Certificado opcional para la entrada si desea utilizar su propio certificado TLS. De forma predeterminada, se genera un certificado autofirmado string Certificado generado
monitoring.ingress.tlsCertificate.tls.key Clave privada de certificado opcional para la entrada si desea utilizar su propio certificado TLS. string Clave de certificado generada
Tabla 2. Campos configurables para Prometheus_Server Configmap
Parámetro Descripción Tipo Predeterminado
evaluation_interval Frecuencia para evaluar reglas duration 1m
scrape_interval Frecuencia de extracción de destinos duration 1m
scrape_timeout Tiempo agotado para una solicitud de extracción duration 10s
rule_files Los archivos de reglas especifican una lista de globs. Las reglas y las alertas se leen desde todos los archivos que coincidan archivo yaml
scrape_configs Una lista de configuraciones de extracción. lista
job_name El nombre del trabajo asignado a métricas recopiladas de forma predeterminada string
kubernetes_sd_configs Lista de configuraciones de detección de servicios de Kubernetes. lista
relabel_configs Lista de configuraciones de reetiqueta de destino. lista
action Acción que se realizará en función de la coincidencia de expresión regular. string
regex Expresión regular con la que coincide el valor extraído. string
source_labels Las etiquetas de origen seleccionan valores de las etiquetas existentes. string
scheme Configura el esquema de protocolo utilizado para las solicitudes. string
tls_config Configura las opciones de TLS de la solicitud de chat. string
ca_file Certificado de CA con el que se validará el certificado del servidor de API. filename
insecure_skip_verify Deshabilite la validación del certificado del servidor. booleano
bearer_token_file Información opcional de autenticación del archivo de token de portador. filename
replacement Valor de reemplazo contra el que se realiza un reemplazo de expresión regular si la expresión regular coincide. string
target_label Etiqueta en la que el valor resultante se escribe en una acción de reemplazo. string
Tabla 3. Campos configurables para Alertmanager Configmap
Parámetro Descripción Tipo Predeterminado
resolve_timeout ResolveTimeout es el valor predeterminado que utiliza Alertmanager si la alerta no incluye EndsAt duration 5m
smtp_smarthost El host SMTP a través del cual se envían los correos electrónicos. duration 1m
slack_api_url URL de webhook de Slack. string global.slack_api_url
pagerduty_url La URL de pagerduty a la que se enviarán solicitudes de API. string global.pagerduty_url
plantillas Archivos desde los que se leen las definiciones de plantillas de notificación personalizadas ruta del archivo
group_by agrupar las alertas por etiqueta string
group_interval Establezca el tiempo de espera antes de enviar una notificación sobre nuevas alertas que se agregan a un grupo duration 5m
group_wait Tiempo que se debe esperar inicialmente para enviar una notificación para un grupo de alertas duration 30s
repeat_interval Tiempo de espera antes de volver a enviar una notificación si ya se ha enviado correctamente para una alerta duration 4h
receivers Una lista de receptores de notificaciones. lista
severity Gravedad del incidente. string
channel El canal o el usuario al que se enviarán notificaciones. string
html El cuerpo HTML de la notificación por correo electrónico. string
text El cuerpo de texto de la notificación por correo electrónico. string
send_resolved Indica si se informa sobre las alertas resueltas. filename
email_configs Configuraciones para la integración del correo electrónico booleano
Las anotaciones en los pods permiten un control preciso del proceso de extracción. Estas anotaciones deben formar parte de los metadatos del pod. No tendrán efecto si se establecen en otros objetos, como Services o DaemonSets.
Tabla 4. Anotaciones del pod de Prometheus
Anotación del pod Descripción
prometheus.io/scrape La configuración predeterminada extraerá en todos los pods y, si se establece en false, esta anotación excluirá el pod del proceso de extracción.
prometheus.io/path Si la ruta de las métricas no es /metrics, defínala con esta anotación.
prometheus.io/port Realice la extracción del pod en el puerto indicado en lugar de en los puertos declarados del pod (el valor predeterminado es un destino sin puertos si no se declara ninguno).
El siguiente manifiesto de DaemonSet indicará a Prometheus que realiza la extracción de todos sus pods en el puerto 9102.
apiVersion: apps/v1beta2 # for versions before 1.8.0 use extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: weave
  labels:
    app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '9102'
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: gcr.io/google-containers/fluentd-elasticsearch:1.20