Cómo instalar la pila de monitoreo Prometheus para un clúster DOKS

Introducción

Las organizaciones que cada vez más adoptan Kubernetes para gestionar sus contenedores necesitan una solución para monitorear la salud de su sistema distribuido. Por esta razón, entra en juego Prometheus, una poderosa herramienta de código abierto para monitorear aplicaciones contenerizadas en su espacio de K8s.

En este tutorial, aprenderás cómo instalar y configurar el conjunto de herramientas de Prometheus para monitorear todos los pods de tu clúster DOKS, así como las métricas del estado del clúster de Kubernetes. Luego, conectarás Prometheus con Grafana para visualizar todas las métricas y realizar consultas utilizando el lenguaje PromQL. Finalmente, configurarás almacenamiento persistente para tu instancia de Prometheus, para persistir todos los datos de métricas del clúster DOKS y de la aplicación.

Tabla de contenidos

Requisitos previos

Para completar este tutorial, necesitarás:

  1. A Git client to clone the Starter Kit repository.
  2. Helm para gestionar lanzamientos y actualizaciones de pilas de Prometheus.
  3. Kubectl para interactuar con Kubernetes.
  4. Curl para probar los ejemplos (aplicaciones backend).
  5. La aplicación de muestra Emojivoto desplegada en el clúster. Sigue los pasos en el README de su repositorio.

Por favor, asegúrate de que el contexto de kubectl esté configurado para apuntar a tu clúster de Kubernetes. Consulta el Paso 3 – Creación del Clúster DOKS del tutorial de configuración de DOKS.

Paso 1 – Instalación del stack Prometheus

En este paso, instalarás el stack kube-prometheus, que es un conjunto completo de monitoreo para Kubernetes basado en opiniones. Incluye el Operador Prometheus, kube-state-metrics, manifiestos preconstruidos, Exportadores de Nodo, API de Métricas, Administrador de Alertas y Grafana.

Vas a utilizar el gestor de paquetes Helm para realizar esta tarea. El gráfico Helm está disponible aquí para su estudio.

Primero, clona el repositorio del Kit de Inicio y cambia al directorio de tu copia local.

A continuación, agrega el repositorio Helm y lista los gráficos disponibles:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

helm repo update prometheus-community

helm search repo prometheus-community

La salida se parece a lo siguiente:

NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION
prometheus-community/alertmanager                       0.18.1          v0.23.0         The Alertmanager handles alerts sent by client ...
prometheus-community/kube-prometheus-stack              35.5.1          0.56.3          kube-prometheus-stack collects Kubernetes manif...
...

El gráfico de interés es prometheus-community/kube-prometheus-stack, que instalará Prometheus, Promtail, Alertmanager y Grafana en el clúster. Visita la página de kube-prometheus-stack para obtener más detalles sobre este gráfico.

Entonces, abre e inspecciona el archivo 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml proporcionado en el repositorio del Kit de Inicio usando un editor de tu elección (preferiblemente con soporte para linting YAML). Por defecto, las métricas de kubeSched y etcd están deshabilitadas: esos componentes son gestionados por DOKS y no son accesibles para Prometheus. Ten en cuenta que el almacenamiento está configurado como emptyDir. Significa que el almacenamiento se perderá si los pods de Prometheus se reinician (esto lo corregirás más tarde en la sección Configurando Almacenamiento Persistente para Prometheus).

[OPCIONAL] Si seguiste el Paso 4 – Agregar un nodo dedicado para observabilidad de la guía Configurando un Clúster de Kubernetes Administrado de DigitalOcean, necesitarás editar el archivo 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml proporcionado en el repositorio del Kit de Inicio y descomentar las secciones de affinity tanto para Grafana como para Prometheus.

prometheusSpec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
              - key: preferred
                operator: In
                values:
                  - observability
grafana:
  enabled: true
  adminPassword: prom-operator
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
              - key: preferred
                operator: In
                values:
                  - observability

Explicaciones para la configuración anterior:

  • preferredDuringSchedulingIgnoredDuringExecution – el planificador intenta encontrar un nodo que cumpla con la regla. Si no hay un nodo que coincida disponible, el planificador aún programa el Pod.
  • preference.matchExpressions – selector utilizado para hacer coincidir un nodo específico basado en un criterio. El ejemplo anterior indica al planificador que coloque las cargas de trabajo (por ejemplo, Pods) en nodos etiquetados usando la clave – preferred y el valor – observability.

Finalmente, instale el kube-prometheus-stack usando Helm:

HELM_CHART_VERSION="35.5.1"

helm install kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
  --namespace monitoring \
  --create-namespace \
  -f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

A specific version of the Helm chart is used. In this case 35.5.1 was picked, which maps to the 0.56.3 version of the application (see output from Step 2.). It’s a good practice to lock on a specific version. This helps to have predictable results and allows versioning control via Git.

–create-namespace \

helm ls -n monitoring

Ahora, verifique el estado de la versión de Helm del conjunto de Prometheus:

NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
kube-prom-stack monitoring      1               2022-06-07 09:52:53.795003 +0300 EEST   deployed        kube-prometheus-stack-35.5.1    0.56.3

La salida se ve similar a lo siguiente. Observe el valor de la columna STATUS – debería decir deployed.

kubectl get all -n monitoring

Vea qué recursos de Kubernetes están disponibles para Prometheus:

NAME                                                         READY   STATUS    RESTARTS   AGE
pod/alertmanager-kube-prom-stack-kube-prome-alertmanager-0   2/2     Running   0          3m3s
pod/kube-prom-stack-grafana-8457cd64c4-ct5wn                 2/2     Running   0          3m5s
pod/kube-prom-stack-kube-prome-operator-6f8b64b6f-7hkn7      1/1     Running   0          3m5s
pod/kube-prom-stack-kube-state-metrics-5f46fffbc8-mdgfs      1/1     Running   0          3m5s
pod/kube-prom-stack-prometheus-node-exporter-gcb8s           1/1     Running   0          3m5s
pod/kube-prom-stack-prometheus-node-exporter-kc5wz           1/1     Running   0          3m5s
pod/kube-prom-stack-prometheus-node-exporter-qn92d           1/1     Running   0          3m5s
pod/prometheus-kube-prom-stack-kube-prome-prometheus-0       2/2     Running   0          3m3s

NAME                                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/alertmanager-operated                      ClusterIP   None             <none>        9093/TCP,9094/TCP,9094/UDP   3m3s
service/kube-prom-stack-grafana                    ClusterIP   10.245.147.83    <none>        80/TCP                       3m5s
service/kube-prom-stack-kube-prome-alertmanager    ClusterIP   10.245.187.117   <none>        9093/TCP                     3m5s
service/kube-prom-stack-kube-prome-operator        ClusterIP   10.245.79.95     <none>        443/TCP                      3m5s
service/kube-prom-stack-kube-prome-prometheus      ClusterIP   10.245.86.189    <none>        9090/TCP                     3m5s
service/kube-prom-stack-kube-state-metrics         ClusterIP   10.245.119.83    <none>        8080/TCP                     3m5s
service/kube-prom-stack-prometheus-node-exporter   ClusterIP   10.245.47.175    <none>        9100/TCP                     3m5s
service/prometheus-operated                        ClusterIP   None             <none>        9090/TCP                     3m3s

NAME                                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/kube-prom-stack-prometheus-node-exporter   3         3         3       3            3           <none>          3m5s

NAME                                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/kube-prom-stack-grafana               1/1     1            1           3m5s
deployment.apps/kube-prom-stack-kube-prome-operator   1/1     1            1           3m5s
deployment.apps/kube-prom-stack-kube-state-metrics    1/1     1            1           3m5s

NAME                                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/kube-prom-stack-grafana-8457cd64c4              1         1         1       3m5s
replicaset.apps/kube-prom-stack-kube-prome-operator-6f8b64b6f   1         1         1       3m5s
replicaset.apps/kube-prom-stack-kube-state-metrics-5f46fffbc8   1         1         1       3m5s

NAME                                                                    READY   AGE
statefulset.apps/alertmanager-kube-prom-stack-kube-prome-alertmanager   1/1     3m3s
statefulset.apps/prometheus-kube-prom-stack-kube-prome-prometheus       1/1     3m3s

Debería tener los siguientes recursos implementados: prometheus-node-exporter, kube-prome-operator, kube-prome-alertmanager, kube-prom-stack-grafana y kube-state-metrics. La salida se ve similar a:

kubectl --namespace monitoring port-forward svc/kube-prom-stack-grafana 3000:80

Luego, puede conectarse a Grafana (usando credenciales predeterminadas: admin/prom-operator – consulte el archivo prom-stack-values-v35.5.1), mediante el reenvío de puertos a la máquina local:

No debe exponer Grafana a la red pública (por ejemplo, crear un mapeo de ingreso o un servicio de equilibrio de carga) con credenciales de inicio de sesión/contraseña predeterminadas.

La instalación de Grafana viene con varios paneles de control. Abra un navegador web en localhost:3000. Una vez dentro, puede ir a Paneles -> Explorar y elegir diferentes paneles de control.

En la siguiente parte, descubrirá cómo configurar Prometheus para descubrir objetivos para el monitoreo. Como ejemplo, se utilizará la aplicación de muestra Emojivoto. También aprenderá qué es un ServiceMonitor.

Paso 2 – Configurar Prometheus y Grafana

Ya desplegó Prometheus y Grafana en el clúster. En este paso, aprenderá a usar un ServiceMonitor. Un ServiceMonitor es una de las formas preferidas de indicar a Prometheus cómo descubrir un nuevo objetivo para monitoreo.

El despliegue de Emojivoto creado en el Paso 5 de la sección de Prerrequisitos proporciona el punto final /metrics de forma predeterminada en el puerto 8801 a través de un servicio de Kubernetes.

kubectl get svc -n emojivoto

A continuación, descubrirá los servicios de Emojivoto responsables de exponer datos de métricas para que los consuma Prometheus. Los servicios en cuestión se llaman emoji-svc y voting-svc (tenga en cuenta que se está utilizando el espacio de nombres emojivoto):

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
emoji-svc    ClusterIP   10.245.135.93    <none>        8080/TCP,8801/TCP   22h
voting-svc   ClusterIP   10.245.164.222   <none>        8080/TCP,8801/TCP   22h
web-svc      ClusterIP   10.245.61.229    <none>        80/TCP              22h

La salida se parece a lo siguiente:

kubectl port-forward svc/emoji-svc 8801:8801 -n emojivoto

A continuación, realice un port-forward para inspeccionar las métricas:

curl -s http://localhost:8801/metrics

Las métricas expuestas pueden visualizarse navegando con un navegador web a localhost o mediante curl:

La salida se parece a lo siguiente:
go_gc_duration_seconds{quantile="0"} 5.317e-05
go_gc_duration_seconds{quantile="0.25"} 0.000105305
go_gc_duration_seconds{quantile="0.5"} 0.000138168
go_gc_duration_seconds{quantile="0.75"} 0.000225651
go_gc_duration_seconds{quantile="1"} 0.016986437
go_gc_duration_seconds_sum 0.607979843
go_gc_duration_seconds_count 2097

# TYPE go_gc_duration_seconds resumen

Para inspeccionar las métricas del servicio voting-svc, detenga el reenvío de puerto de emoji-svc y realice los mismos pasos para el segundo servicio.

  • A continuación, conecte Prometheus al servicio de métricas Emojivoto. Hay varias formas de hacer esto:
  • <static_config> – permite especificar una lista de objetivos y un conjunto de etiquetas común para ellos.
  • <kubernetes_sd_config> – permite recuperar objetivos de raspado desde la API REST de Kubernetes y mantenerse siempre sincronizado con el estado del clúster.

Prometheus Operator – simplifica la supervisión de Prometheus dentro de un clúster de Kubernetes mediante CRDs.

A continuación, hará uso del CRD ServiceMonitor expuesto por Prometheus Operator para definir un nuevo objetivo para la supervisión.

cd Kubernetes-Starter-Kit-Developers

Primero, cambie el directorio (si aún no lo ha hecho) donde se clonó el repositorio Git del Kit de Inicio:

additionalServiceMonitors:
  - name: emojivoto-monitor
    selector:
      matchExpressions:
        - key: app
          operator: In
          values:
            - emoji-svc
            - voting-svc
    namespaceSelector:
      matchNames:
        - emojivoto
    endpoints:
      - port: prom

A continuación, abre el archivo 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml proporcionado en el repositorio del Starter Kit utilizando un editor de texto de tu elección (preferiblemente con soporte para linting de YAML). Por favor, elimina los comentarios que rodean la sección additionalServiceMonitors. La salida se verá similar a:

  • Explicaciones para la configuración anterior:
  • selector -> matchExpressions – indica a ServiceMonitor qué servicio monitorear. Se dirigirá a todos los servicios con la clave de etiqueta app y los valores emoji-svc y voting-svc. Las etiquetas se pueden obtener ejecutando: kubectl get svc --show-labels -n emojivoto
  • namespaceSelector – aquí, quieres hacer coincidir el espacio de nombres donde se implementó Emojivoto.

endpoints -> port – hace referencia al puerto del servicio a monitorear.

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
  --namespace monitoring \
  -f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

Finalmente, aplica los cambios usando Helm:

kubectl port-forward svc/kube-prom-stack-kube-prome-prometheus 9090:9090 -n monitoring

A continuación, verifica si el objetivo Emojivoto se ha agregado a Prometheus para ser raspado. Crea un reenvío de puerto para Prometheus en el puerto 9090:

Abre un navegador web en localhost:9090. Luego, navega hasta la página Status -> Targets, e inspecciona los resultados (nota la ruta serviceMonitor/monitoring/emojivoto-monitor/0):

Hay 2 entradas bajo los objetivos descubiertos porque la implementación de Emojivoto consiste en 2 servicios que exponen el punto de métricas.

En el siguiente paso, descubrirás PromQL junto con algunos ejemplos simples, para comenzar y familiarizarte con el lenguaje.

Paso 3 – PromQL (Prometheus Query Language)

En este paso, aprenderás los conceptos básicos del Lenguaje de Consulta de Prometheus (PromQL). PromQL te ayuda a realizar consultas sobre diversas métricas provenientes de todos los Pods y aplicaciones de tu clúster DOKS.

PromQL es un DSL o Lenguaje Específico de Dominio que está diseñado específicamente para Prometheus y te permite hacer consultas sobre métricas. La expresión general define el valor final, mientras que las expresiones anidadas representan valores para argumentos y operandos. Para explicaciones más detalladas, visita la página oficial de PromQL.

A continuación, vas a inspeccionar una de las métricas de Emojivoto, específicamente emojivoto_votes_total, que representa el número total de votos. Es un valor contador que aumenta con cada solicitud contra el punto final de votos de Emojivoto.

kubectl port-forward svc/kube-prom-stack-kube-prome-prometheus 9090:9090 -n monitoring

Primero, crea un reenvío de puerto para Prometheus en el puerto 9090:

A continuación, abre el navegador de expresiones.

emojivoto_votes_total{container="voting-svc", emoji=":100:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 20
emojivoto_votes_total{container="voting-svc", emoji=":bacon:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 17
emojivoto_votes_total{container="voting-svc", emoji=":balloon:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 21
emojivoto_votes_total{container="voting-svc", emoji=":basketball_man:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 10
emojivoto_votes_total{container="voting-svc", emoji=":beach_umbrella:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 10
emojivoto_votes_total{container="voting-svc", emoji=":beer:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 11

En el campo de entrada de consulta, pega emojivoto_votes_total y presiona enter. La salida se verá similar a:

Navega hasta la aplicación Emojivoto y desde la página de inicio haz clic en el emoji 100 para votar por él.

emojivoto_votes_total{container="voting-svc", emoji=":100:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 21
emojivoto_votes_total{container="voting-svc", emoji=":bacon:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 17
emojivoto_votes_total{container="voting-svc", emoji=":balloon:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 21
emojivoto_votes_total{container="voting-svc", emoji=":basketball_man:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 10
emojivoto_votes_total{container="voting-svc", emoji=":beach_umbrella:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 10
emojivoto_votes_total{container="voting-svc", emoji=":beer:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 11

Navega hasta la página de resultados de la consulta del Paso 3 y haz clic en el botón Ejecutar. Deberías ver que el contador del emoji 100 aumenta en uno. La salida se ve similar a:

emojivoto_votes_total{service="voting-svc"}

PromQL agrupa datos similares en lo que se llama un vector. Como se ve arriba, cada vector tiene un conjunto de atributos que los diferencia entre sí. Puedes agrupar resultados basados en un atributo de interés. Por ejemplo, si solo te interesan las solicitudes que provienen del servicio voting-svc, entonces por favor escribe lo siguiente en el campo de consulta:

emojivoto_votes_total{container="voting-svc", emoji=":100:", endpoint="prom", instance="10.244.6.91:8801", job="voting-svc", namespace="emojivoto", pod="voting-6548959dd7-hssh2", service="voting-svc"} 492
emojivoto_votes_total{container="voting-svc", emoji=":bacon:", endpoint="prom", instance="10.244.6.91:8801", job="voting-svc", namespace="emojivoto", pod="voting-6548959dd7-hssh2", service="voting-svc"} 532
emojivoto_votes_total{container="voting-svc", emoji=":balloon:", endpoint="prom", instance="10.244.6.91:8801", job="voting-svc", namespace="emojivoto", pod="voting-6548959dd7-hssh2", service="voting-svc"} 521

La salida se ve similar a (nota que selecciona solo los resultados que coinciden con tus criterios):

El resultado anterior muestra las solicitudes totales para cada Pod del despliegue Emojivoto que emite métricas (que consta de 2).

Esto es solo una introducción muy simple a lo que es PromQL y a lo que es capaz de hacer. Pero puede hacer mucho más que eso, como contar métricas, calcular la tasa durante un intervalo predefinido, etc. Por favor, visita la página oficial de PromQL para más características del lenguaje.

En el siguiente paso, aprenderás cómo usar Grafana para visualizar métricas para la muestra de la aplicación Emojivoto.

Paso 4 – Visualización de métricas utilizando Grafana

Aunque Prometheus tiene cierto soporte incorporado para visualizar datos, una mejor manera de hacerlo es a través de Grafana, que es una plataforma de código abierto para monitoreo y observabilidad, que te permite visualizar y explorar el estado de tu clúster.

La página oficial se describe como capaz de:

Consultar, visualizar, alertar y comprender tus datos sin importar dónde se almacenen.

kubectl --namespace monitoring port-forward svc/kube-prom-stack-grafana 3000:80

No se necesitan pasos adicionales para instalar Grafana porque el Paso 1 – Instalación del conjunto Prometheus instaló Grafana por ti. Todo lo que tienes que hacer es un reenvío de puerto como se muestra a continuación y obtener acceso inmediato a los paneles (credenciales predeterminadas: admin/prom-monitor):

Para ver todas las métricas de Emojivoto, vas a utilizar uno de los paneles instalados por defecto desde Grafana.

Navega hasta la sección de Paneles de Grafana.

A continuación, busca el panel General/Kubernetes/Recursos de cómputo/Namespace (Pods) y accede a él.

Finalmente, selecciona la Fuente de datos de Prometheus y agrega el namespace emojivoto.

Puedes jugar y agregar más paneles en Grafana para visualizar otras fuentes de datos, así como agruparlas según el alcance. Además, puedes explorar los paneles de control disponibles para Kubernetes del proyecto kube-mixin de Grafana.

En el siguiente paso, configurarás almacenamiento persistente para Prometheus utilizando el almacenamiento de bloques de DigitalOcean para conservar tus métricas de DOKS y de la aplicación en caso de reinicios del servidor o fallos del clúster.

Paso 5 – Configurar Almacenamiento Persistente para Prometheus

En este paso, aprenderás cómo habilitar almacenamiento persistente para Prometheus para que los datos de métricas se conserven en caso de reinicios del servidor o fallos del clúster.

kubectl get storageclass

Primero, necesitas una clase de almacenamiento para continuar. Ejecuta el siguiente comando para verificar cuál está disponible.

NAME                         PROVISIONER                 RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
do-block-storage (default)   dobs.csi.digitalocean.com   Delete          Immediate           true                   4d2h

La salida debería ser similar a la siguiente. Observa que el almacenamiento de bloques de DigitalOcean está disponible para que lo utilices.

cd Kubernetes-Starter-Kit-Developers

A continuación, cambia el directorio (si aún no lo has hecho) donde se clonó el repositorio de Git del Kit de Inicio:

prometheusSpec:
  storageSpec:
    volumeClaimTemplate:
      spec:
        storageClassName: do-block-storage
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 5Gi

Entonces, abre el archivo 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml proporcionado en el repositorio del Kit de Inicio usando un editor de texto de tu elección (preferiblemente con soporte para linting YAML). Busca la línea storageSpec y descomenta la sección requerida para Prometheus. La definición de storageSpec debería lucir así:

  • Explicaciones para la configuración anterior:
  • volumeClaimTemplate – define un nuevo PVC.
  • storageClassName – define la clase de almacenamiento (debería usar el mismo valor que se muestra en la salida del comando kubectl get storageclass).

resources – establece el valor de solicitudes de almacenamiento. En este caso, se solicita una capacidad total de 5 Gi para el nuevo volumen.

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
  --namespace monitoring \
  -f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

Finalmente, aplica los ajustes usando Helm:

kubectl get pvc -n monitoring

Después de completar los pasos anteriores, verifica el estado del PVC:

NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS         MODES              AGE
kube-prome-prometheus-0   Bound    pvc-768d85ff-17e7-4043-9aea-4929df6a35f4   5Gi        RWO            do-block-storage   4d2h

A new Volume should appear in the Volumes web page from your DigitalOcean account panel:

La salida se verá similar a la siguiente. La columna STATUS debería mostrar Bound.

Paso 6 – Configurando Almacenamiento Persistente para Grafana

En este paso, aprenderás cómo habilitar el almacenamiento persistente para Grafana para que los gráficos se conserven a través de reinicios del servidor o en caso de fallos del clúster. Definirás una Reclamación de Volumen Persistente (PVC) de 5 Gi, utilizando el Almacenamiento en Bloque de DigitalOcean. Los siguientes pasos son iguales que el Paso 5 – Configuración de Almacenamiento Persistente para Prometheus.

grafana:
  ...
  persistence:
    enabled: true
    storageClassName: do-block-storage
    accessModes: ["ReadWriteOnce"]
    size: 5Gi

Primero, abre el archivo 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml proporcionado en el repositorio del Kit de Inicio, utilizando un editor de texto de tu elección (preferiblemente con soporte para linting YAML). La sección de almacenamiento persistente para Grafana debería lucir así:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

A continuación, aplica la configuración utilizando Helm:

kubectl get pvc -n monitoring

Después de completar los pasos anteriores, verifica el estado del PVC:

NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS         MODES              AGE
kube-prom-stack-grafana   Bound    pvc-768d85ff-17e7-4043-9aea-4929df6a35f4   5Gi        RWO            do-block-storage   4d2h

A new Volume should appear in the Volumes web page from your DigitalOcean account panel:

La salida se verá similar a la siguiente. La columna STATUS debería mostrar Bound.

Mejores Prácticas para el Dimensionamiento de PV

  • Para calcular el tamaño necesario para el volumen según tus necesidades, sigue el consejo y la fórmula oficial de la documentación:
  • Prometheus almacena un promedio de solo 1-2 bytes por muestra. Por lo tanto, para planificar la capacidad de un servidor Prometheus, puedes usar la fórmula aproximada:
    espacio_disco_necesario = tiempo_retención_segundos * muestras_ingestadas_por_segundo * bytes_por_muestra

Para reducir la tasa de muestras ingestadas, puedes reducir el número de series temporales que escaneas (menos objetivos o menos series por objetivo), o puedes aumentar el intervalo de escaneo. Sin embargo, reducir el número de series es probablemente más efectivo, debido a la compresión de muestras dentro de una serie.

Por favor, sigue la sección Aspectos Operativos para obtener más detalles sobre el tema.

Conclusión

En este tutorial, aprendiste cómo instalar y configurar el conjunto de herramientas Prometheus, luego usaste Grafana para instalar nuevos paneles y visualizar métricas de aplicaciones de clúster DOKS. También aprendiste cómo realizar consultas de métricas utilizando PromQL. Finalmente, configuraste y habilitaste almacenamiento persistente para Prometheus para almacenar las métricas de tu clúster.

Configurar el monitoreo del clúster DOKS con Helm y el operador Prometheus

Source:
https://www.digitalocean.com/community/developer-center/how-to-install-prometheus-monitoring-stack-for-doks-cluster