Observabilidad completa en Kubernetes

Observabilidad completa en Kubernetes

¿Como tener métricas, de nuestros servicios, y atomicidad de los Log's de manera centralizada?

Algo importante en la cultura DevOps y en Seguridad es la Observabilidad. Tal vez de los pilares más importantes, dentro de una estrategia DevSecOps. No descubro nada si en base a la observabilidad podemos hacer un troubleshooting más asertivo, podemos completar casos de uso de Seguridad para accionar en consecuencia o el sencillo hecho de escalar, de ser elásticos, en nuestros servicios.

Vamos a trabajar en nuestro entorno Kubernetes con este Poker: Grafana, Promtail, Loki y Prometheus.

¿Que hace cada componente?

Prometheus: Es un sistema de monitoreo y alerta diseñado para registrar métricas de sistemas y servicios. Funciona recolectando métricas de diferentes objetivos, como aplicaciones y servidores, almacenándolas en una base de datos de series temporales y permitiendo consultas y análisis de estas métricas en tiempo real. Altamente escalable y puede integrarse con otras herramientas y sistemas para realizar monitoreo completo de infraestructuras.

Loki: Es un sistema de almacenamiento de registros (logs), diseñado especialmente para ser usado con Prometheus. Loki permite la indexación y búsqueda eficiente de logs, utilizando etiquetas para organizar y filtrar los registros. Al integrarse con Prometheus, Loki proporciona una solución completa para la observabilidad de sistemas, permitiendo a los usuarios correlacionar métricas y registros para diagnósticos más precisos y eficientes.

Promtail: Es un componente asociado a Loki, diseñado para recolectar y enviar logs a un servidor Loki para su almacenamiento y procesamiento. Se encarga de la recopilación de logs desde diferentes fuentes, como archivos de registro locales o streams de logs de contenedores, aplicando etiquetas y envíandolos de manera eficiente a Loki para su indexación y almacenamiento. Es altamente configurable y se puede integrar fácilmente con sistemas de orquestación de contenedores como Kubernetes.

Grafana: Es una plataforma de visualización de datos utilizada comúnmente para la creación de paneles de monitoreo y tableros de visualización. Grafana puede conectarse a una variedad de fuentes de datos, incluyendo Prometheus y Loki, para mostrar métricas y logs de manera gráfica y personalizable. Permite la creación de dashboards interactivos con widgets y gráficos configurables, facilitando la monitorización y análisis de sistemas y servicios en tiempo real.

Requisitos

Necesitamos un clúster Kubernetes al que tengas acceso kubectl y Helm debe estar configurado en tu máquina. En primer lugar, tenemos que añadir el repositorio de Charts de Grafana a nuestra instalación local de Helm y obtener los últimos Charts de esta manera:

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

Instalación de Loki

Vamos a empezar instalando Loki, en el Cluster. Primero revisamos los valores del Chart y los guardamos en un archivo.

helm show values grafana/loki-distributed > loki-distributed-overrides.yaml

Vamos a realizar un cambio y darle espacio para que persistan los datos. Hay muchas opciones para configurar como tamaño de guardado, rotación o si queremos usar alguna File Sharing como AWS S3. En mi caso agregue 10GB en PersistentVolume. Vamos a instalar crear el namespace monitoring e instalamos el Chart.

kubectl create ns monitoring
namespace/monitoring created

> helm upgrade --install loki grafana/loki-distributed -n monitoring -f loki-distributed-overrides.yaml
Release "loki" does not exist. Installing it now.
NAME: loki
LAST DEPLOYED: Wed Feb 21 18:19:20 2024
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
***********************************************************************
 Welcome to Grafana Loki
 Chart version: 0.78.2
 Loki version: 2.9.2
***********************************************************************

Installed components:
* gateway
* ingester
* distributor
* querier
* query-frontend

Vamos a revisar si el deployment se inició en el namespaces monitoring.

Instalación Promtail

Vamos a exportar las variables de Promtail.

helm show values grafana/promtail > promtail-overrides.yaml

Ahora si podemos modificar las variables para que Promtail haga el push a el gateway de Loki. En nuestro caso es la dirección loki-loki-distributed-gateway

  # Must be reference in `config.file` to configure `clients`
  # @default -- See `values.yaml`
  clients:
    - url: http://loki-loki-distributed-gateway/loki/api/v1/push
  # -- Configures where Promtail will save it's positions file, to resume reading after restarts.
  # Must be referenced in `config.file` to configure `positions`

Ahora si podemos instalar el chart.

> helm upgrade --install --values promtail-overrides.yaml promtail grafana/promtail -n monitoring
Release "promtail" does not exist. Installing it now.
NAME: promtail
LAST DEPLOYED: Wed Feb 21 18:33:58 2024
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
***********************************************************************
 Welcome to Grafana Promtail
 Chart version: 6.15.5
 Promtail version: 2.9.3
***********************************************************************

Verify the application is working by running these commands:
* kubectl --namespace monitoring port-forward daemonset/promtail 3101
* curl http://127.0.0.1:3101/metrics

Vamos a mirar si tenemos los pods correspondientes a Loki & Promtail.

Promtail actua como un Sidecard, tendremos la cantidad en base a la cantidad de nodos. Nosotros estamos jugando con Minikube, por ende sera un solo nodo.

Instalación Grafana

Vamos a revisar, de manera gráfica, si estamos enviando a logs a Loki. Instalamos y luego nos hacemos de la contraseña del usuario admin.

helm install grafana grafana/grafana --namespace monitoring
NAME: grafana
LAST DEPLOYED: Wed Feb 21 18:37:55 2024
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:

   kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo


2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana.monitoring.svc.cluster.local

   Get the Grafana URL to visit by running these commands in the same shell:
     export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana" -o jsonpath="{.items[0].metadata.name}")
     kubectl --namespace monitoring port-forward $POD_NAME 3000

3. Login with the password from step 1 and the username: admin
#################################################################################
######   WARNING: Persistence is disabled!!! You will lose your data when   #####
######            the Grafana pod is terminated.                            #####
#################################################################################

Ahora adquirimos la contraseña.

kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
ZYiE7TheaQ0EeKlcUrlgT9Y4XQpx24ZgrVivZVou

Tenemos muchas opciones para publicar Grafana, les recomiendo leer el artículo de ArgoTunnel con Cloudflare, pero si queremos hacerlo de manera local en minikube lo haremos de esta manera:

minikube service grafana -n monitoring --url
😿  service monitoring/grafana has no node port
http://127.0.0.1:50592
❗  Porque estás usando controlador Docker en darwin, la terminal debe abrirse para ejecutarlo.

Ingresamos a http://127.0.0.1:50592 y agregamos la fuente en Grafana. En nuestro caso http://loki-loki-distributed-gateway .

Ahora si podemos explorar los logs, de nuestro Cluster. Para probar voy a usar esta consulta {pod="grafana-7487967bff-kdmn7"} .

Dashboard Log's Loki

Vamos a importar el Dashboard 15141.

Uala! Tenemos los log's, con filtros para una rápida accesibilidad.

Ahora nos quedan las métricas, de nuestro Cluster.

Instalación de Prometheus

Ahora, vamos por las métricas.

helm install prometheus prometheus-community/prometheus -n monitoring
NAME: prometheus
LAST DEPLOYED: Wed Feb 21 19:01:56 2024
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-server.monitoring.svc.cluster.local


Get the Prometheus server URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=prometheus,app.kubernetes.io/instance=prometheus" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace monitoring port-forward $POD_NAME 9090


The Prometheus alertmanager can be accessed via port 9093 on the following DNS name from within your cluster:
prometheus-alertmanager.monitoring.svc.cluster.local


Get the Alertmanager URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=alertmanager,app.kubernetes.io/instance=prometheus" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace monitoring port-forward $POD_NAME 9093
#################################################################################
######   WARNING: Pod Security Policy has been disabled by default since    #####
######            it deprecated after k8s 1.25+. use                        #####
######            (index .Values "prometheus-node-exporter" "rbac"          #####
###### .          "pspEnabled") with (index .Values                         #####
######            "prometheus-node-exporter" "rbac" "pspAnnotations")       #####
######            in case you still need it.                                #####
#################################################################################


The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:
prometheus-prometheus-pushgateway.monitoring.svc.cluster.local


Get the PushGateway URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace monitoring -l "app=prometheus-pushgateway,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace monitoring port-forward $POD_NAME 9091

For more information on running Prometheus, visit:
https://prometheus.io/

Revisamos el namespace monitoring. Tenemos todos los recursos corriendo.

Dashboard Métricas Prometheus

Ahora vamos a configurar a Prometheus como fuente y luego instalar un Dashboard, para visualizar las métricas más comunes del Cluster.

Ahora importamos un Dashboard, prearmado 3262.

Ya empezamos a tener, de a poco, métricas.

Prometheus a instalado otros componentes como Pushgateway o Alertmanager que puede ser interesante que revisen para poder notificar, tomar acciones, escalar, etc.

Espero que les sirva.