Cómo administrar aplicaciones complejas en Kubernetes usando Helm

Introducción

Helm es una herramienta popular en el ecosistema de Kubernetes. Proporciona una forma de crear paquetes (conocidos como gráficos) de objetos de Kubernetes relacionados que se pueden implementar de manera coherente en un clúster.

También nos permite parametrizar estos paquetes, para que puedan reutilizarse en diferentes contextos. Los paquetes pueden desplegarse en diferentes entornos en los que los servicios que brindan podrían ser necesarios.

Al igual que Kubernetes, el desarrollo de Helm está supervisado por la Cloud Native Computing Foundation. Además de Helm (el administrador de paquetes), la comunidad mantiene un repositorio de gráficos estándar para una amplia gama de software de código abierto. Este software se puede instalar y ejecutar en tu clúster.

Desde el servidor Jenkins CI hasta MySQL o Prometheus, es simple instalar y ejecutar implementaciones complejas que involucran muchos recursos subyacentes de Kubernetes con Helm.

Instalar Helm

Si ya has configurado tu propio clúster de Kubernetes y has configurado correctamente kubectl en tu máquina, entonces es sencillo instalar Helm.

En macOS

Para macOS, la forma más sencilla de instalar el cliente Helm es con Homebrew:

En Linux y Windows

Cada versión de Helm incluye binarios precompilados para Linux, Windows y macOS. Debes vistar https://github.com/kubernetes/helm/releases para descargar la versión que necesitas para tu plataforma.

Para instalar el cliente, simplemente desempaqueta y copia el binario en tu ruta.

Por ejemplo, en una máquina Linux puedes hacer lo siguiente:

Instalando Tiller

Una vez que tengas la herramienta Helm CLI instalada en tu máquina, puede sinstalar el componente del servidor de Helm, Tiller.

Helm usa la misma configuración que kubectl, así que comienza por verificar en qué contexto instalarás Tiller:

Aquí, instalaremos Tiller en el clúster al que hace referencia el contexto de Minikube. En este caso, esto es exactamente lo que queremos. Si kubectl actualmente no está apuntando a otro clúster, puedes cambiar rápidamente al contexto que deseas usar de esta manera:

Si aún no estás seguro de estar usando el contexto correcto, echa un vistazo rápido a la configuración completa y verifica que el campo del servidor del clúster sea correcto:

El indicador minify elimina cualquier configuración a la que no hace referencia el contexto actual. Una vez que estés satisfecho de que el clúster al que kubectl se está conectando es el correcto, podemos configurar el entorno local de Helm e instalar Tiller en tu clúster:

Podemos usar kubectl para verificar que Tiller realmente se esté ejecutando en nuestro clúster:

Una vez que hayamos verificado que Tiller se está ejecutando correctamente en el clúster, usaremos el comando version. Esto validará que podamos conectarnos correctamente a la API del servidor Tiller y devolver el número de versión de la CLI y del servidor Tiller:

Instalar un gráfico (chart)

Comencemos instalando una aplicación utilizando uno de los gráficos proporcionados por la comunidad.

Puedes descubrir aplicaciones para las que la comunidad ha producido gráficos Helm en https://hub.kubeapps.com/. Es una manera de simplificar la implementación de una amplia gama de aplicaciones en tu clúster de Kubernetes. Además, es un excelente recurso para aprender algunas de las mejores prácticas que utiliza la comunidad cuando empaqueta aplicaciones para Helm.

Los gráficos de Helm se pueden almacenar en un repositorio, por lo que es sencillo instalarlos por su nombre. De forma predeterminada, Helm ya está configurado para usar un repositorio remoto llamado Stable.

Esto nos facilita probar algunas aplicaciones de uso común tan pronto como se instala Helm.

Antes de instalar un gráfico, necesitarás saber tres cosas:

  • El nombre del gráfico que deseas instalar.
  • El nombre que le darás a esta versión (si omites esto, Helm creará un nombre aleatorio para esta versión)
  • El namespace en el clúster en el que deseas instalar el gráfico (si omites esto, Helm usará el namespace predeterminado)

Helm llama a cada instalación de un gráfico de manera distinta de acuerdo al lanzamiento. Cada versión tiene un nombre único que se usa si luego deseas actualizar, mejorar o incluso eliminar una versión de tu clúster.

Poder instalar varias instancias de un gráfico en un solo clúster hace que Helm sea un poco diferente de lo que pensamos acerca de los administradores de paquetes tradicionales.  Estos están vinculados a una sola máquina y, por lo general, solo permiten una instalación de un paquete en particular a la vez.

Terminología básica

Pero una vez que te hayas acostumbrado a la terminología, es muy simple de entender:

  • Un gráfico (chart) es el paquete que contiene toda la información sobre cómo instalar una aplicación o herramienta en particular en el clúster. Puedes considerarlo como una plantilla que se puede reutilizar para crear muchas instancias o versiones diferentes de la aplicación o herramienta empaquetada.
  • Una versión (release) es una instalación con nombre de un gráfico en un clúster particular. Al referirse a una versión por su nombre, Helm puede realizar actualizaciones a una versión en particular, actualizar la versión de la herramienta instalada, etc.
  • Un repositorio (repository) es un servidor HTTP que almacena gráficos junto con un archivo de índice. Cuando se configura con la ubicación de un repositorio, Helm puede instalar un gráfico desde ese repositorio descargándolo y luego haciendo una nueva versión.

Antes de poder instalar un gráfico en tu clúster, debes asegurarte de que Helm conozca el repositorio que deseas usar. Puedes enumerar los repositorios que están actualmente en uso ejecutando el comando helm repo list:

De forma predeterminada, Helm está configurado con un repositorio denominado stable apuntando al repositorio de gráficos de la comunidad. Asimismo, al repositorio local que apunta a una dirección local para probar tu propio repositorio local. (Necesitas estar ejecutando helm serve para esto).

Agregar un repositorio Helm a esta lista es simple con el comando helm repo add. Puedes agregar este repositorio Helm que contiene algunas aplicaciones de ejemplo, hazlo con el siguiente comando:

Información de gráficos

Para obtener la última información del gráfico de los repositorios configurados, puedes ejecutar el siguiente comando:

Empecemos con una de las aplicaciones más sencillas disponibles en el repositorio de Helm, kubeslate. Esto proporciona información muy básica sobre tu clúster, como la versión de Kubernetes que estás ejecutando y la cantidad de pods e implementaciones, etc.

Vamos a comenzar con esta aplicación, ya que es muy simple y no requiere ninguna configuración especial para ejecutarse en Minikube, o incluso en cualquier otro clúster.

Instalar un gráfico desde un repositorio en tu clúster no podría ser más simple:

Deberías ver mucha salida del comando helm.

En primer lugar, verás algunos metadatos sobre el lanzamiento, como su nombre, estado y espacio de nombres:

A continuación, deberías ver información sobre los recursos que Helm le ha indicado a Kubernetes que cree en el clúster. Como puedes ver, se ha creado un único servicio y una única implementación:

Finalmente, hay una sección con algunas notas proporcionadas por el autor del gráfico para brindarnos información sobre cómo comenzar a usar la aplicación:

Notas:

Para acceder kubeslate.

1. Primero inicia el proxy kubectl:

2. Ahora abre la siguiente URL en tu navegador:

Si ves ServiceUnavailable/no endpoints available for service, intenta volver a cargar la página, ya que la creación de pod puede tardar unos minutos.

Intenta seguir estas instrucciones tú mismo y abre Kubeslate en tu navegador:

Configurar un gráfico

Cuando usas Helm para hacer una versión de un gráfico, hay ciertos atributos que podrías necesitar cambiar o la configuración que podrías necesitar proporcionar. Afortunadamente, Helm proporciona una forma estándar para que los usuarios de un gráfico anulen algunos o todos los valores de configuración.

En esta sección, veremos cómo, como usuario de un gráfico, puede proporcionar la configuración a Helm. Más adelante, veremos cómo puedes crear tus propios gráficos y utilizar la configuración que se necesita para permitir que tu gráfico se personalice.

Cuando invocamos helm install, hay dos formas en que podemos proporcionar valores de configuración: pasándolos como argumentos de línea de comandos o proporcionando un archivo de configuración.

Estos valores de configuración se combinan con los valores predeterminados proporcionados por un gráfico. Esto permite que un autor de gráficos proporcione una configuración predeterminada para permitir a los usuarios comenzar a trabajar rápidamente. Pero, aun así, permitir a los usuarios modificar configuraciones importantes o habilitar funciones avanzadas.

Proporcionar un valor único a Helm en la línea de comandos se logra mediante el uso de indicadores. El gráfico kubeslate nos permite especificar etiquetas adicionales para los pod (s) que inicias utilizando la variable podLabels. Hagamos una nueva versión del gráfico kubeslate y luego usemos la variable podLabels para agregar una etiqueta adicional hello con el valor world:

Una vez que hayas ejecutado este comando, deberías poder demostrar que la variable adicional que pasaste a Helm resultó en que los pods iniciados por Helm tengan la etiqueta correcta.

El uso del comando kubectl get pods con un selector de etiquetas para la etiqueta que aplicamos usando Helm debería devolver los pods que se acaban de iniciar con Helm:

Actualizar configuración

Aquí pasamos una configuración a Helm cuando creamos una nueva versión. Asimismo, es posible actualizar la configuración en una versión preexistente utilizando el comando upgrade.

Cuando usamos Helm para actualizar una configuración, el proceso es muy similar a cuando actualizamos los recursos de implementación. Muchas de esas consideraciones aún se aplican si queremos evitar el tiempo de inactividad en nuestros servicios.

Ejemplo: al iniciar múltiples réplicas de un servicio, podemos evitar el tiempo de inactividad, porque se implementa una nueva versión de una configuración de implementación.

Actualicemos también nuestra versión original de kubeslate para incluir la misma etiqueta hello: world pod que aplicamos a la segunda versión. Como puedes ver, la estructura del comando upgrade es bastante similar al comando install. Pero en lugar de especificar el nombre de la versión con el indicador – -name, lo pasamos como primer argumento.

Esto se debe a que cuando instalamos un gráfico en el clúster, el nombre de la versión es opcional. Si lo omitimos, Helm creará un nombre aleatorio para la versión. Sin embargo, al realizar una actualización, debemos apuntar a una versión preexistente para actualizar, y por lo tanto este argumento es obligatorio:

Si ahora ejecutas helm ls, deberías ver que la versión llamada my-slate se ha actualizado a Revision 2. Puedes probar que la implementación administrada por esta versión se ha actualizado para incluir esta etiqueta pod repitiendo el comando kubectl get:

Resultados

Ahora podemos ver que cuatro pods, dos de cada uno de nuestras versiones, ahora coinciden con el selector de etiquetas al que pasamos kubectl get.

Pasar variables en la línea de comando con el indicador set es conveniente cuando solo queremos proporcionar valores para algunas variables. Pero cuando queremos pasar configuraciones más complejas, puede ser más simple proporcionar los valores como un archivo. Preparemos un archivo de configuración para aplicar varias etiquetas a nuestros pods de kubeslate:

Luego podemos usar el comando helm para aplicar este archivo de configuración a nuestra versión:

Empaquetar gráficos Helm

Mientras desarrollamos nuestro gráfico, es fácil usar Helm CLI para implementar nuestro gráfico directamente desde el sistema de archivos local. Sin embargo, Helm también te permite crear tu propio repositorio para compartir tus gráficos.

Un repositorio de Helm es una colección de gráficos de Helm empaquetados, más un índice almacenado en una estructura de directorio particular. Todo esto en un servidor web HTTP estándar.

Una vez que estés satisfecho con tu gráfico, querrás empaquetarlo para que esté listo para distribuirlo en un repositorio de Helm. Esto es simple de hacer con el comando helm package.

Cuando comienzas a distribuir tus gráficos con un repositorio, las versiones se vuelven importantes. El número de versión de un gráfico en un repositorio de Helm debe seguir las pautas de SemVer 2.

Para crear un gráfico empaquetado, inicia por verificar que hayas configurado un número de versión apropiado en Chart.yaml. Si es la primera vez que empaquetas tu gráfico, el valor predeterminado será correcto:

Puedes probar un gráfico empaquetado sin cargarlo en un repositorio utilizando el comando helm serve. Este comando servirá a todos los gráficos empaquetados que se encuentran en el directorio actual y generará un índice sobre la marcha:

Ahora puedes intentar instalar tu gráfico utilizando el repositorio local:

Probar la construcción de un índice

Un repositorio de Helm es solo una colección de gráficos empaquetados almacenados en un directorio.

Para descubrir y buscar los gráficos y las versiones disponibles en un repositorio particular, el cliente Helm descarga un especial índice especial llamado index.yaml. Este incluye metadatos sobre cada gráfico empaquetado y la ubicación desde la que se puede descargar.

Para generar este archivo de índice, necesitamos copiar todos los gráficos empaquetados que queremos en nuestro índice en el mismo directorio:

Luego, para generar el archivo index.yaml, usamos el comando helm repo index. Deberás pasar la URL root desde donde se servirán los gráficos empaquetados. Esta podría ser la dirección de un servidor web, o en AWS, puedes usar un bucket S3:

El índice del gráfico es un formato bastante simple. Este enumera el nombre de cada gráfico disponible y luego proporciona una lista de cada versión disponible para cada gráfico con nombre.

El índice también incluye una suma de verificación para validar la descarga de gráficos desde el repositorio:

El archivo index.yaml generado para nuestro nuevo repositorio de gráficos.

Creado el archivo index.yaml, ya es simplemente una cuestión de copiar tus gráficos empaquetados y el archivo de índice al host que has elegido utilizar. Si estás utilizando S3, esto podría verse así:

Para que Helm pueda usar tu repositorio, tu servidor web (o S3) necesita estar configurado correctamente.
El servidor web debe mostrar el archivo index.yaml con el tipo de encabezado de contenido correcto ( text/yamlo text/x-yaml).
Los gráficos deben estar disponibles en las URL que figuran en el índice.

Usando tu repositorio

Una vez que hayas configurado el repositorio, puedes configurar Helm para usarlo:

Cuando agregas un repositorio, Helm valida que efectivamente puede conectarse a la URL dada y descargar el archivo index.

Puedes verificar esto buscando tu gráfico usando helm search:

Conclusión

En este artículo aprendiste cómo instalar Helm, configurar y empaquetar los gráficos de Helm. Lo puedes usar para una amplia gama de escenarios en los que deseas implementar recursos en un clúster de Kubernetes.

Puede ser útil para cosas sencillas. Por ejemplo, una manera simple para que otros instalen una aplicación que has escrito en tus propios clústeres.  También escenarios complejos, como ser la base de una Plataforma como Servicio dentro de una organización más grande.