A lo largo de la larga historia de la Tierra, la evolución ha sido la razón principal detrás de cómo los seres vivos se adaptan y sobreviven. Desde los microorganismos unicelulares hasta la variedad de vida que conocemos hoy en día, cada cambio en la evolución ha significado un avance en la complejidad y en cómo funcionan las cosas.

De manera interesante, esta misma idea de evolución se puede ver en la tecnología, especialmente en cómo funcionan las aplicaciones en Kubernetes. En este artículo exploraremos cómo el despliegue de aplicaciones ha evolucionado con el tiempo, desde los primitivos comandos de kubectl hasta las soluciones más avanzadas como Helm y Helmfile, que actúan como matrioskas tecnológicas, añadiendo capas de eficiencia en cada paso.

¿Qué es un manifiesto de Kubernetes?

Antes de adentrarnos en las herramientas específicas, es crucial comprender el contexto detrás de Kubernetes. Un manifiesto de Kubernetes es un fichero que puede ser escrito en YAML o JSON e indica uno o varios objetos de Kubernetes y sus propiedades. El fichero define el estado deseado del objeto y se mantiene persistente cuando es desplegado dentro de Kubernetes.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Esta aplicación puede desplegarse de la manera más primitiva utilizando kubectl. Sin embargo, ¿qué sucede si nuestra aplicación está compuesta por múltiples objetos? ¿Y si deseamos desplegar la misma aplicación pero con algunas propiedades diferentes en otro entorno?

Podríamos concluir que desplegar aplicaciones de esta manera podría ser una opción válida, pero con el tiempo podría volverse difícil de mantener.

¿Qué son Helm y los Helm Charts?

El proyecto Helm tuvo su origen en 2015 como respuesta a la creciente necesidad de simplificar y estandarizar el proceso de despliegue de aplicaciones en Kubernetes. Para entender Helm, podemos hacer una analogía con otros gestores de paquetes como YUM o APT, ampliamente utilizados en sistemas operativos.

Helm utiliza un formato de empaquetado llamado Charts. Un Helm Chart es una colección de manifiestos que componen una aplicación de Kubernetes. La principal ventaja de Helm radica en su capacidad para simplificar y automatizar el despliegue de aplicaciones en Kubernetes al proporcionar plantillas configurables y permitir la personalización de valores específicos para cada entorno.

La estructura de un Helm Chart típicamente se ve así:

.
└── my-release
    ├── charts
    ├── Chart.yaml
    ├── templates
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── hpa.yaml
    │   ├── ingress.yaml
    │   ├── NOTES.txt
    │   ├── serviceaccount.yaml
    │   ├── service.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml

Helm ofrece beneficios notables, como la capacidad de mantener diferentes versiones de una aplicación desplegada en el clúster, lo que facilita la reversión a versiones anteriores si es necesario. Además, Helm es extensible y puede ampliarse con plugins que se integran perfectamente en su funcionalidad.

Sin embargo, a medida que nuestras implementaciones y entornos se vuelven más complejos, surgen desafíos adicionales. Por ejemplo, ¿cómo gestionar múltiples aplicaciones en diferentes entornos? ¿Y qué hacer si uno de nuestros Helm Charts tiene requisitos o configuraciones únicas?

Helmfile

A medida que las aplicaciones se vuelven cada vez más complejas y se despliegan en diversos entornos de Kubernetes, Helmfile emerge como la próxima fase en la evolución de la gestión de aplicaciones.

Helmfile es una herramienta diseñada para facilitar la gestión de múltiples Helm Charts. Esto permite definir y mantener el estado deseado de sus aplicaciones en varios clústeres de Kubernetes y entornos de manera más sencilla.

Helmfile agiliza la gestión de versiones, la implementación y la gestión de configuraciones específicas para cada entorno, lo que resulta en un despliegue más eficiente y consistente de sus aplicaciones.

Entre sus beneficios de uso se encuentran:

Primeros pasos

En esta primera toma de contacto, mostraremos una instalación simple. Supongamos que tenemos un fichero helmfile.yaml con el siguiente contenido:

repositories:
 - name: prometheus-community
   url: https://prometheus-community.github.io/helm-charts

releases:
- name: prom-norbac-ubuntu
  namespace: prometheus
  chart: prometheus-community/prometheus
  set:
  - name: rbac.create
    value: false

Los pasos para instalar una aplicación con Helmfile:

  1. Instalar las dependencias requeridas.
helmfile init
  1. Sincronizar el estado de su clúster de Kubernetes con el estado deseado definido en el fichero helmfile.yaml.
helmfile apply

Configuración Avanzada

La configuración de Helmfile puede llegar a ser compleja. En lugar de adjuntar el contenido completo, te invitamos a revisar el fichero de ejemplo proporcionado en la documentación oficial de Helmfile para obtener todos los detalles.

Complementos

Estructura avanzada

La definición de una estructura de ficheros puede ser definida de múltiples formas, podría verse así:

.
├── bases
│   ├── environments.yaml
│   └── helmDefaults.yaml
├── helmfile.yaml
├── releases
│   └── my-release
│       ├── defaults.yaml
│       ├── envs
│       │   ├── pre
│       │   │   └── values.yaml
│       │   └── pro
│       │       └── values.yaml
│       └── helmfile.yaml
└── templates
    └── default_values.yaml

Todo lo citado anteriormente puede parecer complejo (y lo es), por ello te invito a profundizar en el uso de Helmfile a través del siguiente repositorio, en el que añado ejemplos con VALS, Helm-git y SOPS.

Comandos útiles

Integración con GitOps

Por último, es importante destacar que Helmfile no solo simplifica la gestión de aplicaciones en Kubernetes, sino que también puede integrarse fácilmente en enfoques de GitOps.

Al combinar Helmfile con herramientas de GitOps como Flux o ArgoCD, puedes llevar la automatización y la gestión de aplicaciones al siguiente nivel. Esto significa que tus declaraciones de Helm Charts y configuraciones pueden vivir en repositorios de Git, lo que facilita la colaboración y la trazabilidad.

Flux y ArgoCD se encargarán de mantener tus aplicaciones sincronizadas con estos repositorios y aplicarán automáticamente los cambios según las actualizaciones en tus archivos helmfile.yaml.

Conclusiones

En este recorrido por la evolución de las herramientas para el despliegue de aplicaciones en Kubernetes, hemos presenciado cómo la tecnología se ha adaptado y evolucionado para hacer frente a desafíos cada vez más complejos.

Desde los simples comandos de kubectl hasta las soluciones avanzadas como Helm y Helmfile, cada etapa ha aportado mayor eficiencia y flexibilidad a la gestión de aplicaciones en entornos Kubernetes.

En un mundo donde la tecnología sigue evolucionando para adaptarse a entornos en constante cambio, herramientas como Helmfile se convierten en aliados esenciales para mantener aplicaciones escalables y eficientes en entornos Kubernetes cada vez más complejos.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete