Acceso a Archivos en las Plantillas
En la sección anterior vimos varias formas de crear y acceder a plantillas con nombre. Esto facilita importar una plantilla desde dentro de otra plantilla. Pero a veces es deseable importar un archivo que no es una plantilla e inyectar su contenido sin enviarlo a través del renderizador de plantillas.
Helm proporciona acceso a archivos a través del objeto .Files. Antes de
continuar con los ejemplos de plantillas, hay algunas cosas que tener en cuenta
sobre cómo funciona esto:
- Puede agregar archivos adicionales a su chart de Helm. Estos archivos se empaquetarán junto con el chart. Sin embargo, tenga cuidado: los charts deben ser menores de 1M debido a las limitaciones de almacenamiento de los objetos de Kubernetes.
- No se puede acceder a algunos archivos a través del objeto
.Files, generalmente por razones de seguridad.- No se puede acceder a los archivos en
templates/. - No se puede acceder a los archivos excluidos usando
.helmignore. - No se puede acceder a archivos fuera de un subchart de una aplicación Helm, incluyendo los del padre.
- No se puede acceder a los archivos en
- Los charts no preservan la información del modo UNIX, por lo que los permisos
a nivel de archivo no tendrán impacto en la disponibilidad de un archivo
cuando se trata del objeto
.Files.
- Ejemplo básico
- Helpers de ruta
- Patrones glob
- Funciones de utilidad para ConfigMap y Secrets
- Codificación
- Líneas
Ejemplo básico
Con estas consideraciones en mente, escribamos una plantilla que lea tres
archivos en nuestro ConfigMap. Para empezar, agregaremos tres archivos al chart,
colocando los tres directamente dentro del directorio mychart/.
config1.toml:
message = "Hello from config 1"
config2.toml:
message = "This is config 2"
config3.toml:
message = "Goodbye from config 3"
Cada uno de estos es un archivo TOML simple (piense en los archivos INI de
Windows antiguos). Conocemos los nombres de estos archivos, así que podemos usar
una función range para recorrerlos e inyectar su contenido en nuestro
ConfigMap.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $files := .Files }}
{{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
{{ . }}: |-
{{ $files.Get . }}
{{- end }}
Este ConfigMap utiliza varias de las técnicas discutidas en secciones
anteriores. Por ejemplo, creamos una variable $files para mantener una
referencia al objeto .Files. También usamos la función tuple para crear una
lista de archivos que recorremos. Luego imprimimos cada nombre de archivo
({{ . }}: |-) seguido del contenido del archivo {{ $files.Get . }}.
Ejecutar esta plantilla producirá un único ConfigMap con el contenido de los tres archivos:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: quieting-giraf-configmap
data:
config1.toml: |-
message = "Hello from config 1"
config2.toml: |-
message = "This is config 2"
config3.toml: |-
message = "Goodbye from config 3"
Helpers de ruta
Al trabajar con archivos, puede ser muy útil realizar algunas operaciones
estándar sobre las rutas de archivos. Para ayudar con esto, Helm importa muchas
de las funciones del paquete path de Go para su
uso. Todas son accesibles con los mismos nombres que en el paquete de Go, pero
con la primera letra en minúscula. Por ejemplo, Base se convierte en base,
etc.
Las funciones importadas son:
- Base
- Dir
- Ext
- IsAbs
- Clean
Patrones glob
A medida que su chart crece, puede encontrar que tiene una mayor necesidad de
organizar sus archivos, por lo que proporcionamos un método
Files.Glob(pattern string) para ayudar a extraer ciertos archivos con toda la
flexibilidad de los patrones glob.
.Glob devuelve un tipo Files, por lo que puede llamar a cualquiera de los
métodos de Files en el objeto devuelto.
Por ejemplo, imagine la siguiente estructura de directorios:
foo/:
foo.txt foo.yaml
bar/:
bar.go bar.conf baz.yaml
Tiene múltiples opciones con Globs:
{{ $currentScope := .}}
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{- with $currentScope}}
{{ .Files.Get $path }}
{{- end }}
{{ end }}
O
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }}
{{ end }}
Funciones de utilidad para ConfigMap y Secrets
(Disponible en Helm 2.0.2 y posterior)
Es muy común querer colocar el contenido de archivos tanto en ConfigMaps como en
Secrets, para montarlos en sus pods en tiempo de ejecución. Para ayudar con
esto, proporcionamos un par de métodos de utilidad en el tipo Files.
Para una mayor organización, es especialmente útil usar estos métodos en
conjunto con el método Glob.
Dada la estructura de directorios del ejemplo de Glob anterior:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}
Codificación
Puede importar un archivo y hacer que la plantilla lo codifique en base-64 para asegurar una transmisión exitosa:
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-secret
type: Opaque
data:
token: |-
{{ .Files.Get "config1.toml" | b64enc }}
El ejemplo anterior tomará el mismo archivo config1.toml que usamos antes y lo
codificará:
# Source: mychart/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: lucky-turkey-secret
type: Opaque
data:
token: |-
bWVzc2FnZSA9ICJIZWxsbyBmcm9tIGNvbmZpZyAxIgo=
Líneas
A veces es deseable acceder a cada línea de un archivo en su plantilla.
Proporcionamos un método conveniente Lines para esto.
Puede recorrer Lines usando una función range:
data:
some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
{{ . }}{{ end }}
No hay forma de pasar archivos externos al chart durante helm install. Por lo
tanto, si está pidiendo a los usuarios que proporcionen datos, estos deben
cargarse usando helm install -f o helm install --set.
Esta discusión concluye nuestra inmersión en las herramientas y técnicas para
escribir plantillas de Helm. En la siguiente sección veremos cómo puede usar un
archivo especial, templates/NOTES.txt, para enviar instrucciones
post-instalación a los usuarios de su chart.