Subcharts y Valores Globales
Hasta este punto hemos trabajado solo con un chart. Pero los charts pueden tener dependencias, llamadas subcharts, que también tienen sus propios values y plantillas. En esta sección crearemos un subchart y veremos las diferentes formas en que podemos acceder a los values desde las plantillas.
Antes de profundizar en el código, hay algunos detalles importantes que aprender sobre los subcharts de aplicaciones.
- Un subchart se considera "independiente", lo que significa que un subchart nunca puede depender explícitamente de su chart padre.
- Por esa razón, un subchart no puede acceder a los values de su padre.
- Un chart padre puede sobrescribir values para los subcharts.
- Helm tiene un concepto de valores globales que pueden ser accedidos por todos los charts.
Estas limitaciones no necesariamente aplican a los charts de biblioteca, que están diseñados para proporcionar funcionalidad auxiliar estandarizada.
A medida que recorramos los ejemplos en esta sección, muchos de estos conceptos quedarán más claros.
Creación de un Subchart
Para estos ejercicios, comenzaremos con el chart mychart/ que creamos al
inicio de esta guía, y agregaremos un nuevo chart dentro de él.
$ cd mychart/charts
$ helm create mysubchart
Creating mysubchart
$ rm -rf mysubchart/templates/*
Observe que, al igual que antes, eliminamos todas las plantillas base para poder comenzar desde cero. En esta guía, nos enfocamos en cómo funcionan las plantillas, no en gestionar dependencias. Sin embargo, la Guía de Charts tiene más información sobre cómo funcionan los subcharts.
Agregar Values y una Plantilla al Subchart
A continuación, crearemos una plantilla simple y un archivo values para nuestro
chart mysubchart. Ya debería existir un values.yaml en
mychart/charts/mysubchart. Lo configuraremos así:
dessert: cake
Luego, crearemos una nueva plantilla de ConfigMap en
mychart/charts/mysubchart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
Como cada subchart es un chart independiente, podemos probar mysubchart por
sí solo:
$ helm install --generate-name --dry-run --debug mychart/charts/mysubchart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/helm.sh/helm/_scratch/mychart/charts/mysubchart
NAME: newbie-elk
TARGET NAMESPACE: default
CHART: mysubchart 0.1.0
MANIFEST:
---
# Source: mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: newbie-elk-cfgmap2
data:
dessert: cake
Sobrescribir Values desde un Chart Padre
Nuestro chart original, mychart, ahora es el chart padre de mysubchart.
Esta relación se basa completamente en el hecho de que mysubchart está dentro
de mychart/charts.
Como mychart es el padre, podemos especificar configuración en mychart y
hacer que esa configuración se pase a mysubchart. Por ejemplo, podemos
modificar mychart/values.yaml de esta forma:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
Observe las últimas dos líneas. Cualquier directiva dentro de la sección
mysubchart se pasará al chart mysubchart. Entonces, si ejecutamos
helm install --generate-name --dry-run --debug mychart, una de las cosas que
veremos es el ConfigMap de mysubchart:
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: unhinged-bee-cfgmap2
data:
dessert: ice cream
El valor en el nivel superior ahora ha sobrescrito el valor del subchart.
Hay un detalle importante que notar aquí. No cambiamos la plantilla de
mychart/charts/mysubchart/templates/configmap.yaml para que apunte a
.Values.mysubchart.dessert. Desde la perspectiva de esa plantilla, el valor
todavía está ubicado en .Values.dessert. A medida que el motor de plantillas
pasa los values, establece el ámbito. Así que para las plantillas de mysubchart,
solo los values específicamente para mysubchart estarán disponibles en .Values.
Sin embargo, a veces querrá que ciertos valores estén disponibles para todas las plantillas. Esto se logra usando valores globales de chart.
Valores Globales de Chart
Los valores globales son valores a los que se puede acceder desde cualquier chart o subchart con exactamente el mismo nombre. Los globales requieren declaración explícita. No se puede usar un valor no global existente como si fuera global.
El tipo de datos Values tiene una sección reservada llamada Values.global donde
se pueden establecer valores globales. Establezcamos uno en nuestro archivo
mychart/values.yaml.
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
global:
salad: caesar
Debido a cómo funcionan los globales, tanto mychart/templates/configmap.yaml
como mysubchart/templates/configmap.yaml deberían poder acceder a ese valor
como {{ .Values.global.salad }}.
mychart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
salad: {{ .Values.global.salad }}
mysubchart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
salad: {{ .Values.global.salad }}
Ahora, si ejecutamos una instalación en modo dry run, veremos el mismo valor en ambas salidas:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-configmap
data:
salad: caesar
---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-cfgmap2
data:
dessert: ice cream
salad: caesar
Los globales son útiles para pasar información como esta, aunque requiere cierta planificación para asegurarse de que las plantillas correctas estén configuradas para usar globales.
Compartir Plantillas con Subcharts
Los charts padres y los subcharts pueden compartir plantillas. Cualquier bloque definido en cualquier chart está disponible para otros charts.
Por ejemplo, podemos definir una plantilla simple como esta:
{{- define "labels" }}from: mychart{{ end }}
Recuerde que las etiquetas en las plantillas se comparten globalmente. Por lo
tanto, el chart labels puede incluirse desde cualquier otro chart.
Mientras que los desarrolladores de charts pueden elegir entre include y
template, una ventaja de usar include es que puede referenciar plantillas
dinámicamente:
{{ include $mytemplate }}
Lo anterior desreferenciará $mytemplate. La función template, en contraste,
solo acepta un literal de cadena.
Evitar el Uso de Blocks
El lenguaje de plantillas de Go proporciona una palabra clave block que permite
a los desarrolladores proporcionar una implementación por defecto que se
sobrescribe después. En los charts de Helm, los blocks no son la mejor herramienta
para sobrescribir porque si se proporcionan múltiples implementaciones del mismo
block, la seleccionada es impredecible.
Se recomienda usar include en su lugar.