Introducción
Helm es un gestor de paquetes para Kubernetes que permite a desarrolladores y operadores configurar e implementar aplicaciones en clústeres de Kubernetes de manera más sencilla.
Los paquetes de Helm se llaman gráficos, y contienen plantillas de definiciones de recursos que implementan y configuran aplicaciones específicas con un esfuerzo mínimo por parte del usuario. Con la plantilla, puedes gestionar el gráfico, sus ajustes y comportamiento pasando definiciones de variables sin modificar el gráfico real. Helm gestiona automáticamente las definiciones de recursos personalizadas, así como las modificaciones a las definiciones ya implementadas. Un gráfico implementado, con posibles personalizaciones, se llama lanzamiento.
En este tutorial, configurarás Helm 3 y aprenderás cómo instalar, actualizar, revertir y gestionar gráficos y lanzamientos. También aprenderás a crear y empaquetar tus propios gráficos, así como a configurar repositorios de gráficos, que albergan gráficos que puedes instalar de inmediato.
Requisitos previos
-
Un clúster de Kubernetes con control de acceso basado en roles (RBAC) habilitado. Para obtener más información sobre lanzamientos, puedes consultar la página de lanzamientos de Helm.
-
La herramienta de línea de comandos
kubectl
instalada en tu máquina local, configurada para conectarse a tu clúster. Puedes obtener más información sobre cómo instalarkubectl
en la documentación oficial.Puedes probar tu conectividad con el siguiente comando:
Si no recibes errores, estás conectado al clúster. Si accedes a múltiples clústeres con
kubectl
, asegúrate de verificar que hayas seleccionado el contexto de clúster correcto ejecutando:La salida listará las configuraciones disponibles:
SalidaACTUAL NOMBRE CLÚSTER INFORMACIÓN_DE_AUTENTICACIÓN ESPACIO_DE_NOMBRES * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-adminAquí, el asterisco (
*
) indica que estamos conectados al clústerdo-fra1-helm3-example
. Para cambiar de clúster, ejecuta:
Cuando estés conectado al clúster correcto, continúa con el Paso 1 para comenzar a instalar Helm.
Paso 1 — Instalación de Helm 3
En esta sección, instalarás Helm 3 usando el script de shell proporcionado oficialmente.
Empieza navegando a /tmp
, donde almacenarás el script de instalación ejecutando:
Descarga el script con el siguiente comando:
Puedes examinar get_helm.sh
en tu editor de texto para asegurarte de que sea seguro.
Hazlo ejecutable estableciendo sus permisos como sigue:
Finalmente, ejecútalo para instalar Helm 3:
Recibirás una salida similar a la siguiente:
OutputDownloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
Tienes Helm 3 instalado en tu máquina. Ahora aprenderás sobre los repositorios de gráficos y cómo usarlos.
Paso 2 — Configurar Repositorios de Gráficos
Los gráficos de Helm se almacenan en repositorios de gráficos que cualquiera puede alojar. Por defecto, Helm 3 no viene preconfigurado con ningún repositorio. Versiones anteriores de Helm incluían un repositorio de gráficos curado central; sin embargo, el diseño de Helm 3 evolucionó deliberadamente hacia los desarrolladores de gráficos gestionando su propio repositorio, lo que permite más libertad y lanzamientos más rápidos. Esto significa que para cada gráfico que desees utilizar, deberás asegurarte de añadir el repositorio de alojamiento a tu instalación de Helm.
Para ayudarte a encontrar el repositorio adecuado, puedes utilizar ArtifactHub.io, un sitio web de código abierto gestionado por la CNCF que cataloga gráficos de Helm y sus repositorios. También realiza un seguimiento de los gráficos populares y útiles que otros proyectos de CNCF utilizan, por lo que difiere del repositorio stable
que utilizaban versiones anteriores de Helm. Para proyectos comunes, como los ingress de Nginx o las herramientas de monitorización, es una gran fuente.
Puedes buscar un gráfico que te gustaría instalar a través de la página de inicio. Buscar nginx
mostrará todos los gráficos indexados relacionados con él.
Instalarás la edición comunitaria gestionada por el equipo de Kubernetes. Busca ingress-nginx
para encontrarlo en tus resultados. Selecciona para acceder a su página.
Cada gráfico debería tener una descripción detallando lo que hace, junto con comandos para agregar su repositorio a tu instalación e instalar el gráfico. Si no lo tiene, aún puedes obtener los comandos necesarios presionando el botón INSTALL a la derecha de la página.
Puedes hacer clic en el botón azul junto a un comando para copiarlo. Hazlo para el primer comando y ejecútalo:
Para agregar un repositorio a Helm, ejecutas helm repo add
. Los parámetros que acepta son el nombre del repositorio y su ubicación.
La salida será:
Output"ingress-nginx" has been added to your repositories
Cuando agregas un nuevo repositorio, necesitas informar a Helm sobre su contenido ejecutando:
Recibirás la siguiente salida, mostrando que la actualización fue exitosa:
OutputHang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ingress-nginx" chart repository
Update Complete. ⎈Happy Helming!⎈
En este paso, has aprendido sobre ArtifactHub y lo que ofrece. También has agregado un nuevo repositorio a tu instalación de Helm. En el próximo paso, instalarás un gráfico de Helm.
Paso 3 — Instalación de un Gráfico de Helm
En la sección anterior, has agregado el repositorio para el gráfico ingress-nginx
. Ahora lo instalarás en tu clúster.
Cada gráfico tiene variables de configuración que puedes establecer para modificar su comportamiento. Estas variables se almacenan en un archivo llamado values.yaml
que es parte del gráfico. A menos que hayas descargado el gráfico en tu máquina, deberás ejecutar el siguiente comando para verlo:
Para mostrar las variables disponibles para ingress-nginx
, reemplaza nombre_del_gráfico
:
La salida será larga mostrando el contenido de values.yaml
para ingress-nginx
.
Para instalar un gráfico, puedes usar helm install
:
A release is a deployed instance of the chart, and here you’re calling it ingress-nginx
.
Este comando instalaría el gráfico en tu clúster con los valores predeterminados de las variables. Si deseas modificar algunas de ellas, puedes pasar los nuevos valores de variables usando --set
:
Puedes repetir --set
tantas veces como necesites variables. Dado que no vamos a personalizarlo ahora, instálalo tal como está ejecutando:
La salida será similar a la siguiente:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 10:12:37 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller'
...
Ten en cuenta que el NOMBRE
corresponde al nombre de la versión que has especificado. Helm también lista información común, como el estado de la versión y el espacio de nombres en el que está desplegado. La sección NOTAS
varía entre gráficos y generalmente contiene orientación de inicio rápido o advierte sobre algunas trampas comunes al usar los recursos del gráfico. Aquí, señala que se está creando el balanceador de carga y que puede llevar algún tiempo completarlo.
Para verificar los gráficos desplegados, usa helm list
:
Encontrarás que ingress-nginx
es el único gráfico desplegado en este momento:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
Puedes encontrar los servicios que tiene en tu clúster ejecutando:
La salida será similar a esto:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s
ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m
Ahora que has desplegado un lanzamiento en tu clúster, modificarás su configuración mientras está desplegado.
Paso 4 — Actualización de un Lanzamiento
Una vez que un lanzamiento está desplegado, no tienes que derribarlo y volver a desplegarlo completamente cuando necesites cambiar su configuración. Puedes utilizar el comando helm upgrade
para actualizar el lanzamiento con una nueva versión del gráfico o para establecer nuevas configuraciones.
El gráfico ingress-nginx
expone la variable controller.replicaCount
que controla el número de pods de controlador desplegados. Por defecto, está establecido en uno, lo cual puedes verificar listando los pods disponibles:
Descubrirás que solo hay uno:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m
Si deseas desplegar más para redundancia (por ejemplo, tres), puedes actualizar
el lanzamiento y establecer la variable en 3
ejecutando:
También pasas --reuse-values
, lo cual indica a Helm que base tus cambios en el lanzamiento desplegado, preservando la configuración anterior.
En la salida, Helm incrementará la revisión para indicar que el lanzamiento ha sido actualizado:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 12:07:54 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
...
Puedes listar los pods disponibles ejecutando:
Encontrarás tres pods listados, en lugar de uno:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m
ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s
A continuación, desharás los cambios y eliminarás por completo las versiones.
Paso 5 — Deshacer y Eliminar una Versión
Cuando actualizas
una versión, se incrementa su número de revisión. Internamente, Helm almacena todas las revisiones de una versión, lo que te permite volver a una revisión anterior si es necesario.
Para revertir el número de pods a solo uno, podrías ejecutar helm upgrade
nuevamente y configurar manualmente el número porque es un cambio pequeño. Sin embargo, al trabajar con gráficos más grandes con muchas variables, revertir manualmente no es factible y debería automatizarse.
Para deshacer una versión, usa helm rollback
:
Puedes usarlo para revertir los cambios que hiciste en ingress-nginx
volviendo a la revisión 1
:
Recibirás la siguiente salida, indicando que la acción fue exitosa:
OutputRollback was a success! Happy Helming!
Puedes verificar la revisión actual enumerando las versiones:
Verás que la revisión ahora es 3
, y no 1
:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
Helm considera cada cambio, incluidos los retrocesos, como una nueva revisión de una versión. Puedes comprobar que la revisión 3
es igual a la primera al verificar el número de pods implementados ejecutando:
Verás que solo hay uno:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m
Para eliminar una versión y todas sus revisiones, puedes usar helm delete
:
Dado que ya no lo necesitarás, elimina ingress-nginx
ejecutando el siguiente comando:
La salida será:
Outputrelease "ingress-nginx" uninstalled
Puedes listar los lanzamientos para verificar que no hay ninguno:
La tabla de salida no tendrá filas:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
Ahora que el lanzamiento está eliminado, puedes reutilizar su nombre para futuros despliegues.
Paso 6 — (Opcional) Creación de Gráficos Personalizados
En este paso opcional, aprenderás cómo crear un gráfico personalizado, dónde colocar tus definiciones de recursos y cómo empaquetarlo para su posterior distribución.
Crearás un nuevo gráfico llamado example-chart
. Ejecuta el siguiente comando para crearlo:
Esto creará un nuevo directorio llamado example-chart
con los siguientes archivos y estructura:
charts/
templates/
├─ tests/
│ ├─ test-connection.yaml
├─ deployment.yaml
├─ hpa.yaml
├─ ingress.yaml
├─ NOTES.txt
├─ service.yaml
├─ serviceaccount.yaml
├─ _helpers.tpl
Chart.yaml
values.yaml
Las definiciones de recursos que tu gráfico instalará en los clústeres de destino se encuentran en el directorio templates
. Los que Helm creó como punto de partida por defecto despliegan un controlador de ingreso Nginx. Aunque su extensión de archivo es YAML, utilizan la sintaxis de templating de Go para mantenerse personalizables mediante variables expuestas que puedes pasar. Puedes verificar mostrando el contenido de service.yaml
ejecutando:
Descubrirás que tiene directivas de templating para generar valores rodeados por llaves dobles:
Las variables referenciadas se exponen al usuario y se definen en values.yaml
. El texto NOTES
que Helm muestra después del despliegue se almacena en NOTES.txt
, y también está templado. Los metadatos del gráfico, como el nombre, la versión y la versión del software que se está desplegando, se especifican en Chart.yaml
:
Para verificar qué desplegaría Helm, puedes pasar --dry-run
y --debug
a helm install
apuntando al directorio del gráfico:
La salida será larga y contendrá todas las definiciones de recursos finales que se aplicarían a tu clúster. Mientras trabajas en tu gráfico, puedes usar helm upgrade
para enviar nuevas versiones a Kubernetes.
Cuando sea momento de compartir tu gráfico terminado, puedes empaquetarlo para distribuirlo ejecutando:
La salida será:
OutputSuccessfully packaged chart and saved it to: .../example-chart-0.1.0.tgz
El gráfico empaquetado se puede instalar igual que los que provienen de repositorios añadidos:
En este paso has creado un gráfico personalizado y lo has desplegado. También lo has empaquetado y has aprendido sobre su estructura.
Conclusión
Ahora sabes cómo usar Helm para instalar y actualizar software desplegado en tu clúster de Kubernetes. Has añadido repositorios de gráficos y has aprendido por qué son importantes y cómo ArtifactHub puede ayudarte a encontrarlos. También has creado un nuevo gráfico personalizado y has aprendido sobre las revisiones de lanzamiento y cómo retroceder si es necesario.
Para obtener más información sobre cómo crear gráficos personalizados, visita la guía oficial.