Empaquetar su aplicación con Helm
Objetivos del capítulo y requisitos previos
Hasta ahora, ha visto cómo gestionar un clúster o desplegar una aplicación en el clúster utilizando archivos estáticos.
La noción de espacio de nombres permite separar varias versiones de una misma aplicación. Sin embargo, es necesario diferenciar entre algunos objetos, como la dirección de publicación (Ingress).
Este capítulo le guiará a través de la gestión de estas diferencias con ayuda de Helm. Este software hace que el despliegue de una aplicación sea lo más transparente posible. También se llevará a cabo una presentación del lenguaje de plantilla Go, que utiliza Helm para operar.
Helm
1. Origen de la necesidad
Incluso en el caso de una aplicación sencilla como MailHog, el despliegue requiere una serie de declaraciones:
-
Un despliegue (deployment).
-
Una declaración de servicio (service).
-
Una solicitud de volumen persistente (persistent volumen claim).
-
Una regla de publicación (Ingress).
Desafortunadamente, si no desea publicar la aplicación al exterior o añadir un volumen persistente, no hay otra solución que editar los archivos a mano antes de enviarlos al clúster o enviar solo una parte de los archivos a la API de Kubernetes.
Para evitar estas operaciones manuales, es posible utilizar preprocesadores que recibirán estos archivos como entrada y les aplicarán modificaciones antes de enviarlos a la API de Kubernetes.
En el caso de Helm, este trabajo de preparación de archivos se realiza mediante el motor de templates del lenguaje Go.
2. Crear un chart
La creación de un paquete se realiza mediante el comando Helm seguido de estas opciones:
-
La palabra clave create.
-
El nombre del chart que se va a crear.
Para crear un chart para la aplicación MailHog, ejecute el siguiente comando:
$ helm create mailhog
3. Contenido de un paquete
a. Estructura de un paquete
De forma predeterminada, este comando hace lo siguiente:
-
Crea un directorio mailhog.
-
Almacena un conjunto de archivos predeterminados.
Este directorio contiene los siguientes elementos:
-
Archivo .helmignore: lista de archivos que hay que ignorar.
-
Archivo Chart.yaml: descripción del chart.
-
Archivo values.yaml: contiene los valores por defecto del chart.
-
Directorio charts/: contiene las dependencias que necesita este chart.
-
Directorio templates/: contiene los archivos YAML a los que se les aplicará una plantilla.
-
Directorio templates/tests/: contiene los archivos YAML utilizados para realizar pruebas al final del despliegue.
b. Variables .Values, .Chart y .Release
El contenido de las variables predeterminadas del archivo values.yaml está disponible mediante la estructura .Values. Para acceder a la variable replicaCount de este archivo, puede llamar a la referencia .Values.replicaCount.
La variable .Chart contendrá la versión desplegada o la versión del chart.
Finalmente, la variable .Release contendrá información del espacio de nombres.
4. Adaptación a la aplicación MailHog
a. Resumen de los trabajos por realizar...
Template Go
1. Principio de funcionamiento
El mecanismo de template del lenguaje Go parte de una representación textual (un archivo YAML, por ejemplo) en el que ciertas partes se vuelven dinámicas mediante los siguientes mecanismos:
-
Usando variables.
-
O usando estructuras de control para mostrar o no una sección (mediante sentencias if/else) o para repetirlas.
Desde este punto de vista, la sintaxis básica es bastante parecida a la de los motores existentes, como Jinja for Python (principalmente utilizado por Ansible) o el motor de templates de Puppet.
Todas las operaciones realizadas por el motor utilizan la notación de bigotes con una parte de apertura ({{) y una parte de cierre (}}).
2. Sustituir el contenido de una variable
Para mostrar el contenido de la variable version, declarada en el archivo values.yaml, la llamada se realizará de la siguiente manera:
version contiene el valor siguiente: {{ .Values.version }}
En caso de que la variable contenga el valor 1.0, el motor producirá el siguiente resultado:
La variable version contiene el valor siguiente: 1.0
3. Bloques condicionales
El lenguaje admite bloques if/then/else. Es posible mostrar el contenido de un bloque en función de una condición.
A continuación, se muestra un ejemplo de un bloque de condiciones:
{{ if .Values.buenTiempo }}
Salgo sin paraguas.
{{ else }}
Salgo con paraguas.
{{ end }}
Si la condición buenTiempo es verdadera, el motor devolverá el siguiente texto:
Salgo sin paraguas.
Si buenTiempo es falsa, el motor devolverá el siguiente resultado:
Salgo con paraguas.
4. Gestión de las condiciones
a. Los valores verdadero o falso
En la plantilla Go, los siguientes valores tomarán el valor falso:
-
Variable no declarada (p. ej.: .Values.noDeclarada).
-
Variable que contiene una estructura vacía (cadena de caracteres vacía, tabla o tabla hash).
-
Variable que contiene el valor false, 0 o nul (valor nil en Go).
Todos los demás valores se consideran verdaderos.
b. Operadores de comparación
La comparación de variables se realiza mediante llamadas a funciones. No es posible utilizar los comparadores tradicionales de igualdad (==) o diferencia (!=).
A continuación, se muestra una tabla que resume los operadores disponibles.
Operación... |