Monitor
En la actualidad, uno de los puntos más importantes es poder monitorizar y entender el funcionamiento de todo el sistema. Tenemos muchas opciones para ello, aunque la combinación Prometheus+Grafana es la más común.
Existe un pack que unifica varias de las piezas más comunes. Por defecto este despliega:
- Prometheus para almacenar los datos.
- Alertmanager para detectar y avisar de alertas en el sistema.
- Grafana como visualizador de las métricas.
- Varias alertas y dashboards de Grafana para detectar y mostrar las métricas.
- Un nuevo
Custom Resources
para gestionar los Prometheus desplegados, la configuración de estos servicios y permitir su configuración a base de estos recursos y no con configuración directa.
El pack contiene más piezas y puede requerir de otras configuraciones no explicadas en este artículo (como el envío de las alertas a un sistema que nos avise activamente).
Debido a la complejidad de Prometheus y Grafana, este artículo se limita a su instalación. Aconsejo encarecidamente dedicar unas semanas y/o comprar un curso especializado para entender su funcionamiento y aprender a configurarlos.
Despliegue
Más detalles en Artifact Hub.
Añadimos el repositorio.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
Definimos las variables.
vi monitoring-values.yaml
Los tres servicios principales requieren de un volumen para almacenar datos y configuración. También exponemos a Grafana vía Ingress.
prometheus:
prometheusSpec:
storageSpec:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 40Gi
alertmanager:
alertmanagerSpec:
storage:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 500Mi
grafana:
adminPassword: adminadmin
ingress:
enabled: true
ingressClassName: nginx-intranet
hosts:
- grafana.domain.intranet
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
persistence:
enabled: true
accessModes: ["ReadWriteOnce"]
size: 500Mi
La configuración por defecto indica 2 días de alertas y 10 días de métricas. El espacio de los volúmenes tiene que adaptarse acorde a ello y nuestro volumen de datos.
helm upgrade --install kube-prom prometheus-community/kube-prometheus-stack \
-f monitoring-values.yaml \
--namespace monitoring-system --create-namespace
Al actualizar el Helm se debe revisar si existen cambios manuales.
Configuración
En Grafana disponemos de muchos dashboards para mostrar los datos de los nodos y los servicios detectados desde el punto de vista de Kubernetes, aun así, si un servicio dispone de sus propias métricas, es aconsejable activarlo y tener un dashboard especializado.
Con las herramientas por defecto es posible detectar la CPU, memoria y red utilizada por los servicios, pero no datos internos como cantidad de hilos activos, diferentes tipos de memoria, o incluso la memoria utilizada realmente, ya que varios lenguajes tienden a mantener reservada el máximo de memoria utilizada.
Para recolectar los datos de un servicio se requiere:
- El servicio debe exponer sus datos en el formato de Prometheus.
- Para que Prometheus se conecte a ese servicio, se debe crear un
Custom Resources
para indicarle los datos. Normalmente se utiliza elService Monitor
. Por defecto el sistema despliega varios que pueden utilizarse como ejemplo. - Cada Prometheus desplegado detecta su configuración según aquellos que tienen un label con su nombre. En este caso, toda la configuración deberá tener el siguiente label:
release=kube-prom
. - La experiencia me dice que es más sencillo mirar la sección de
Status
de Prometheus para ver si todo funciona o deducir errores antes que revisar sus logs. Este es accesible creando unPort Forwarding
al servicio de Prometheus (kube-prometheus-prometheus
). - Grafana mostrará los datos si disponemos de un dashboard. Podemos crear uno o utilizar uno de la comunidad como base.
- Una vez entendemos los datos y gráficos, es aconsejable crear alertas útiles.
Grafana dashboards
Los dashboards de Grafana se pueden crear e importar desde su UI. Debido al volumen estos datos no se deberían perder, pero en alguna actualización me han desaparecido misteriosamente.
Para evitar estos problemas y simplificar el sistema, es más práctico configurar los dashboards como un ConfigMap
dentro del mismo namespace. Estos son importados automáticamente por Grafana.
Ejemplo para crearlo vía kubectl
:
kubectl create configmap grafana-dashboard-name --from-file=grafana-dashboard-name.json -n monitoring-system
kubectl label configmap grafana-dashboard-name grafana_dashboard=1 -n monitoring-system
Ejemplo vía yaml:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
grafana_dashboard: "1"
name: grafana-dashboard-name
namespace: monitoring-system
data:
grafana-dashboard-name.json: |-
{
...
}