lunes, 5 de agosto de 2024

Monitoreo y Observabilidad: Instalando Grafana - Parte 2


Este post es continuación de [Monitoreo y Observabilidad: Instalando Prometheus - Parte 1](https://www.ahioros.info/2024/08/monitoreo-y-observabilidad-instalando.html)

## ¿Qué es Grafana?

**Grafana** es una herramienta open-source de análisis, almacenamiento y visualización de series de datos, ofreciendo una interfaz de usuario amigable y muy poderosa.

En el ejemplo que estoy usando [Prometheus](https://www.ahioros.info/2024/08/monitoreo-y-observabilidad-instalando.html) como nuestra fuente de información (Datasource).

Básicamente Prometheus es el que se encarga de recabar los datos, mientras que **Grafana** es el que se encarga de mostrar la información.

**Nota:** Debido a que yo lo estoy ejecutando desde un cluster de Kubernetes onpremise, he tenido que definir un PV, por lo que si tu intentas ejecutarlo en tu proveedor de nube no debería ser necesario ya que dicho almacenamiento te lo debe facilitar tu proveedor en la nube.

Aqui te dejo el video para que vayas realizándolo conmigo:



## Instalación

Crear un namespace:

**01-namespace.yaml**

    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: grafana
    ---

Crear de PV:

**Nota:** el path: lo puedes cambiar por cualquier directorio que exista (o lo puedes crear) en tus nodos y que tengas espacio mayor o igual a 1G.

**02-grafana-pv.yaml**

    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: grafana-pv
      labels:
        type: local
      namespace: grafana
    spec:
      storageClassName: manual
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/mnt/grafana"
    ---
Crear de PVC:

**03-grafana-pvc.yaml**

    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: grafana-pvc
      namespace: grafana
    spec:
      storageClassName: manual
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    ---
Creación del deployment:

**04-grafana-deployment.yaml**

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grafana
      labels:
        app: grafana
      namespace: grafana
    spec:
      selector:
        matchLabels:
          app: grafana
      template:
        metadata:
          labels:
            app: grafana
        spec:
          securityContext:
            fsGroup: 472
            supplementalGroups:
              - 0
          containers:
            - name: grafana
              image: grafana/grafana:latest
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 3000
                  name: http-grafana
                  protocol: TCP
              readinessProbe:
                failureThreshold: 3
                httpGet:
                  path: /robots.txt
                  port: 3000
                  scheme: HTTP
                initialDelaySeconds: 10
                periodSeconds: 30
                successThreshold: 1
                timeoutSeconds: 2
              livenessProbe:
                failureThreshold: 3
                initialDelaySeconds: 30
                periodSeconds: 10
                successThreshold: 1
                tcpSocket:
                  port: 3000
                timeoutSeconds: 1
              resources:
                requests:
                  cpu: 250m
                  memory: 750Mi
              volumeMounts:
                - mountPath: /etc/grafana/provisioning
                  name: grafana-pv
          volumes:
            - name: grafana-pv
              persistentVolumeClaim:
                claimName: grafana-pvc
    ---

Creación del service:

**05-grafana-service.yaml**
**Nota:** Recuerda que en mi caso estoy usando metallb para crear un load balancer.

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: grafana
      namespace: grafana
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: http-grafana
      selector:
        app: grafana
      sessionAffinity: None
      type: LoadBalancer
    ---

Después de unos segudos podemos ver todo lo que se ha creado en el namespace grafana. Ahora podemos entrar (en mi caso) a grafana con la dirección que nos da el load balancer.
Yo he agredo la IP en mi /etc/hosts para poder entrar:

Vamos al navegador y ponemos la URL si usaste un port-forward adelante.
Las credenciales por default son:
    **username: admin**
    **password: admin**

Una vez presiones **Log in**, te pedirá introducir y confirmar un nuevo password.

## Primero Pasos con Grafana

Vamos a agregar una nueva fuente de datos (Datasource):

    1. En el panel de la izquierda vamos **Connections -> Data sources**.
    2. Buscamos o escribimos Prometheus y damos click.
    3. En la sección **Connection** debes ingresar la URL donde estás ejecutando Prometheus. por ejemplo en mi caso es esta:
    4. Vamos hasta la parte de abajo y le damos click en **Save & test**
    5. Listo ya tienes la fuente de datos configurada.

## Dashboards con Grafana

Una de las grandes ventajas que tiene **Grafana** es su comunidad (como en todo proyecto de software libre/open-source) y es que no tenemos que reinventar la rueda, es decir, no hay necesidad de crear desde cero los dashboard, la comunidad ya comparte unos y muy buenos, los cuales después de importarlos los puedes modificar/editar a tus necesidades.

Para importar un dashboard hay que realizar los siguientes pasos:

    1. En el panel de la izquierda vamos a **Dashboards**.
    2. Damos click en el botón arriba a la derecha que dice **New -> Import**. También lo puedes hacer en el botón del centro de la pantalla que dice **+ Create dashboard** y en la siguiente pantalla le das click en import (es un poco más largo este camino).
    3. Abre una pestaña nueva y ve al sitio donde se comparten los dashboards:
      http://grafana.com/dashboards
    4. Busca el dashboard que quieres importar y le das click, por ejemplo yo elegí este:
    5. Ahora debes buscar en esa página donde dice ID, copia ese número.
    6. Regresa a la ventana de Grafana y pega el ID, después le das click en el botón **Load.** En esta ventana le puedes cambiar el nombre al dashboard (aunque lo puedes hacer después), mira que arriba del botón **import** dice Prometheus, dale click para que se desplieguen los datasources, en nuestro caso solo tenemos uno que es Prometheus, lo seleccionas y después le das click en **Import**.
    7. Listo ya tienes el dashboard importado.


## Grafana más que dashboards

Con **Grafana** también puedes crear tus alertas de una forma más sencilla que usando prometheus, dependiendo del dashboard, así puedes crear una alerta para cuando detecte problemas a partir del dashboard de "hardware" para que le lleguen al equipo de infraestructura y crear una alerta para cuando detecte problemas a partir del dashboard de la aplicación y que le llegue la notificación al equipo de desarrollo por mencionar un ejemplo.

De igual forma puedes incluir los yaml de **Grafana** dentro de un repositorio para que sean leídos por **Argo CD** y automatices la creación de un cluster de Kubernetes o el despliegue de una nueva versión.
Te dejo de tarea (enseño a pescar, no regalo un pez) como implementar **Thanos** para que guardes los datos y que puedas consultarlos en el futuro.

## Conclusión

Hasta aquí he cubierto todo el esquema de CI/CD, de una manera sencilla usando **Microsoft Azure DevOps**. Estoy meditando si mostrar como usar **Github Actions** es otro estandar usado por las empresas. También tengo pensado implementar un poco de DevSecOps.

Espero que te sirvan esta serie de post, si tienes dudas déjalas abajo en los comentarios.

Aquí está el repositorio de [Azure DevOps](https://dev.azure.com/guillermogarcialedezma/DockerHub%20Test/).

No hay comentarios.: