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:

  • Gestión de versiones y dependencias. Permite definir versiones específicas de los Helm Charts, lo que garantiza la consistencia y la reproducibilidad de los despliegues. Además, puedes gestionar fácilmente la dependencia entre los distintos Helm Charts.
  • Configuración en un solo lugar. Puedes centralizar la configuración de tus aplicaciones en un único repositorio o en un único fichero YAML, lo que hace más sencillo de gestionar y mantener.
  • Despliegue por lotes. Permite despegar o actualizar múltiples aplicaciones de una sola vez, lo que ahorra tiempo y garantiza coherencia en los despliegues.
  • Gestión de entorno. Permite definir configuraciones específicas para distintos entornos.
  • Mayor control y flexibilidad. Aunque internamente utiliza Helm y kubectl, brinda un mayor control y flexibilidad sobre los despliegues y las operaciones en comparación con las herramientas individuales. Puedes personalizar los comandos de Helm y kubectl que se ejecutan durante el proceso de despliegue.
  • Helmfile es una especificación declarativa para implementar Helm Charts. Aunque aún se encuentra en su etapa inicial de desarrollo, ya es utilizado por múltiples compañías en entornos de producción.

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

  • Helm-diff: Este complemento permite mostrar las diferencias entre los Helm Charts y los desplegados en el clúster de Kubernetes. Una visión similar a la de ejecutar un Terraform plan.
  • Helm-git: Permite obtener ficheros de valores de repositorios.
  • SOPS: Es un editor de archivos cifrados que admite varios formatos y métodos de cifrado como AWS KMS, GCP KMS, Azure Key Vault, Age o PGP.
  • VALS: Es una herramienta que permite obtener datos de diferentes fuentes como Hashicorp Vault, AWS SSM Parameter Store, AWS Secrets Manager, AWS S3, GCP Secrets Manager, Google Sheets, ficheros SOPS o Terraform State.
  • Helm-secrets: Puede descifrar valores de archivos encriptados con SOPS y gestionar secretos de diferentes fuentes con VALS. En los ficheros de configuración de Helmfile, se define una lista de ficheros de valores bajo la propiedad secrets, o también pueden ser obtenidos con la función fetchSecretValue.

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
  • El directorio “bases” contiene dos ficheros: helmDefaults.yaml, que indica la configuración global para pasar a helm. y environments.yaml, que define los diversos entornos y contiene valores que deben compartirse entre todas las aplicaciones.
  • El fichero “helmfile.yaml” de nivel superior permite anidar otros helmfiles.yaml como los que se encuentran dentro de releases, permitiendo manejar todas las aplicaciones con un solo comando.
  • El directorio “releases” contiene subdirectorios que pueden contener una o más aplicaciones. Cada aplicación se compone de múltiples ficheros como defaults.yaml (valores por defecto), helmfile.yaml (fichero de configuración de la release) y el directorio envs (entorno), con ficheros como values.yaml (valores del entorno).
  • Por último, en el directorio “templates” se define el fichero default_values.yaml, que permite indicar bloques de código reutilizables entre las diferentes aplicaciones.

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

  • Renderizar el entorno pre: helmfile template -e pre
  • Mostrar diferencias: helmfile diff -e dev
  • Sincronización: helmfile sync -e dev
  • Exportar Variables para usar VALS: export HELM_SECRETS_BACKEND=vals
  • Eliminar Despliegues: helmfile destroy -e dev

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.