Charts
Helm usa un formato de empaquetado llamado charts. Un chart es una colección de archivos que describen un conjunto relacionado de recursos de Kubernetes. Se puede usar un solo chart para implementar algo simple, como un pod de Memcached, o algo complejo, como una pila de aplicaciones web completa con servidores HTTP, bases de datos, cachés, etc.
Los charts se crean como archivos dispuestos en un árbol de directorios en particular. Se pueden empaquetar en archivos versionados para ser desplegados.
Si desea descargar y ver los archivos de un chart publicado, sin instalarlo,
puede hacerlo con helm pull chartrepo/chartname
.
Este documento explica el formato del chart y proporciona una guía básica para crear charts con Helm.
La Estructura de Archivos del Chart
Un chart se organiza como una colección de archivos dentro de un directorio. El
nombre del directorio es el nombre del chart (sin información de versiones). Por
lo tanto, un chart que describa WordPress se almacenaría en un directorio wordpress/
.
Dentro de este directorio, Helm esperará una estructura que coincida con esto:
wordpress/
Chart.yaml # Un archivo YAML que contiene información sobre el chart.
LICENSE # OPCIONAL: Un archivo de texto sin formato que contiene la licencia del chart.
README.md # OPCIONAL: Un archivo README legible por humanos
values.yaml # Los valores de configuración predeterminados para este chart
values.schema.json # OPCIONAL: Un esquema JSON para imponer una estructura en el archivo values.yaml
charts/ # Un directorio que contiene los charts de los que depende este chart.
crds/ # Custom Resource Definitions
templates/ # Un directorio de plantillas que, cuando se combinan con valores,
# generarán archivos de manifiesto de Kubernetes válidos.
templates/NOTES.txt # OPCIONAL: Un archivo de texto sin formato que contiene breves notas de uso.
Helm se reserva el uso de los directorios charts/
, crds/
y templates/
, y
de los nombres de archivo listados. Los demás archivos se dejarán como están.
El Archivo Chart.yaml
El archivo Chart.yaml
es requerido para un chart. Contiene los siguientes campos:
apiVersion: La versión de la API de chart (requerido)
name: El nombre del chart (requerido)
version: An versión SemVer 2 (requerido)
kubeVersion: Un rango SemVer de versiones compatibles de Kubernetes (opcional)
description: Una descripción de una sola frase de este proyecto (opcional)
type: El tipo de chart (opcional)
keywords:
- Una lista de palabras clave sobre este proyecto (opcional)
home: La URL de la página de inicio de este proyecto (opcional)
sources:
- Una lista de URL al código fuente de este proyecto (opcional)
dependencies: # Una lista de los requisitos del chart. (opcional)
- name: El nombre del chart (nginx)
version: La versión del chart ("1.2.3")
repository: (opcional) La URL del repositorio ("https://example.com/charts") o el alias ("@repo-name")
condition: (opcional) Una ruta yaml que se resuelve en un booleano, que se usa para habilitar/deshabilitar charts (e.g. subchart1.enabled)
tags: # (opcional)
- Las etiquetas se pueden usar para agrupar charts para habilitar/deshabilitar en for conjunta
import-values: # (opcional)
- ImportValues contiene la asignación de valores de origen a la clave principal que se va a importar. Cada elemento puede ser una cadena o un par de elementos hijo/padre de la sublista.
alias: (opcional) Alias que se utilizará para el chart. Útil cuando tiene que agregar el mismo chart varias veces
maintainers: # (opcional)
- name: El nombre de los mantenedores (requerido para cada mantenedor)
email: El correo electrónico de los mantenedores (opcional para cada mantenedor)
url: Una URL para el mantenedor (opcional para cada mantenedor)
icon: Una URL a una imagen SVG o PNG que se utilizará como icono (opcional).
appVersion: La versión de la aplicación que contiene. (opcional). No es necesario que sea SemVer. Se recomienda encerrar en comillas.
deprecated: Si este chart está obsoleto (optional, boolean)
annotations:
example: Una lista de anotaciones codificadas por nombre (opcional).
Otros campos se ignorarán silenciosamente.
Charts y Versionado
Cada chart debe tener un número de versión. Una versión debe seguir el estándar SemVer 2. A diferencia de Helm Classic, Helm v2 y versiones posteriores utilizan números de versión como marcadores de versión. Los paquetes en repositorios son identificado por el nombre más la versión.
Por ejemplo, un chart nginx
cuyo campo de versión se establece en
versión: 1.2.3
se denominará:
nginx-1.2.3.tgz
También se admiten nombres SemVer 2 más complejos, como versión: 1.2.3-alpha.1+ef365
.
Pero el sistema rechaza explícitamente los nombres que no son SemVer.
NOTA: Mientras que Helm Classic y Deployment Manager estaban muy orientados a GitHub cuando se trataba de charts, Helm v2 y versiones posteriores no dependen ni requieren GitHub o incluso Git. En consecuencia, no utiliza Git SHA para el control de versiones.
El campo version
dentro de Chart.yaml
es utilizado por muchas de las
herramientas de Helm, incluida el CLI. Al generar un paquete, el comando
helm package
usará la versión que encuentre en el archivo Chart.yaml
como un token en el nombre del paquete. El sistema asume que el número de versión
en el nombre del paquete del chart coincide con el número de versión en
Chart.yaml
. El incumplimiento de esta suposición provocará un error.
El Campo apiVersion
El campo apiVersion
debe ser v2
para los charts de Helm que requieren al menos
Helm 3. Los charts que admiten versiones anteriores de Helm tienen el campo apiVersion
establecido en v1
y aún se pueden instalar en Helm 3.
Cambios de v1
a v2
:
- Un campo
dependencies
que define las dependencias del chart, que se encontraba en el archivorequirements.yaml
para los chartsv1
(consulte Dependencias del chart). - El campo
type
, discriminando charts de aplicaciones y bibliotecas (consulte Tipos de Charts).
El Campo appVersion
Tenga en cuenta que el campo appVersion
no está relacionado con el campo version
.
Es una forma de especificar la versión de la aplicación. Por ejemplo, el chart
drupal
puede tener una appVersion: "8.2.1"
, lo que indica que la versión de
Drupal incluida en el chart (por defecto) es 8.2.1
. Este campo es informativo
y no tiene ningún impacto en los cálculos de la versión del chart. Se recomienda
encarecidamente envolver la versión entre comillas. Esto obliga al analizador YAML
a tratar el número de versión como una cadena. Dejarlo sin comillas puede provocar
problemas de análisis en algunos casos. Por ejemplo, YAML interpreta 1.0
como un
valor de punto flotante y un SHA de confirmación de git como 1234e10
como
notación científica.
A partir de Helm v3.5.0, helm create
envuelve el campo predeterminado
appVersion
entre comillas.
El Campo kubeVersion
El campo opcional kubeVersion
puede definir restricciones de SemVer en las
versiones compatibles de Kubernetes. Helm validará las restricciones de versión
al instalar el chart y fallará si el clúster ejecuta una versión de Kubernetes
no compatible.
Las restricciones de versión pueden comprender comparaciones AND separadas por espacios, como
>= 1.13.0 < 1.15.0
que pueden combinarse con el operador OR ||
como en el siguiente ejemplo
>= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0
En este ejemplo, se excluye la versión 1.14.0
, lo que puede tener sentido si
se sabe que un error en ciertas versiones impide que el chart se ejecute correctamente.
Aparte de las restricciones de versión que emplean operadores =
! =
>
<
> =
<=
, se admiten las siguientes notaciones abreviadas
- rangos de guiones para intervalos cerrados, donde
1.1 - 2.3.4
es equivalente a>= 1.1 <= 2.3.4
. - comodines
x
,X
y*
, donde1.2.x
es equivalente a> = 1.2.0 <1.3.0
. - rangos de tilde (se permiten cambios en la versión del parche), donde
~1.2.3
es equivalente a>= 1.2.3 < 1.3.0
. - intervalos de intercalación (se permiten cambios menores en la versión), donde
^1.2.3
es equivalente a>= 1.2.3 < 2.0.0
.
Para obtener una explicación detallada de las restricciones semver admitidas, consulte Masterminds/semver.
Deprecando Charts
Al administrar charts en un repositorio de charts, a veces es necesario deprecar
un chart. El campo opcional deprecated
en Chart.yaml
se puede utilizar para
marcar un chart como deprecado. Si la última versión de un chart en el
repositorio está marcada como deprecado, entonces el chart en su conjunto se
considera deprecado. El nombre del chart se puede reutilizar más tarde publicando
una versión más reciente que no esté marcada como deprecado. El flujo de trabajo
para charts obsoletos es:
- Actualizar el archivo
Chart.yaml
del chart para marcar el chart como deprecado, subiendo la versión - Publicar la nueva versión del chart en el repositorio de charts.
- Eliminar el chart del repositorio de origen (p. Ej., git)
Tipos de Chart
El campo type
define el tipo de chart. Hay dos tipos: application
(aplicación)
y library
(biblioteca). Aplicación es el tipo predeterminado y es el chart estándar
con el que se puede operar completamente. El
chart de biblioteca
proporciona utilidades o funciones para el generador de charts. Un chart de biblioteca
se diferencia de un chart de aplicación porque no se puede instalar y, por lo
general, no contiene ningún objeto de recurso.
Nota: Se puede utilizar un chart de aplicación como chart de biblioteca. Esto
se habilita estableciendo el tipo en library
. Luego, el chart se renderizará
como un chart de biblioteca en el que se pueden aprovechar todas las utilidades
y funciones. Todos los objetos de recursos del chart no se renderizarán.
Archivos LICENSE, README y NOTES del Chart
Los Charts también pueden contener archivos que describen la instalación, configuración, uso y licencia de un chart.
Un archivo LICENSE es un archivo de texto sin formato que contiene la licencia para el chart. El chart puede contener una licencia, ya que puede tener lógica de programación en las plantillas y, por lo tanto, no sería solo configuración. También puede haber licencias separadas para la aplicación instalada por el chart, si es necesario.
Un archivo README para un chart debe tener el formato Markdown (README.md) y generalmente debe contener:
- Una descripción de la aplicación o servicio que proporciona el chart.
- Cualquier requisito previo o requisito para ejecutar el chart.
- Descripciones de opciones en
values.yaml
y valores predeterminados - Cualquier otra información que pueda ser relevante para la instalación o configuración del chart
Cuando los concentradores y otras interfaces de usuario muestran detalles sobre
un chart, ese detalle se extrae del contenido del archivo README.md
.
El chart también puede contener un archivo corto de texto sin formato templates/NOTES.txt
que se imprimirá después de la instalación y al ver el estado de un release. Este
archivo se evalúa como una
plantilla y se puede utilizar
para mostrar notas de uso, próximos pasos o cualquier otra información relevante
para una publicación del chart. Por ejemplo, se pueden proporcionar instrucciones
para conectarse a una base de datos o acceder a una interfaz de usuario web. Dado
que este archivo se imprime en STDOUT cuando se ejecuta helm install
o helm status
,
se recomienda mantener breve el contenido y señalar el archivo README para obtener
más detalles.
Dependencias del Chart
En Helm, un chart puede depender de cualquier número de otros charts. Estas
dependencias se pueden vincular dinámicamente usando el campo dependencies
en
Chart.yaml
o se pueden traer al directorio charts/
y administrar manualmente.
Administrar Dependencias con el Campo dependencies
Los chart requeridos por el chart actual se definen como una lista en el campo
dependencias
.
dependencies:
- name: apache
version: 1.2.3
repository: https://example.com/charts
- name: mysql
version: 3.2.1
repository: https://another.example.com/charts
- El campo
name
es el nombre del chart que desea. - El campo
version
es la versión del chart que desea. - El campo
repository
es la URL completa del repositorio de charts. Tenga en cuenta que usted también debe usarhelm repo add
para agregar ese repositorio localmente. - Puede usar el nombre del repositorio en lugar de la URL
$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com
dependencies:
- name: awesomeness
version: 1.0.0
repository: "@fantastic-charts"
Una vez que haya definido las dependencias, puede ejecutar helm dependency update
y usará su archivo de dependencia para descargar todos los chart especificados
en su directorio charts/
por usted.
$ helm dep up foochart
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "local" chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "example" chart repository
...Successfully got an update from the "another" chart repository
Update Complete. Happy Helming!
Saving 2 charts
Downloading apache from repo https://example.com/charts
Downloading mysql from repo https://another.example.com/charts
Cuando helm dependency update
recupera charts, los almacenará como archivos
de chart en el directorio charts/
. Entonces, para el ejemplo anterior, uno
esperaría ver los siguientes archivos en el directorio de charts:
charts/
apache-1.2.3.tgz
mysql-3.2.1.tgz
El Campo Alias en dependencies
Además de los otros campos anteriores, cada entrada de requisitos puede contener
el campo opcional alias
.
Agregar un alias para un chart de dependencia colocaría un chart en dependencias usando alias como nombre de la nueva dependencia.
Se puede usar un alias
en los casos en que necesiten acceder a un chart con otro
nombre(s).
# parentchart/Chart.yaml
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
alias: new-subchart-1
- name: subchart
repository: http://localhost:10191
version: 0.1.0
alias: new-subchart-2
- name: subchart
repository: http://localhost:10191
version: 0.1.0
En el ejemplo anterior obtendremos 3 dependencias en total para parentchart
:
subchart
new-subchart-1
new-subchart-2
La forma manual de lograr esto es copiando y pegando el mismo chart en el directorio
charts/
varias veces con diferentes nombres.
Campos de Tags and Condition en dependencies
Además de los otros campos anteriores, cada entrada de requisitos puede contener
los campos opcionales tags
y condition
.
Todos los charts se cargan de forma predeterminada. Si los campos tags
o condition
están presentes, se evaluarán y usarán para controlar la carga de los charts a
los que se aplican.
Condition: el campo condition contiene una o más rutas YAML (delimitadas por comas). Si esta ruta existe en los valores del padre superior y se resuelve en un valor booleano, el chart se habilitará o deshabilitará en función de ese valor booleano. Solo se evalúa la primera ruta válida que se encuentra en la lista y, si no existen rutas, la condición no tiene ningún efecto.
Tags: el campo tag es una lista YAML de etiquetas para asociar con este chart. En los valores padres superiores, todos los charts con etiquetas se pueden habilitar o deshabilitar especificando la etiqueta y un valor booleano.
# parentchart/Chart.yaml
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
tags:
- front-end
- subchart1
- name: subchart2
repository: http://localhost:10191
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- back-end
- subchart2
# parentchart/values.yaml
subchart1:
enabled: true
tags:
front-end: false
back-end: true
En el ejemplo anterior, todos los chart con la etiqueta front-end
estarían deshabilitados,
pero dado que la ruta subchart1.enabled
se evalúa como 'true' en los valores del
padre, la condición anulará la etiqueta front-end
y subchart1
estará habilitado.
Dado que subchart2
está etiquetado con back-end
y esa etiqueta se evalúa como
true
, se habilitará subchart2
. También tenga en cuenta que aunque subchart2
tiene una condición especificada, no hay una ruta y un valor correspondientes en
los valores de los padres, por lo que la condición no tiene ningún efecto.
Utilizar el CLI con Etiquetas y Condiciones
El parámetro --set
se puede utilizar como de costumbre para alterar los valores
de tags (etiquetas) y conditions (condiciones).
helm install --set tags.front-end=true --set subchart2.enabled=false
Resolución de Etiquetas y Condiciones
- Las condiciones (cuando se establecen en values) siempre sobreescriben a las etiquetas. La primera ruta de condición que existe gana y las siguientes para ese chart se ignoran.
- Las etiquetas se evalúan como 'si alguna de las etiquetas del chart es verdadera, habilite el chart'.
- Los valores de etiquetas y condiciones deben establecerse en los values del chart padre superior.
- The
tags:
key in values must be a top level key. Globals and nestedtags:
tables are not currently supported. - La clave
tags:
en values debe ser una clave de nivel superior. Lostags:
globales y anidados no son soportados actualmente.
Importar values hijos via dependencias
En algunos casos, es deseable permitir que los valores de un chart secundario
se propaguen al chart principal y se compartan como valores predeterminados
comunes. Un beneficio adicional de usar el formato de exports
es que permitirá
que las herramientas futuras introspecten los valores configurables por el usuario.
Las claves que contienen los valores que se van a importar se pueden especificar
en la sección dependencies
del chart principal en el campo import-values
mediante una lista YAML. Cada elemento de la lista es una clave que se importa
del campo exports
del chart secundario.
Para importar valores que no están contenidos en la clave exports
, use el
formato
hijo-padre. A continuación se describen
ejemplos de ambos formatos.
Usando el formato de exportación
If a child chart's values.yaml
file contains an exports
field at the root,
its contents may be imported directly into the parent's values by specifying the
keys to import as in the example below:
Si el archivo values.yaml
de un chart secundario contiene un campo de exports
en la raíz, su contenido se puede importar directamente a los values del padre
especificando las claves para importar como en el siguiente ejemplo:
# archivo Chart.yaml del padre
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
import-values:
- data
# archivo value.yaml del hijo
exports:
data:
myint: 99
Dado que estamos especificando la clave data
en nuestra lista de importación,
Helm busca en el campo exports
del chart secundario la clave data
e importa
su contenido.
El values final del padres contendrían nuestro campo exportado:
# values del padre
myint: 99
Tenga en cuenta que la clave principal data
no está contenida en el values
final del padre. Si necesita especificar la clave principal, utilice el formato 'hijo-padre'.
Usando el formato padre-hijo
Para acceder a los valores que no están contenidos en la clave exports
del values
del chart hijo, deberá especificar la clave de origen del values que se
importarán (child
) y la ruta de destino en el values del chart padre (parent
).
The import-values
in the example below instructs Helm to take any values found
at child:
path and copy them to the parent's values at the path specified in
parent:
Los import-values
en el siguiente ejemplo le indican a Helm que tome los valores
encontrados en la ruta child:
y los copie a los valores del padre en la ruta
especificada en parent:
# archivo Chart.yaml del padre
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
En el ejemplo anterior, los valores que se encuentran en default.data
en los
valores del subchart1 se importarán a la clave myimports
en los values del chart
padre como se detalla a continuación:
# archivo values.yaml del padre
myimports:
myint: 0
mybool: false
mystring: "helm rocks!"
# archivo values.yaml subchart1
default:
data:
myint: 999
mybool: true
El values del chart padre resultantes sería:
# vales final del padre
myimports:
myint: 999
mybool: true
mystring: "helm rocks!"
El values final del padre ahora contienen los campos myint
y mybool
importados de subchart1.
Administrar Dependencias manualmente a través del directorio charts/
Si se desea más control sobre las dependencias, estas dependencias se pueden
expresar explícitamente copiando los charts de dependencias en el directorio
charts/
.
Una dependencia puede ser un archivo de chart (foo-1.2.3.tgz
) o un directorio
de chart descomprimido. Pero su nombre no puede comenzar con _
o .
. El cargador
de chart ignora estos archivos.
Por ejemplo, si el chart de WordPress depende del chart de Apache, el chart de Apache
(de la versión correcta) se proporciona en el directorio charts/
del chart de WordPress:
wordpress:
Chart.yaml
# ...
charts/
apache/
Chart.yaml
# ...
mysql/
Chart.yaml
# ...
El ejemplo anterior muestra cómo el chart de WordPress expresa su dependencia
de Apache y MySQL al incluir esos charts dentro de su directorio charts /
.
CONSEJO: Para colocar una dependencia en su directorio charts/
, use el
comando helm pull
Aspectos operativos del uso de dependencias
Las secciones anteriores explican cómo especificar las dependencias del chart,
pero ¿cómo afecta esto a la instalación del chart usando helm install
y
helm upgrade
?
Supongamos que un chart llamado "A" crea los siguientes objetos de Kubernetes
- namespace "A-Namespace"
- statefulset "A-StatefulSet"
- service "A-Service"
Además, A depende del chart B que crea los objetos
- namespace "B-Namespace"
- replicaset "B-ReplicaSet"
- service "B-Service"
Después de la instalación/actualización del chart A, se crea/modifica un único release de Helm. El release creará/actualizará todos los objetos de Kubernetes anteriores en el siguiente orden:
- A-Namespace
- B-Namespace
- A-Service
- B-Service
- B-ReplicaSet
- A-StatefulSet
Esto se debe a que cuando Helm instala/actualiza charts, los objetos de Kubernetes de los charts y todas sus dependencias son
- agregado en un solo conjunto; luego
- ordenados por tipo seguido de nombre; y entonces
- creado/actualizado en ese orden.
Por lo tanto, se crea un único release con todos los objetos del charts y sus dependencias.
El orden de instalación de los tipos de Kubernetes viene dado por la enumeración InstallOrder en kind_sorter.go (ver el archivo fuente de Helm).
Plantillas y Valores
Las plantillas de Charts de Helm están escritas en el lenguaje Go template, con la adición de unas 50 funciones de plantilla complementarias de la biblioteca Sprig y algunas otras funciones especializadas.
Todos los archivos de plantilla se almacenan en la carpeta templates/
de un chart.
Cuando Helm renderiza los charts, pasará todos los archivos de ese directorio a
través del motor de plantillas.
Los valores de las plantillas se proporcionan de dos formas:
- Los desarrolladores de charts pueden proporcionar un archivo llamado
values.yaml
dentro de un chart. Este archivo puede contener valores predeterminados. - Los usuarios de charts pueden proporcionar un archivo YAML que contenga valores.
Esto se puede proporcionar en la línea de comandos con
helm install
.
Cuando un usuario proporciona valores personalizados, estos valores sobreescribirán
los valores del archivo values.yaml
del chart.
Archivos de Plantillas
Los archivos de plantilla siguen las convenciones estándar para escribir plantillas de Go (consulte la documentación del paquete de text/template de Go para obtener más detalles). Un archivo de plantilla de ejemplo podría verse así:
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
app.kubernetes.io/managed-by: deis
spec:
replicas: 1
selector:
app.kubernetes.io/name: deis-database
template:
metadata:
labels:
app.kubernetes.io/name: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
imagePullPolicy: {{ .Values.pullPolicy }}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {{ default "minio" .Values.storage }}
El ejemplo anterior, basado ligeramente en
https://github.com/deis/charts, es una plantilla
para un controlador de replicación de Kubernetes. Puede utilizar los siguientes
cuatro valores de plantilla (normalmente definidos en un archivo values.yaml
):
imageRegistry
: El registro de origen de la imagen de Docker.dockerTag
: La etiqueta para image de Docker.pullPolicy
: La política de pull de The Kubernetes.storage
: El backend de almacenamiento, cuyo valor predeterminado es"minio"
Todos estos valores los define el autor de la plantilla. Helm no requiere ni dicta parámetros.
Para ver muchos charts operativos, consulte Artifact Hub de la CNCF.
Valores Predefinidos
Los valores que se proporcionan a través de un archivo values.yaml
(o mediante
la bandera --set
) son accesibles desde el objeto .Values
en una plantilla.
Pero hay otros datos predefinidos a los que puede acceder en tus plantillas.
Los siguientes valores están predefinidos, están disponibles para todas las plantillas y no se pueden sobreescribir. Como ocurre con todos los valores, los nombres son sensibles a mayúsculas y minúsculas.
Release.Name
: El nombre del release (no del chart)Release.Namespace
: El namespace donde el chart fue deplegado.Release.Service
: El servicio que realizó el lanzamiento.Release.IsUpgrade
: Se establece en true (verdadero) si la operación actual es una actualización o una reversión.Release.IsInstall
: Se establece en true (verdadero) si la operación actual es una instalación.Chart
: El contenido deChart.yaml
. Por lo tanto, la versión del chart se puede obtener comoChart.Version
y los mantenedores están enChart.Maintainers
.Files
: Un objeto similar a un mapa que contiene todos los archivos no especiales del chart. Esto no le dará acceso a las plantillas, pero le dará acceso a archivos adicionales que están presentes (a menos que estén excluidos usando.helmignore
). Se puede acceder al archivo usando{{ index .Files "file.name" }}
o usando la función{{ .Files.Get name }}
. También puede acceder al contenido del archivo como[]byte
usando{{ .Files.GetBytes }}
Capabilities
: Un objeto similar a un mapa que contiene información sobre las versiones de Kubernetes ({{ .Capabilities.KubeVersion }}
) y las versiones compatibles de la API de Kubernetes ({{ .Capabilities.APIVersions.Has "batch/v1" }}
)
NOTA: Se eliminarán todos los campos desconocidos de Chart.yaml
. No serán
accesibles dentro del objeto Chart
. Por lo tanto, Chart.yaml
no se puede usar
para pasar datos estructurados arbitrariamente a la plantilla. Sin embargo, el
archivo de values se puede usar para eso.
Archivos values
Teniendo en cuenta la plantilla de la sección anterior, un archivo values.yaml
que proporciona los valores necesarios se vería así:
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"
Un archivo values tiene el formato YAML. Un chart puede incluir un archivo
values.yaml
predeterminado. El comando de instalación de Helm permite al usuario
sobreescribir valores al proporcionar valores YAML adicionales:
$ helm install --generate-name --values=myvals.yaml wordpress
Cuando los valores se pasan de esta manera, se fusionarán en el archivo de values
predeterminado. Por ejemplo, considere un archivo myvals.yaml
que se ve así:
storage: "gcs"
Cuando se fusiona con values.yaml
del chart, el contenido generado resultante será:
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "gcs"
Tenga en cuenta que solo se sobreescribó el último campo.
NOTA: El archivo de valores predeterminados incluido dentro de un chart
debe llamarse values.yaml
. Pero los archivos especificados en la línea de
comandos pueden tener cualquier nombre.
NOTA: Si la marca --set
se usa en helm install
o helm upgrade
, esos valores
simplemente se convierten a YAML en el lado del cliente.
NOTA: Si existen entradas obligatorias en el archivo values, se pueden declarar según sea necesario en la plantilla del chart mediante la función 'required'
Cualquiera de estos valores es accesible dentro de las plantillas usando el objeto
.Values
:
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
app.kubernetes.io/managed-by: deis
spec:
replicas: 1
selector:
app.kubernetes.io/name: deis-database
template:
metadata:
labels:
app.kubernetes.io/name: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
imagePullPolicy: {{ .Values.pullPolicy }}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {{ default "minio" .Values.storage }}
Alcance, Dependencias y Valores
Los archivos de valores pueden declarar valores para el chart de nivel superior,
así como para cualquiera de los charts que se incluyen en el directorio charts/
de ese chart. O, para expresarlo de otra manera, un archivo de valores puede
proporcionar valores al chart, así como a cualquiera de sus dependencias. Por ejemplo,
el chart de demostración de WordPress anterior tiene tanto mysql
como apache
como dependencias. El archivo de valores podría proporcionar valores a todos estos
componentes:
title: "My WordPress Site" # Enviado a la plantilla de WordPress
mysql:
max_connections: 100 # Enviado a MySQL
password: "secret"
apache:
port: 8080 # Enviado a Apache
Los charts de un nivel superior tienen acceso a todas las variables definidas a
nivel inferior. Entonces, el chart de WordPress puede acceder a la contraseña de
MySQL como .Values.mysql.password
. Pero los charts de nivel inferior no pueden
acceder a elementos de los charts padres, por lo que MySQL no podrá acceder a la
propiedad title
. Tampoco, en ese caso, puede acceder a apache.port
.
Los valores son dependientes del espacio de nombres, pero los espacios de nombres
se podan. Entonces, para el chart de WordPress, puede acceder al campo de contraseña
de MySQL como .Values.mysql.password
. Pero para el chart MySQL, el alcance de
los valores se ha reducido y el prefijo del espacio de nombres eliminado, por lo
que verá el campo de contraseña simplemente como .Values.password
.
Valores Globales
A partir de 2.0.0-Alpha.2, Helm admite un valor "global" especial. Considere esta versión modificada del ejemplo anterior:
title: "My WordPress Site" # Enviado a la plantilla de WordPress
global:
app: MyWordPress
mysql:
max_connections: 100 # Enviado a MySQL
password: "secret"
apache:
port: 8080 # Enviado a Apache
Lo anterior agrega una sección global
con el valor app: MyWordPress
. Este
valor está disponible para todos los charts como .Values.global.app
.
Por ejemplo, las plantillas mysql
pueden acceder a app
como
{{ .Values.global.app }}
, y también el chart apache
. Efectivamente, el
archivo de valores anterior se regenera así:
title: "My WordPress Site" # Enviado a la plantilla de WordPress
global:
app: MyWordPress
mysql:
global:
app: MyWordPress
max_connections: 100 # Enviado a MySQL
password: "secret"
apache:
global:
app: MyWordPress
port: 8080 # Enviado a Apache
Esto proporciona una forma de compartir una variable de nivel superior con todos
los sub-charts, lo cual es útil para cosas como establecer propiedades de metadatos
como etiquetas.
Si un sub-chart declara una variable global, ese global se pasará hacia abajo (a los sub-charts del sub-chart), pero no hacia arriba al chart padre. No hay forma de que un sub-chart influya en los valores del chart padre.
Además, las variables globales de los charts padres tienen prioridad sobre las variables globales de los subcharts.
Archivos de Esquema
A veces, un mantenedor de charts puede querer definir una estructura sobre sus
valores. Esto se puede hacer definiendo un esquema en el archivo
values.schema.json
. Un esquema se representa como un
JSON Schema. Podría verse algo como esto:
{
"$schema": "https://json-schema.org/draft-07/schema#",
"properties": {
"image": {
"description": "Container Image",
"properties": {
"repo": {
"type": "string"
},
"tag": {
"type": "string"
}
},
"type": "object"
},
"name": {
"description": "Service name",
"type": "string"
},
"port": {
"description": "Port",
"minimum": 0,
"type": "integer"
},
"protocol": {
"type": "string"
}
},
"required": [
"protocol",
"port"
],
"title": "Values",
"type": "object"
}
Este esquema se aplicará a los valores para validarlo. La validación se produce cuando se invoca cualquiera de los siguientes comandos:
helm install
helm upgrade
helm lint
helm template
Un ejemplo de un archivo values.yaml
que cumpla con los requisitos de este
esquema podría verse así:
name: frontend
protocol: https
port: 443
Tenga en cuenta que el esquema se aplica al objeto final .Values
, y no solo al
archivo values.yaml
. Esto significa que el siguiente archivo yaml
es válido,
dado que el chart se instala con la opción --set
apropiada que se muestra a continuación.
name: frontend
protocol: https
helm install --set port=443
Además, el objeto .Values
final se verifica con todos los esquemas de los sub-charts.
Esto significa que un chart padre no puede eludir las restricciones de un sub-chart.
Esto también funciona al revés: si un subchart tiene un requisito que no se cumple
en el archivo values.yaml
del subchart, el chart padre debe satisfacer esas
restricciones para ser válido.
Referencias
Cuando se trata de escribir plantillas, valores y archivos de esquema, existen varias referencias estándar que le ayudarán.
Custom Resource Definitions (CRDs)
Kubernetes proporciona un mecanismo para declarar nuevos tipos de objetos de Kubernetes. Con CustomResourceDefinitions (CRD), los desarrolladores de Kubernetes pueden declarar tipos de recursos personalizados.
En Helm 3, los CRD se tratan como un tipo especial de objeto. Se instalan antes que el resto de la tabla y están sujetos a algunas limitaciones.
Los archivos CRD YAML deben colocarse en el directorio crds/
dentro de un chart.
Se pueden colocar varios CRD (separados por marcadores de inicio y finalización YAML)
en el mismo archivo. Helm intentará cargar todos los archivos del directorio
CRD en Kubernetes.
Los archivos CRD no pueden tener plantilla. Deben ser documentos YAML simples.
Cuando Helm instala un nuevo chart, cargará los CRD, se detendrá hasta que el
servidor de API los ponga a disposición, y luego iniciará el motor de plantillas,
renderizará el resto del chart y lo cargará en Kubernetes. Debido a este orden,
la información de CRD está disponible en el objeto .Capabilities
en las
plantillas de Helm, y las plantillas de Helm pueden crear nuevas instancias de
objetos que fueron declarados en los CRD.
For example, if your chart had a CRD for CronTab
in the crds/
directory, you
may create instances of the CronTab
kind in the templates/
directory:
Por ejemplo, si su chart tenía un CRD para CronTab
en el directorio crds/
,
puede crear instancias del tipo CronTab
en el directorio templates/
:
crontabs/
Chart.yaml
crds/
crontab.yaml
templates/
mycrontab.yaml
El archivo crontab.yaml
debe contener el CRD sin directivas de plantilla:
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
Luego, la plantilla mycrontab.yaml
puede crear un nuevo CronTab
(usando
plantillas como de costumbre):
apiVersion: stable.example.com
kind: CronTab
metadata:
name: {{ .Values.name }}
spec:
# ...
Helm se asegurará de que el tipo CronTab
se haya instalado y esté disponible
en el servidor API de Kubernetes antes de continuar con la instalación de las cosas
en templates/
.
Limitaciones de los CRDs
A diferencia de la mayoría de los objetos de Kubernetes, los CRD se instalan globalmente. Por esa razón, Helm adopta un enfoque muy cauteloso en la gestión de CRD. Los CRD están sujetos a las siguientes limitaciones:
- Los CRD nunca se reinstalan. Si Helm determina que los CRD en el directorio
crds/
ya están presentes (independientemente de la versión), Helm no intentará instalarlos ni actualizarlos. - Los CRD nunca se instalan en la actualización o reversión. Helm solo creará CRD en las operaciones de instalación.
- Los CRD nunca se eliminan. La eliminación de un CRD elimina automáticamente todo el contenido del CRD en todos los espacios de nombres del clúster. En consecuencia, Helm no eliminará los CRD.
Se recomienda a los operadores que deseen actualizar o eliminar CRD que lo hagan manualmente y con mucho cuidado.
Uso de Helm para Administrar Charts
La herramienta helm
tiene varios comandos para trabajar con charts.
Puede crear un nuevo chart para usted:
$ helm create mychart
Created mychart/
Una vez que haya editado un chart, helm
puede empaquetarlo en un archivo de
charts para usted:
$ helm package mychart
Archived mychart-0.1.-.tgz
También puede usar helm
para ayudarlo a encontrar problemas con el formato o
la información de su chart:
$ helm lint mychart
No issues found
Repositorios de Chart
Un repositorio de charts es un servidor HTTP que alberga uno o más charts
empaquetados. Si bien helm
se puede usar para administrar directorios de
charts locales, cuando se trata de compartir charts, el mecanismo preferido es
un repositorio de charts.
Cualquier servidor HTTP que pueda servir archivos YAML y tar y que pueda responder solicitudes GET se puede utilizar como servidor de repositorio. El equipo de Helm ha probado algunos servidores, incluido Google Cloud Storage con el modo de sitio web habilitado y S3 con el modo de sitio web habilitado.
Un repositorio se caracteriza principalmente por la presencia de un archivo
especial llamado index.yaml
que tiene una lista de todos los paquetes
proporcionados por el repositorio, junto con metadatos que permiten recuperar y
verificar esos paquetes.
En el lado del cliente, los repositorios se administran con los comandos helm repo
.
Sin embargo, Helm no proporciona herramientas para cargar charts en servidores
de repositorios remotos. Esto se debe a que hacerlo agregaría requisitos
sustanciales a un servidor de implementación y, por lo tanto, elevaría la barrera
para configurar un repositorio.
Paquetes de Inicio de Charts
El comando helm create
toma una opción opcional --starter
que le permite
especificar un "chart de inicio".
Los paquetes de inicio son charts regulares, pero se encuentran en
$XDG_DATA_HOME/helm/starters
. Como desarrollador de charts, puede crear charts
que estén diseñados específicamente para usarse como iniciadores. Dichos charts
deben diseñarse teniendo en cuenta las siguientes consideraciones:
- El generador sobrescribirá el archivo
Chart.yaml
. - Los usuarios esperarán modificar el contenido de dicho chart, por lo que la documentación debe indicar cómo pueden hacerlo los usuarios.
- Todas las apariciones de
<CHARTNAME>
serán reemplazadas con el nombre de chart especificado para que los charts de inicio se puedan usar como plantillas.
Actualmente, la única forma de agregar un chart a $XDG_DATA_HOME/helm/starters
es copiarlo manualmente allí. En la documentación de su chart, es posible que
desee explicar ese proceso.