Guía de Plugins de Helm
Un plugin de Helm es una herramienta a la que se puede acceder a través del CLI
de helm, pero que no forma parte del código base incorporado de Helm.
Los plugins existentes se pueden encontrar en la sección relacionados o buscando en GitHub.
Esta guía explica cómo usar y crear plugins.
Descripción General
Los plugins de Helm son herramientas complementarias que se integran perfectamente con Helm. Proporcionan una forma de extender el conjunto de características principales de Helm, sin requerir que cada nueva característica sea escrita en Go y añadida a la herramienta principal.
Los plugins de Helm tienen las siguientes características:
- Se pueden agregar y eliminar de una instalación de Helm sin afectar la herramienta principal de Helm.
- Pueden ser escritos en cualquier lenguaje de programación.
- Se integran con Helm y aparecerán en
helm helpy otros lugares.
Los plugins de Helm residen en $HELM_PLUGINS. Puede encontrar el valor actual
de esta variable, incluyendo el valor predeterminado cuando no está configurada
en el entorno, usando el comando helm env.
El modelo de plugins de Helm está parcialmente basado en el modelo de plugins de
Git. Por esa razón, a veces puede escuchar que helm se denomina la capa de
porcelana, mientras que los plugins son la fontanería. Esta es una forma
abreviada de sugerir que Helm proporciona la experiencia del usuario y la lógica
de procesamiento de alto nivel, mientras que los plugins hacen el "trabajo de
detalle" de realizar una acción deseada.
Instalar un Plugin
Los plugins se instalan usando el comando $ helm plugin install <path|url>. Puede
pasar una ruta a un plugin en su sistema de archivos local o una URL de un
repositorio VCS remoto. El comando helm plugin install clona o copia el plugin
en la ruta/URL proporcionada en $HELM_PLUGINS. Si está instalando desde un VCS,
puede especificar la versión con el argumento --version.
$ helm plugin install https://github.com/adamreese/helm-env
Si tiene una distribución tar de un plugin, simplemente descomprima el plugin en
el directorio $HELM_PLUGINS. También puede instalar plugins tarball
directamente desde una URL usando helm plugin install https://domain/path/to/plugin.tar.gz
Estructura de Archivos del Plugin
En muchos aspectos, un plugin es similar a un chart. Cada plugin tiene un directorio
de nivel superior que contiene un archivo plugin.yaml. Pueden estar presentes
archivos adicionales, pero solo el archivo plugin.yaml es requerido.
$HELM_PLUGINS/
|- last/
|- plugin.yaml
El Archivo plugin.yaml
El archivo plugin.yaml es requerido para un plugin. Contiene los siguientes campos:
name: The name of the plugin (REQUIRED)
version: A SemVer 2 version (REQUIRED)
usage: Single line usage text shown in help
description: Long description shown in places like helm help
ignoreFlags: Ignore flags passed in from Helm
platformCommand: # Configure command to run based on the platform
- os: OS match, can be empty or omitted to match all OS'
arch: Architecture match, can be empty or omitted to match all architectures
command: Plugin command to execute
args: Plugin command arguments
command: (DEPRECATED) Plugin command, use platformCommand instead
platformHooks: # Configure plugin lifecycle hooks based on the platform
install: # Install lifecycle commands
- os: OS match, can be empty or omitted to match all OS'
arch: Architecture match, can be empty or omitted to match all architectures
command: Plugin install command to execute
args: Plugin install command arguments
update: # Update lifecycle commands
- os: OS match, can be empty or omitted to match all OS'
arch: Architecture match, can be empty or omitted to match all architectures
command: Plugin update command to execute
args: Plugin update command arguments
delete: # Delete lifecycle commands
- os: OS match, can be empty or omitted to match all OS'
arch: Architecture match, can be empty or omitted to match all architectures
command: Plugin delete command to execute
args: Plugin delete command arguments
hooks: # (Deprecated) Plugin lifecycle hooks, use platformHooks instead
install: Command to install plugin
update: Command to update plugin
delete: Command to delete plugin
downloaders: # Configure downloaders capability
- command: Command to invoke
protocols:
- Protocol schema supported
El Campo name
El name es el nombre del plugin. Cuando Helm ejecuta este plugin, este es el
nombre que usará (por ejemplo, helm NAME invocará este plugin).
name debe coincidir con el nombre del directorio. En nuestro ejemplo anterior,
eso significa que el plugin con name: last debe estar contenido en un directorio
llamado last.
Restricciones sobre name:
nameno puede duplicar uno de los comandos de nivel superior existentes dehelm.namedebe estar restringido a los caracteres ASCII a-z, A-Z, 0-9,_y-.
El Campo version
El version es la versión SemVer 2 del plugin. usage y description se
utilizan para generar el texto de ayuda de un comando.
El Campo ignoreFlags
El interruptor ignoreFlags le indica a Helm que no pase banderas al plugin.
Por lo tanto, si un plugin se llama con helm myplugin --foo e ignoreFlags: true,
entonces --foo se descarta silenciosamente.
El Campo platformCommand
El campo platformCommand configura el comando que el plugin ejecutará cuando
sea invocado. No puede establecer tanto platformCommand como command, ya que
esto resultará en un error. Se aplicarán las siguientes reglas para decidir qué
comando usar:
- Si
platformCommandestá presente, se usará.- Si tanto
oscomoarchcoinciden con la plataforma actual, la búsqueda se detendrá y se usará el comando. - Si
oscoincide yarchestá vacío, se usará el comando. - Si tanto
oscomoarchestán vacíos, se usará el comando. - Si no hay coincidencia, Helm saldrá con un error.
- Si tanto
- Si
platformCommandno está presente y el obsoletocommandestá presente, se usará.- Si el comando está vacío, Helm saldrá con un error.
El Campo platformHooks
El campo platformHooks configura los comandos que el plugin ejecutará para
eventos del ciclo de vida. No puede establecer tanto platformHooks como hooks,
ya que esto resultará en un error. Se aplicarán las siguientes reglas para decidir
qué comando de hook usar:
- Si
platformHooksestá presente, se usará y se procesarán los comandos para el evento del ciclo de vida.- Si tanto
oscomoarchcoinciden con la plataforma actual, la búsqueda se detendrá y se usará el comando. - Si
oscoincide yarchestá vacío, se usará el comando. - Si tanto
oscomoarchestán vacíos, se usará el comando. - Si no hay coincidencia, Helm omitirá el evento.
- Si tanto
- Si
platformHooksno está presente y el obsoletohooksestá presente, se usará el comando para el evento del ciclo de vida.- Si el comando está vacío, Helm omitirá el evento.
Construir un Plugin
Aquí está el YAML del plugin para un plugin simple que ayuda a obtener el nombre del último release:
name: last
version: 0.1.0
usage: get the last release name
description: get the last release name
ignoreFlags: false
platformCommand:
- command: ${HELM_BIN}
args:
- list
- --short
- --max=1
- --date
- -r
Los plugins pueden requerir scripts y ejecutables adicionales. Los scripts pueden incluirse en el directorio del plugin y los ejecutables pueden descargarse mediante un hook. El siguiente es un ejemplo de plugin:
$HELM_PLUGINS/
|- myplugin/
|- scripts/
|- install.ps1
|- install.sh
|- plugin.yaml
name: myplugin
version: 0.1.0
usage: example plugin
description: example plugin
ignoreFlags: false
platformCommand:
- command: ${HELM_PLUGIN_DIR}/bin/myplugin
- os: windows
command: ${HELM_PLUGIN_DIR}\bin\myplugin.exe
platformHooks:
install:
- command: ${HELM_PLUGIN_DIR}/scripts/install.sh
- os: windows
command: pwsh
args:
- -c
- ${HELM_PLUGIN_DIR}\scripts\install.ps1
update:
- command: ${HELM_PLUGIN_DIR}/scripts/install.sh
args:
- -u
- os: windows
command: pwsh
args:
- -c
- ${HELM_PLUGIN_DIR}\scripts\install.ps1
- -Update
Las variables de entorno se interpolan antes de que el plugin se ejecute. El patrón anterior ilustra la forma preferida de indicar dónde reside el programa del plugin.
Comandos del Plugin
Hay algunas estrategias para trabajar con comandos de plugins:
- Si un plugin incluye un ejecutable, el ejecutable para un
platformCommand:o debe estar empaquetado en el directorio del plugin o instalado mediante un hook. - La línea
platformCommand:ocommand:tendrá todas las variables de entorno expandidas antes de la ejecución.$HELM_PLUGIN_DIRapuntará al directorio del plugin. - El comando en sí no se ejecuta en un shell. Por lo tanto, no puede escribir un script de shell en una sola línea.
- Helm inyecta mucha configuración en variables de entorno. Examine el entorno para ver qué información está disponible.
- Helm no hace suposiciones sobre el lenguaje del plugin. Puede escribirlo en el lenguaje que prefiera.
- Los comandos son responsables de implementar texto de ayuda específico para
-hy--help. Helm usaráusageydescriptionparahelm helpyhelm help myplugin, pero no manejaráhelm myplugin --help.
Probar un Plugin Local
Primero necesita encontrar la ruta de su HELM_PLUGINS. Para hacerlo, ejecute el
siguiente comando:
helm env
Cambie su directorio actual al directorio donde está configurado HELM_PLUGINS.
Ahora puede agregar un enlace simbólico a la salida de compilación de su plugin.
En este ejemplo lo hicimos para mapkubeapis.
ln -s ~/GitHub/helm-mapkubeapis ./helm-mapkubeapis
Plugins de Descarga
Por defecto, Helm puede descargar Charts usando HTTP/S. A partir de Helm 2.4.0, los plugins pueden tener una capacidad especial para descargar Charts desde fuentes arbitrarias.
Los plugins deben declarar esta capacidad especial en el archivo plugin.yaml
(nivel superior):
downloaders:
- command: "bin/mydownloader"
protocols:
- "myprotocol"
- "myprotocols"
Si dicho plugin está instalado, Helm puede interactuar con el repositorio usando
el esquema de protocolo especificado invocando el command. El repositorio
especial debe agregarse de manera similar a los regulares: helm repo add favorite myprotocol://example.com/. Las reglas para los repositorios especiales son las
mismas que para los regulares: Helm debe poder descargar el archivo index.yaml
para descubrir y almacenar en caché la lista de Charts disponibles.
El comando definido se invocará con el siguiente esquema: command certFile keyFile caFile full-URL. Las credenciales SSL provienen de la definición del
repositorio, almacenada en $HELM_REPOSITORY_CONFIG
(es decir, $HELM_CONFIG_HOME/repositories.yaml). Se espera que un plugin de
descarga envíe el contenido sin procesar a stdout e informe errores en stderr.
El comando de descarga también admite subcomandos o argumentos, lo que le permite
especificar, por ejemplo, bin/mydownloader subcommand -d en el plugin.yaml.
Esto es útil si desea usar el mismo ejecutable para el comando principal del
plugin y el comando de descarga, pero con un subcomando diferente para cada uno.
Variables de Entorno
Cuando Helm ejecuta un plugin, pasa el entorno externo al plugin y también inyecta algunas variables de entorno adicionales.
Variables como KUBECONFIG se configuran para el plugin si están configuradas
en el entorno externo.
Se garantiza que las siguientes variables estarán configuradas:
HELM_PLUGINS: La ruta al directorio de plugins.HELM_PLUGIN_NAME: El nombre del plugin, como fue invocado porhelm. Así quehelm myplugtendrá el nombre cortomyplug.HELM_PLUGIN_DIR: El directorio que contiene el plugin.HELM_BIN: La ruta al comandohelm(como fue ejecutado por el usuario).HELM_DEBUG: Indica si la bandera de depuración fue establecida por helm.HELM_REGISTRY_CONFIG: La ubicación de la configuración del registro (si se usa). Tenga en cuenta que el uso de Helm con registros es una característica experimental.HELM_REPOSITORY_CACHE: La ruta a los archivos de caché del repositorio.HELM_REPOSITORY_CONFIG: La ruta al archivo de configuración del repositorio.HELM_NAMESPACE: El namespace dado al comandohelm(generalmente usando la bandera-n).HELM_KUBECONTEXT: El nombre del contexto de configuración de Kubernetes dado al comandohelm.
Adicionalmente, si se especificó explícitamente un archivo de configuración de
Kubernetes, se establecerá como la variable KUBECONFIG.
Una Nota sobre el Análisis de Banderas
Al ejecutar un plugin, Helm analizará las banderas globales para su propio uso. Ninguna de estas banderas se pasa al plugin.
--burst-limit: Esto se convierte a$HELM_BURST_LIMIT--debug: Si se especifica,$HELM_DEBUGse establece en1--kube-apiserver: Esto se convierte a$HELM_KUBEAPISERVER--kube-as-group: Estas se convierten a$HELM_KUBEASGROUPS--kube-as-user: Esto se convierte a$HELM_KUBEASUSER--kube-ca-file: Esto se convierte a$HELM_KUBECAFILE--kube-context: Esto se convierte a$HELM_KUBECONTEXT--kube-insecure-skip-tls-verify: Esto se convierte a$HELM_KUBEINSECURE_SKIP_TLS_VERIFY--kube-tls-server-name: Esto se convierte a$HELM_KUBETLS_SERVER_NAME--kube-token: Esto se convierte a$HELM_KUBETOKEN--kubeconfig: Esto se convierte a$KUBECONFIG--namespacey-n: Esto se convierte a$HELM_NAMESPACE--qps: Esto se convierte a$HELM_QPS--registry-config: Esto se convierte a$HELM_REGISTRY_CONFIG--repository-cache: Esto se convierte a$HELM_REPOSITORY_CACHE--repository-config: Esto se convierte a$HELM_REPOSITORY_CONFIG
Los plugins deberían mostrar texto de ayuda y luego salir para -h y --help.
En todos los demás casos, los plugins pueden usar banderas según sea apropiado.
Proporcionar Auto-completado de Shell
A partir de Helm 3.2, un plugin puede opcionalmente proporcionar soporte para auto-completado de shell como parte del mecanismo de auto-completado existente de Helm.
Auto-completado Estático
Si un plugin proporciona sus propias banderas y/o subcomandos, puede informar a
Helm de ellos teniendo un archivo completion.yaml ubicado en el directorio raíz
del plugin. El archivo completion.yaml tiene la siguiente forma:
name: <pluginName>
flags:
- <flag 1>
- <flag 2>
validArgs:
- <arg value 1>
- <arg value 2>
commands:
name: <commandName>
flags:
- <flag 1>
- <flag 2>
validArgs:
- <arg value 1>
- <arg value 2>
commands:
<and so on, recursively>
Notas:
- Todas las secciones son opcionales pero deben proporcionarse si son aplicables.
- Las banderas no deben incluir el prefijo
-o--. - Se pueden y deben especificar tanto banderas cortas como largas. Una bandera corta no necesita estar asociada con su forma larga correspondiente, pero ambas formas deben listarse.
- Las banderas no necesitan estar ordenadas de ninguna manera, pero deben listarse en el punto correcto de la jerarquía de subcomandos del archivo.
- Las banderas globales existentes de Helm ya son manejadas por el mecanismo de
auto-completado de Helm, por lo tanto los plugins no necesitan especificar las
siguientes banderas
--debug,--namespaceo-n,--kube-context, y--kubeconfig, ni ninguna otra bandera global. - La lista
validArgsproporciona una lista estática de posibles completados para el primer parámetro después de un subcomando. No siempre es posible proporcionar dicha lista por adelantado (consulte la sección Completado Dinámico a continuación), en cuyo caso la secciónvalidArgspuede omitirse.
El archivo completion.yaml es completamente opcional. Si no se proporciona,
Helm simplemente no proporcionará auto-completado de shell para el plugin (a
menos que el plugin soporte Completado Dinámico).
Además, agregar un archivo completion.yaml es compatible con versiones anteriores
y no afectará el comportamiento del plugin cuando se usen versiones anteriores
de helm.
Como ejemplo, para el plugin fullstatus
que no tiene subcomandos pero acepta las mismas banderas que el comando
helm status, el archivo completion.yaml es:
name: fullstatus
flags:
- o
- output
- revision
Un ejemplo más complejo para el plugin 2to3,
tiene un archivo completion.yaml de:
name: 2to3
commands:
- name: cleanup
flags:
- config-cleanup
- dry-run
- l
- label
- release-cleanup
- s
- release-storage
- tiller-cleanup
- t
- tiller-ns
- tiller-out-cluster
- name: convert
flags:
- delete-v2-releases
- dry-run
- l
- label
- s
- release-storage
- release-versions-max
- t
- tiller-ns
- tiller-out-cluster
- name: move
commands:
- name: config
flags:
- dry-run
Completado Dinámico
También a partir de Helm 3.2, los plugins pueden proporcionar su propio auto-completado dinámico de shell. El auto-completado dinámico de shell es el completado de valores de parámetros o valores de banderas que no pueden definirse por adelantado. Por ejemplo, el completado de los nombres de releases de helm actualmente disponibles en el clúster.
Para que el plugin soporte el completado dinámico, debe proporcionar un archivo
ejecutable llamado plugin.complete en su directorio raíz. Cuando el script
de completado de Helm requiere completados dinámicos para el plugin, ejecutará
el archivo plugin.complete, pasándole la línea de comandos que necesita ser
completada. El ejecutable plugin.complete deberá tener la lógica para determinar
cuáles son las opciones de completado apropiadas y enviarlas a la salida estándar
para ser consumidas por el script de completado de Helm.
El archivo plugin.complete es completamente opcional. Si no se proporciona,
Helm simplemente no proporcionará auto-completado dinámico para el plugin.
Además, agregar un archivo plugin.complete es compatible con versiones anteriores
y no afectará el comportamiento del plugin cuando se usen versiones anteriores
de helm.
La salida del script plugin.complete debe ser una lista separada por nuevas
líneas como:
rel1
rel2
rel3
Cuando se llama a plugin.complete, el entorno del plugin se configura igual que
cuando se llama al script principal del plugin. Por lo tanto, las variables
$HELM_NAMESPACE, $HELM_KUBECONTEXT y todas las demás variables del plugin ya
estarán configuradas, y sus banderas globales correspondientes habrán sido
eliminadas.
El archivo plugin.complete puede estar en cualquier forma ejecutable; puede ser
un script de shell, un programa Go o cualquier otro tipo de programa que Helm
pueda ejecutar. El archivo plugin.complete debe tener permisos de
ejecución para el usuario. El archivo plugin.complete debe salir con un
código de éxito (valor 0).
En algunos casos, el completado dinámico requerirá obtener información del clúster
de Kubernetes. Por ejemplo, el plugin helm fullstatus requiere un nombre de
release como entrada. En el plugin fullstatus, para que su script
plugin.complete proporcione completado para los nombres de releases actuales,
simplemente puede ejecutar helm list -q y mostrar el resultado.
Si se desea usar el mismo ejecutable para la ejecución del plugin y para el
completado del plugin, el script plugin.complete puede configurarse para llamar
al ejecutable principal del plugin con algún parámetro o bandera especial; cuando
el ejecutable principal del plugin detecte el parámetro o bandera especial, sabrá
que debe ejecutar el completado. En nuestro ejemplo, plugin.complete podría
implementarse así:
#!/usr/bin/env sh
# "$@" is the entire command-line that requires completion.
# It is important to double-quote the "$@" variable to preserve a possibly empty last parameter.
$HELM_PLUGIN_DIR/status.sh --complete "$@"
El script real del plugin fullstatus (status.sh) debe entonces buscar la
bandera --complete y, si la encuentra, mostrar los completados apropiados.
Consejos y Trucos
- El shell filtrará automáticamente las opciones de completado que no coincidan
con la entrada del usuario. Por lo tanto, un plugin puede devolver todos los
completados relevantes sin eliminar los que no coinciden con la entrada del
usuario. Por ejemplo, si la línea de comandos es
helm fullstatus ngin<TAB>, el scriptplugin.completepuede mostrar todos los nombres de releases (del namespacedefault), no solo los que comienzan conngin; el shell solo mantendrá los que comienzan conngin. - Para simplificar el soporte de completado dinámico, especialmente si tiene un
plugin complejo, puede hacer que su script
plugin.completellame a su script principal del plugin y solicite opciones de completado. Consulte la sección Completado Dinámico anterior para ver un ejemplo. - Para depurar el completado dinámico y el archivo
plugin.complete, puede ejecutar lo siguiente para ver los resultados de completado:helm __complete <pluginName> <arguments to complete>. Por ejemplo:helm __complete fullstatus --output js<ENTER>,helm __complete fullstatus -o json ""<ENTER>