Cómo instalar software en clústeres Kubernetes con el gestor de paquetes Helm 3

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 instalar kubectl en la documentación oficial.

    Puedes probar tu conectividad con el siguiente comando:

    1. kubectl cluster-info

    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:

    1. kubectl config get-contexts

    La salida listará las configuraciones disponibles:

    Salida
    ACTUAL NOMBRE CLÚSTER INFORMACIÓN_DE_AUTENTICACIÓN ESPACIO_DE_NOMBRES * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin

    Aquí, el asterisco (*) indica que estamos conectados al clúster do-fra1-helm3-example. Para cambiar de clúster, ejecuta:

    1. kubectl config use-context nombre_del_contexto

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:

  1. cd /tmp

Descarga el script con el siguiente comando:

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

Puedes examinar get_helm.sh en tu editor de texto para asegurarte de que sea seguro.

Hazlo ejecutable estableciendo sus permisos como sigue:

  1. chmod u+x get_helm.sh

Finalmente, ejecútalo para instalar Helm 3:

  1. ./get_helm.sh

Recibirás una salida similar a la siguiente:

Output
Downloading 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:

  1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

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:

  1. helm repo update

Recibirás la siguiente salida, mostrando que la actualización fue exitosa:

Output
Hang 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:

  1. helm show values chart_name

Para mostrar las variables disponibles para ingress-nginx, reemplaza nombre_del_gráfico:

  1. helm show values ingress-nginx/ingress-nginx

La salida será larga mostrando el contenido de values.yaml para ingress-nginx.

Para instalar un gráfico, puedes usar helm install:

  1. helm install release_name repository/chart_name

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:

  1. helm install ingress-nginx/ingress-nginx --set variable_name=variable_value

Puedes repetir --set tantas veces como necesites variables. Dado que no vamos a personalizarlo ahora, instálalo tal como está ejecutando:

  1. helm install ingress-nginx ingress-nginx/ingress-nginx

La salida será similar a la siguiente:

Output
NAME: 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:

  1. helm list

Encontrarás que ingress-nginx es el único gráfico desplegado en este momento:

Output
NAME 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:

  1. kubectl get services

La salida será similar a esto:

Output
NAME 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:

  1. kubectl get pods

Descubrirás que solo hay uno:

Output
NAME 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:

  1. helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values

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:

Output
NAME: 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:

  1. kubectl get pods

Encontrarás tres pods listados, en lugar de uno:

Output
NAME 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:

  1. helm rollback release_name release_revision

Puedes usarlo para revertir los cambios que hiciste en ingress-nginx volviendo a la revisión 1:

  1. helm rollback ingress-nginx 1

Recibirás la siguiente salida, indicando que la acción fue exitosa:

Output
Rollback was a success! Happy Helming!

Puedes verificar la revisión actual enumerando las versiones:

  1. helm list

Verás que la revisión ahora es 3, y no 1:

Output
NAME 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:

  1. kubectl get pods

Verás que solo hay uno:

Output
NAME 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:

  1. helm delete release_name

Dado que ya no lo necesitarás, elimina ingress-nginx ejecutando el siguiente comando:

  1. helm delete ingress-nginx

La salida será:

Output
release "ingress-nginx" uninstalled

Puedes listar los lanzamientos para verificar que no hay ninguno:

  1. helm list

La tabla de salida no tendrá filas:

Output
NAME 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:

  1. helm create example-chart

Esto creará un nuevo directorio llamado example-chart con los siguientes archivos y estructura:

example-chart/
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:

  1. cat example-chart/templates/service.yaml

Descubrirás que tiene directivas de templating para generar valores rodeados por llaves dobles:

Output
apiVersion
: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}

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:

example-chart/Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

Para verificar qué desplegaría Helm, puedes pasar --dry-run y --debug a helm install apuntando al directorio del gráfico:

  1. helm install example-chart --dry-run --debug ./example-chart

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:

  1. helm package ./example-chart

La salida será:

Output
Successfully 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:

  1. helm install example-chart example-chart-0.1.0.tgz

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.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager