# Observabilidad completa en Kubernetes

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:

```abap
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.

```abap
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.

```abap
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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708550539364/91a28a0a-fa8d-4e93-97a6-a486b9858336.png align="center")

## Instalación Promtail

Vamos a exportar las variables de Promtail.

```abap
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`

```yaml
  # 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.

```abap
> 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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708551350597/af5735ce-a240-4663-b7b6-34318201f9c2.png align="center")

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

```abap
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.

```abap
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](https://blog.santiagoagustinfernandez.com/publicar-nuestro-ambientes-kubernetes-mediante-cloudflare), pero si queremos hacerlo de manera local en **minikube** lo haremos de esta manera:

```abap
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` .

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708552368002/d6609d2e-f7f3-44a2-bee3-2d4e3eaecd93.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708552522122/9ed399a4-5dd8-40d3-906f-50807d240aa5.png align="center")

### Dashboard Log's Loki

Vamos a importar el Dashboard 15141.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708552770237/7b680913-27a3-4085-866f-62fa360b8957.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708552780174/c6dcec95-3dc8-4bc6-a1cd-240cbe701de6.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708552793930/deebc635-4dab-4bd6-b488-d6615c7e5b28.png align="center")

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

## Instalación de Prometheus

Ahora, vamos por las métricas.

```abap
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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708553091432/a449572c-c7e1-417d-91ba-8a35142ff07a.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708553380867/1d0d26f7-9cbd-40fa-873b-d44fae9fb489.png align="center")

Ahora importamos un Dashboard, prearmado 3262.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708553555008/d537b019-55a8-4eb3-ba0e-3ef80d9b71d7.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708553565612/ccc213a9-4450-4097-88f7-3b249ff95483.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1708553584155/af106f74-dcb7-4947-af4d-d7f2cbee1bf3.png align="center")

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.
