Las plantillas de Helm en archivos, como el contenido de ConfigMaps o el contenido de Secrets, son uno de los requisitos más comunes cuando estás en el proceso de crear un nuevo gráfico de helm. Como ya sabes, el gráfico de Helm es cómo usamos Kubernetes para empaquetar nuestros recursos de aplicación y YAML en un solo componente que podemos gestionar de una vez para facilitar el proceso de mantenimiento y operación.
Visión General de las Plantillas de Helm
Por defecto, el proceso de plantillas funciona con archivos YAML, permitiéndonos usar algunas variables y algunas funciones lógicas para personalizar y templar nuestros recursos YAML de Kubernetes según nuestras necesidades.
Entonces, en resumen, solo podemos tener archivos yaml dentro de la carpeta de plantillas de un YAML. Pero a veces nos gustaría hacer el mismo proceso en ConfigMaps o Secrets o ser más concretos con el contenido de esos ConfigMaps, por ejemplo, archivos de propiedades y así sucesivamente.

Como puedes ver, es bastante normal tener diferentes archivos como archivos de configuración json, archivos de propiedades, scripts de shell como parte de tu gráfico de helm, y la mayoría de las veces te gustaría dar un enfoque dinámico a su contenido, y es por eso que usar Plantillas de Helm en Archivos es tan importante para ser el enfoque principal de este artículo
Funciones de Ayuda de Helm para Gestionar Archivos
Por defecto, Helm nos proporciona un conjunto de funciones para gestionar archivos como parte del gráfico de helm para simplificar el proceso de incluirlos como parte del gráfico, como el contenido de ConfigMap o Secret. Algunas de estas funciones son las siguientes:
- .Files.Glob: Esta función permite encontrar cualquier patrón de archivos internos que coincida con el patrón, como el siguiente ejemplo:
{ range $path, $ := .Files.Glob ".yaml" } - .Files.Get: Esta es la opción más simple para reunir el contenido de un archivo específico que conoces la ruta completa dentro de tu gráfico de helm, como el siguiente ejemplo:
{{ .Files.Get "config1.toml" | b64enc }}
Incluso puedes combinar ambas funciones para usarlas juntas como en el siguiente ejemplo:
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }}
{{ end }}
Luego puedes combinar eso una vez que tengas el archivo que deseas usar con algunas funciones de ayuda para introducir fácilmente en un ConfigMap y un Secret como se explica a continuación:
- .AsConfig : Usa el contenido del archivo para ser introducido como ConfigMap manejando el patrón:
nombre-del-archivo: contenido-del-archivo - .AsSecrets: Similar al anterior, pero haciendo la codificación base64 para los datos.
Aquí puedes ver un ejemplo real de usar este enfoque en una situación real de gráfico de helm:
apiVersion: v1
kind: Secret
metadata:
name: zones-property
namespace: {{ $.Release.Namespace }}
data:
{{ ( $.Files.Glob "tml_zones_properties.json").AsSecrets | indent 2 }}
Puedes encontrar más información sobre eso aquí. Pero esto solo nos permite tomar el archivo tal cual e incluirlo en un ConfigMap. No nos permite hacer ninguna lógica o sustitución al contenido como parte de ese proceso. Entonces, si queremos modificar esto, este no es un ejemplo válido.
¿Cómo Usar Plantillas de Helm en Archivos como ConfigMaps o Secrets?
En caso de que podamos hacer algunas modificaciones al contenido, necesitamos usar la siguiente fórmula:
apiVersion: v1
kind: Secret
metadata:
name: papi-property
namespace: {{ $.Release.Namespace }}
data:
{{- range $path, $bytes := .Files.Glob "tml_papi_properties.json" }}
{{ base $path | indent 2 }}: {{ tpl ($.Files.Get $path) $ | b64enc }}
{{ end }}
Entonces, lo que estamos haciendo aquí es primero iterar por los archivos que coinciden con el patrón usando la función .Files.Glob que explicamos antes, iterando en caso de que tengamos más de uno. Luego creamos manualmente la estructura siguiendo el patrón: nombre-del-archivo: contenido-del-archivo.
Para hacer eso, usamos la función base para proporcionar solo el nombre del archivo desde una ruta completa (y agregar la indentación adecuada) y luego usamos .Files.Get para obtener el contenido del archivo y hacer la codificación base64 usando la función b64enc porque, en este caso, estamos manejando un secreto.
El truco aquí es agregar la función tpl que permite que el contenido de este archivo pase por el proceso de plantillas; así es como todas las modificaciones que necesitamos hacer y las variables referenciadas desde el objeto .Values serán reemplazadas adecuadamente, dándote todo el poder y flexibilidad del Gráfico de Helm en archivos de texto como propiedades, archivos JSON y mucho más.
¡Espero que esto sea tan útil para ti como lo ha sido para mí al crear nuevos gráficos de helm! Y mira aquí para otros trucos usando bucles o dependencias.




