¿Qué es Helm? Instalación y funcionamiento. Bloque 2. Tema 2.6 del CKA.


  Helm es una herramienta de gestión de paquetes para Kubernetes que facilita el despliegue, actualización y gestión de aplicaciones complejas en clústeres. Podríamos compararlo con administradores de paquetes como apt o yum en Linux, pero diseñado específicamente para Kubernetes. Helm permite empaquetar aplicaciones Kubernetes en "charts", lo que simplifica el despliegue y la gestión de múltiples recursos de Kubernetes (pods, servicios, configuraciones, secretos, etc.) como una sola unidad.

¿Qué es un Chart en Helm?

Un Chart es una colección de archivos que describe una aplicación de Kubernetes. Piensa en un chart como una "plantilla" para tu aplicación. Un chart puede incluir todo lo necesario para desplegar una aplicación, incluyendo despliegos, servicios, configuraciones y hasta ConfigMaps o Secrets. Los charts hacen que sea fácil definir, instalar y actualizar aplicaciones en Kubernetes.

¿Qué hace Helm?

Helm se encarga de varias tareas importantes:

  1. Desplegar aplicaciones: Con Helm, puedes desplegar aplicaciones complejas con un solo comando. Esto es útil si necesitas instalar aplicaciones que requieren múltiples componentes, como una base de datos, un servicio backend y un frontend, todo en un solo despliegue.

  2. Gestionar actualizaciones: Helm permite gestionar las actualizaciones de una aplicación fácilmente. Puedes actualizar una aplicación sin interrumpir su funcionamiento, de manera similar a cómo Kubernetes maneja los rolling updates.

  3. Versionado y reversión: Helm guarda un historial de cada despliegue, lo que permite volver a versiones anteriores en caso de que una actualización falle.

  4. Plantillas reutilizables: Puedes definir parámetros y valores en archivos de configuración que luego son usados para generar configuraciones dinámicas para Kubernetes. Esto es ideal cuando necesitas desplegar la misma aplicación en diferentes entornos (desarrollo, pruebas, producción), ya que puedes modificar solo los valores específicos para cada entorno, manteniendo la lógica del despliegue constante.

Componentes de Helm

Helm tiene dos componentes principales:

  1. Helm Client: Es la herramienta que utilizas en la línea de comandos. Envía los comandos y solicitudes al clúster de Kubernetes, y también interactúa con los repositorios de charts.

  2. Helm Charts: Los charts son paquetes Helm. Cada chart contiene la definición de recursos de Kubernetes y los parámetros de configuración que se pueden ajustar para personalizar la instalación.

¿Cómo funciona Helm?

Cuando usas Helm para desplegar una aplicación, el proceso general es el siguiente:

  1. Descargar o crear un chart: Puedes usar un chart predefinido que ya exista en los repositorios públicos de Helm, como el repositorio de Bitnami, o puedes crear tu propio chart.

  2. Instalar el chart: Cuando ejecutas el comando helm install, Helm lee el chart y crea los objetos de Kubernetes necesarios (pods, servicios, etc.) en tu clúster.

  3. Gestionar versiones: Cada vez que instalas un chart, Helm guarda un historial de versiones. Esto te permite volver atrás si hay algún problema.

  4. Actualizar aplicaciones: Si necesitas actualizar la configuración o versión de tu aplicación, puedes usar helm upgrade. Helm aplicará los cambios sin necesidad de eliminar la aplicación.

  5. Revertir cambios: Si una actualización falla, puedes usar helm rollback para revertir a una versión anterior.

Ejemplo práctico

Supongamos que deseas instalar Redis en tu clúster de Kubernetes. Puedes usar Helm para hacerlo de forma rápida:


helm repo add bitnami https://charts.bitnami.com/bitnami helm install my-redis bitnami/redis

En este caso, my-redis es el nombre de la instancia y bitnami/redis es el chart que estás instalando desde el repositorio de Bitnami. Helm creará todos los recursos necesarios para desplegar Redis, como pods, servicios y configuraciones.

A tener en cuenta que dentro de Kubernetes, Helm puede tener aplicaciones adicionales:

  1. Implementaciones de CI/CD:

    • Helm es ampliamente utilizado en pipelines de CI/CD (Integración Continua y Entrega Continua) para automatizar el despliegue de aplicaciones en Kubernetes. Muchas herramientas de CI/CD, como Jenkins, GitLab CI o Argo CD, se integran con Helm para facilitar la entrega continua de aplicaciones.
  2. Infraestructura como código (IaC):

    • Helm puede integrarse con herramientas de Infraestructura como Código (IaC), como Terraform o Ansible. En estos casos, Helm se utiliza para gestionar los recursos de Kubernetes en conjunto con otros recursos de infraestructura.
  3. Deployments multi-entorno:

    • Si trabajas con múltiples entornos (desarrollo, pruebas, producción), Helm facilita la gestión de configuraciones específicas para cada entorno. Con los archivos de valores (values.yaml), puedes definir configuraciones específicas para cada entorno sin necesidad de duplicar los manifiestos de Kubernetes.

Helm permite tanto la gestión declarativa como imperativa de recursos en Kubernetes, combinando las ventajas de ambos enfoques. Veamos cómo funciona cada uno dentro del contexto de Helm:

1. Gestión Declarativa con Helm

El enfoque declarativo implica definir el estado deseado de los recursos en archivos YAML (en este caso, los Helm Charts) y luego aplicar estos manifiestos para que Kubernetes mantenga el estado definido. Con Helm, este enfoque declarativo se gestiona a través de Helm Charts, que son colecciones de plantillas de YAML predefinidas para Kubernetes.

  • Ejemplo declarativo con Helm:

    1. Helm Chart (Manifiesto Declarativo):

      Supongamos que queremos desplegar una aplicación usando un Helm Chart llamado my-chart. En el chart, el manifiesto declarativo se encuentra en archivos YAML dentro de la estructura del chart. Estos son algunos archivos que podrías encontrar en el chart:

      • Chart.yaml: Define los metadatos del chart.
      • values.yaml: Contiene los valores configurables por defecto para el chart.
      • templates/deployment.yaml: Este es el archivo que define el Deployment de Kubernetes para la aplicación.

      Archivo de ejemplo templates/deployment.yaml:

      apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-app spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Release.Name }}-app template: metadata: labels: app: {{ .Release.Name }}-app spec: containers: - name: my-app image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" ports: - containerPort: 80 resources: limits: cpu: {{ .Values.resources.limits.cpu }} memory: {{ .Values.resources.limits.memory }} requests: cpu: {{ .Values.resources.requests.cpu }} memory: {{ .Values.resources.requests.memory }}

      En este ejemplo, el manifiesto del Deployment está templado, lo que significa que se ajustará dinámicamente a los valores proporcionados en values.yaml. Las variables como {{ .Values.image.repository }} se reemplazarán con los valores reales definidos por el usuario al instalar el chart.

    2. Archivo values.yaml (archivo de configuración de valores):

      replicaCount: 3 image: repository: my-app-image tag: "1.0.0" resources: limits: cpu: "500m" memory: "256Mi" requests: cpu: "250m" memory: "128Mi"

      En este archivo values.yaml, se definen los valores por defecto que se pueden personalizar cuando instalamos el chart.

    3. Aplicar el Chart Declarativamente con Helm:

      Una vez que tienes estos archivos listos, puedes usar Helm para aplicar este chart declarativamente, especificando los valores personalizados que desees o usando los valores por defecto:

      helm install my-release ./my-chart

      Este comando utiliza el chart llamado my-chart, que contiene los manifiestos YAML (como el deployment mostrado arriba) y aplica la configuración en el clúster de Kubernetes. Helm se encarga de generar los manifiestos completos a partir de las plantillas y valores.

2. Gestión Imperativa con Helm

El enfoque imperativo implica emitir comandos específicos para que Kubernetes realice una acción inmediata sobre los recursos, como crear, eliminar o actualizar objetos.

  • Helm permite acciones imperativas como la instalación, actualización o eliminación de charts mediante comandos como helm install, helm upgrade, y helm uninstall.

  • Aunque los manifiestos subyacentes sean declarativos, el comando en sí es imperativo, ya que ordena a Kubernetes aplicar cambios inmediatos.

    Ejemplo:

    helm uninstall my-release

    Este comando elimina el release asociado con el chart my-release de forma imperativa.

¿Cómo funciona el rollback en Helm?

Cuando instalas un chart con Helm, este crea un release de la aplicación en el clúster de Kubernetes. Cada vez que realizas una actualización de ese release, Helm guarda un historial de versiones para poder revertir a una versión anterior en caso necesario. Helm asigna un número de revisión a cada una de estas versiones.

El rollback en Helm toma una revisión anterior (identificada por un número de revisión) y vuelve a esa versión específica del release, deshaciendo los cambios realizados en revisiones posteriores.

Pasos para realizar un rollback en Helm:

1. Ver el historial de versiones (revisiones) de un release

Antes de hacer un rollback, es útil revisar las versiones disponibles para el rollback. Puedes usar el siguiente comando para listar las revisiones de un release específico:

helm history my-release

Este comando muestra un historial de todas las revisiones del release my-release, con la siguiente información:

  • REVISION: Número de revisión del release.
  • UPDATED: Fecha y hora en la que se realizó la actualización.
  • STATUS: Estado del release (deployed, superseded, etc.).
  • CHART: Nombre y versión del chart que fue instalado.
  • APP VERSION: Versión de la aplicación.
  • DESCRIPTION: Descripción del cambio (por ejemplo, instalación, actualización).

Ejemplo de salida:

REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Thu Oct 07 10:31:42 2023 deployed my-chart-0.1.0 1.0 Install complete 2 Thu Oct 08 11:00:15 2023 deployed my-chart-0.1.1 1.1 Upgrade complete 3 Thu Oct 09 09:42:01 2023 deployed my-chart-0.1.2 1.2 Upgrade complete

2. Realizar el rollback a una revisión anterior

Una vez que has identificado a qué revisión deseas hacer rollback, puedes ejecutar el siguiente comando para volver a esa versión específica del release:

helm rollback my-release <revision-number>

Por ejemplo, si deseas volver a la revisión 2 del release my-release, el comando sería:

helm rollback my-release 2

Esto revertirá el release my-release a la revisión número 2. Después del rollback, la aplicación volverá al estado que tenía en esa versión específica.

3. Verificar el rollback

Después de hacer el rollback, es importante verificar que el release se haya revertido correctamente. Puedes usar el siguiente comando para comprobar el estado del release:

helm status my-release

Este comando te mostrará el estado actual del release my-release, junto con la versión actual de los recursos desplegados.

Opciones adicionales de rollback

  • Especificar tiempo de espera (timeout): Puedes usar la opción --timeout para especificar cuánto tiempo esperar a que se complete el rollback:

    helm rollback my-release 2 --timeout 60s

    En este ejemplo, Helm esperará hasta 60 segundos para que el rollback finalice correctamente.

  • Forzar rollback: En algunos casos, puedes necesitar forzar el rollback si hay problemas con el estado actual del release. Puedes usar la opción --force para esto:

    helm rollback my-release 2 --force

Ejemplo completo de rollback:

Supongamos que has actualizado tu aplicación varias veces y descubres que la última versión tiene un problema. Para volver a una versión anterior, seguirías estos pasos:

  1. Ver el historial de versiones:

    helm history my-release

    Salida:

    REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Thu Oct 07 10:31:42 2023 deployed my-chart-0.1.0 1.0 Install complete 2 Thu Oct 08 11:00:15 2023 deployed my-chart-0.1.1 1.1 Upgrade complete 3 Thu Oct 09 09:42:01 2023 deployed my-chart-0.1.2 1.2 Upgrade complete
  2. Si quieres volver a la revisión 2, ejecutas el siguiente comando:

    helm rollback my-release 2
  3. Finalmente, verifica el estado del release tras el rollback:

    helm status my-release

Instalación de Helm en tu máquina local:

  1. Linux:

    curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
  2. macOS (usando Homebrew):

    brew install helm
  3. Windows (usando Chocolatey):

    choco install kubernetes-helm

Comentarios