Guia de Plugins do Helm
Um plugin do Helm é uma ferramenta que pode ser acessada através da CLI helm,
mas que não faz parte do código-base principal do Helm.
Plugins existentes podem ser encontrados na seção relacionados ou pesquisando no GitHub.
Este guia explica como usar e criar plugins.
Visão Geral
Plugins do Helm são ferramentas complementares que se integram perfeitamente com o Helm. Eles fornecem uma maneira de estender o conjunto de recursos principais do Helm, sem exigir que cada novo recurso seja escrito em Go e adicionado à ferramenta principal.
Plugins do Helm têm as seguintes características:
- Podem ser adicionados e removidos de uma instalação do Helm sem impactar a ferramenta principal.
- Podem ser escritos em qualquer linguagem de programação.
- Integram-se com o Helm e aparecem em
helm helpe outros locais.
Plugins do Helm ficam em $HELM_PLUGINS. Você pode encontrar o valor atual
desta variável, incluindo o valor padrão quando não definida no ambiente,
usando o comando helm env.
O modelo de plugins do Helm é parcialmente baseado no modelo de plugins do Git.
Por isso, você pode às vezes ouvir o helm ser referido como a camada
porcelain, com os plugins sendo a plumbing. Isso significa que o Helm
fornece a interface de alto nível para o usuário, enquanto os plugins realizam o
"trabalho pesado" de executar ações específicas.
Instalando um Plugin
Plugins são instalados usando o comando $ helm plugin install <path|url>. Você
pode passar um caminho para um plugin no seu sistema de arquivos local ou uma
URL de um repositório VCS remoto. O comando helm plugin install clona ou copia
o plugin do caminho/URL fornecido para $HELM_PLUGINS. Se você estiver
instalando a partir de um VCS, pode especificar a versão com o argumento
--version.
$ helm plugin install https://github.com/adamreese/helm-env
Se você tiver uma distribuição tar de um plugin, extraia o plugin no diretório
$HELM_PLUGINS. Você também pode instalar plugins tarball diretamente de uma
URL usando helm plugin install https://domain/path/to/plugin.tar.gz
Estrutura de Arquivos do Plugin
De muitas formas, um plugin é semelhante a um chart. Cada plugin tem um
diretório de nível superior contendo um arquivo plugin.yaml. Arquivos
adicionais podem estar presentes, mas apenas o arquivo plugin.yaml é
obrigatório.
$HELM_PLUGINS/
|- last/
|- plugin.yaml
O Arquivo plugin.yaml
O arquivo plugin.yaml é obrigatório para um plugin. Ele contém os seguintes 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
O Campo name
O name é o nome do plugin. Quando o Helm executa este plugin, este é o nome
que ele usará (por exemplo, helm NAME invocará este plugin).
name deve corresponder ao nome do diretório. No nosso exemplo acima, isso
significa que o plugin com name: last deve estar contido em um diretório
chamado last.
Restrições em name:
namenão pode duplicar um dos comandos de nível superior existentes dohelm.namedeve ser restrito aos caracteres ASCII a-z, A-Z, 0-9,_e-.
O Campo version
O version é a versão SemVer 2 do plugin. usage e description são ambos
usados para gerar o texto de ajuda de um comando.
O Campo ignoreFlags
A opção ignoreFlags diz ao Helm para não passar flags para o plugin. Então,
se um plugin for chamado com helm myplugin --foo e ignoreFlags: true, então
--foo é silenciosamente descartado.
O Campo platformCommand
O platformCommand configura o comando que o plugin executará quando for
chamado. Você não pode definir tanto platformCommand quanto command, pois
isso resultará em um erro. As seguintes regras se aplicam na decisão de qual
comando usar:
- Se
platformCommandestiver presente, ele será usado.- Se tanto
osquantoarchcorresponderem à plataforma atual, a busca parará e o comando será usado. - Se
oscorresponder earchestiver vazio, o comando será usado. - Se
osearchestiverem ambos vazios, o comando será usado. - Se não houver correspondência, o Helm sairá com um erro.
- Se tanto
- Se
platformCommandnão estiver presente e ocommanddepreciado estiver presente, ele será usado.- Se o comando estiver vazio, o Helm sairá com um erro.
O Campo platformHooks
O platformHooks configura os comandos que o plugin executará para eventos de
ciclo de vida. Você não pode definir tanto platformHooks quanto hooks, pois
isso resultará em um erro. As seguintes regras se aplicam na decisão de qual
comando de hook usar:
- Se
platformHooksestiver presente, ele será usado e os comandos para o evento de ciclo de vida serão processados.- Se tanto
osquantoarchcorresponderem à plataforma atual, a busca parará e o comando será usado. - Se
oscorresponder earchestiver vazio, o comando será usado. - Se
osearchestiverem ambos vazios, o comando será usado. - Se não houver correspondência, o Helm pulará o evento.
- Se tanto
- Se
platformHooksnão estiver presente e ohooksdepreciado estiver presente, o comando para o evento de ciclo de vida será usado.- Se o comando estiver vazio, o Helm pulará o evento.
Construindo um Plugin
Aqui está o YAML do plugin para um plugin simples que ajuda a obter o nome do ú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
Plugins podem requerer scripts e executáveis adicionais. Scripts podem ser incluídos no diretório do plugin e executáveis podem ser baixados via hook. O seguinte é um exemplo 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
Variáveis de ambiente são interpoladas antes do plugin ser executado. O padrão acima ilustra a maneira preferida de indicar onde o programa do plugin está localizado.
Comandos de Plugin
Existem algumas estratégias para trabalhar com comandos de plugin:
- Se um plugin inclui um executável, o executável para um
platformCommand:ou deve ser empacotado no diretório do plugin ou instalado via hook. - A linha
platformCommand:oucommand:terá quaisquer variáveis de ambiente expandidas antes da execução.$HELM_PLUGIN_DIRapontará para o diretório do plugin. - O comando em si não é executado em um shell. Então você não pode colocar um script shell em uma linha.
- O Helm injeta muitas configurações em variáveis de ambiente. Examine o ambiente para ver quais informações estão disponíveis.
- O Helm não faz suposições sobre a linguagem do plugin. Você pode escrevê-lo na linguagem que preferir.
- Comandos são responsáveis por implementar texto de ajuda específico para
-he--help. O Helm usaráusageedescriptionparahelm helpehelm help myplugin, mas não trataráhelm myplugin --help.
Testando um Plugin Local
Primeiro você precisa encontrar o caminho do seu HELM_PLUGINS. Para isso,
execute o seguinte comando:
helm env
Mude seu diretório atual para o diretório definido em HELM_PLUGINS.
Agora você pode adicionar um link simbólico para a saída de build do seu plugin.
Neste exemplo, fizemos isso para o mapkubeapis.
ln -s ~/GitHub/helm-mapkubeapis ./helm-mapkubeapis
Plugins de Download
Por padrão, o Helm pode baixar Charts usando HTTP/S. A partir do Helm 2.4.0, plugins podem ter uma capacidade especial de baixar Charts de fontes arbitrárias.
Plugins devem declarar esta capacidade especial no arquivo plugin.yaml (nível
superior):
downloaders:
- command: "bin/mydownloader"
protocols:
- "myprotocol"
- "myprotocols"
Se tal plugin for instalado, o Helm pode interagir com o repositório usando o
esquema de protocolo especificado, invocando o command. O repositório especial
deve ser adicionado de forma similar aos regulares:
helm repo add favorite myprotocol://example.com/. As regras para repositórios
especiais são as mesmas dos regulares: o Helm deve ser capaz de baixar o arquivo
index.yaml para descobrir e armazenar em cache a lista de Charts disponíveis.
O comando definido será invocado com o seguinte esquema:
command certFile keyFile caFile full-URL. As credenciais SSL vêm da definição
do repositório, armazenadas em $HELM_REPOSITORY_CONFIG (ou seja,
$HELM_CONFIG_HOME/repositories.yaml). Um plugin de download deve enviar o
conteúdo bruto para stdout e reportar erros em stderr.
O comando de download também suporta subcomandos ou argumentos, permitindo que
você especifique, por exemplo, bin/mydownloader subcommand -d no
plugin.yaml. Isso é útil se você quiser usar o mesmo executável para o comando
principal do plugin e o comando de download, mas com um subcomando diferente
para cada um.
Variáveis de Ambiente
Quando o Helm executa um plugin, ele passa o ambiente externo para o plugin e também injeta algumas variáveis de ambiente adicionais.
Variáveis como KUBECONFIG são definidas para o plugin se estiverem definidas
no ambiente externo.
As seguintes variáveis são garantidas de estar definidas:
HELM_PLUGINS: O caminho para o diretório de plugins.HELM_PLUGIN_NAME: O nome do plugin, como invocado pelohelm. Entãohelm myplugterá o nome curtomyplug.HELM_PLUGIN_DIR: O diretório que contém o plugin.HELM_BIN: O caminho para o comandohelm(como executado pelo usuário).HELM_DEBUG: Indica se a flag de debug foi definida pelo helm.HELM_REGISTRY_CONFIG: A localização para a configuração do registro (se usado). Note que o uso do Helm com registros é um recurso experimental.HELM_REPOSITORY_CACHE: O caminho para os arquivos de cache do repositório.HELM_REPOSITORY_CONFIG: O caminho para o arquivo de configuração do repositório.HELM_NAMESPACE: O namespace dado ao comandohelm(geralmente usando a flag-n).HELM_KUBECONTEXT: O nome do contexto de configuração do Kubernetes dado ao comandohelm.
Além disso, se um arquivo de configuração do Kubernetes foi especificado
explicitamente, ele será definido como a variável KUBECONFIG.
Uma Nota sobre Processamento de Flags
Ao executar um plugin, o Helm processa as flags globais para seu próprio uso. Nenhuma dessas flags é passada para o plugin.
--burst-limit: Convertido para$HELM_BURST_LIMIT--debug: Se especificado,$HELM_DEBUGé definido como1--kube-apiserver: Convertido para$HELM_KUBEAPISERVER--kube-as-group: Convertido para$HELM_KUBEASGROUPS--kube-as-user: Convertido para$HELM_KUBEASUSER--kube-ca-file: Convertido para$HELM_KUBECAFILE--kube-context: Convertido para$HELM_KUBECONTEXT--kube-insecure-skip-tls-verify: Convertido para$HELM_KUBEINSECURE_SKIP_TLS_VERIFY--kube-tls-server-name: Convertido para$HELM_KUBETLS_SERVER_NAME--kube-token: Convertido para$HELM_KUBETOKEN--kubeconfig: Convertido para$KUBECONFIG--namespacee-n: Convertido para$HELM_NAMESPACE--qps: Convertido para$HELM_QPS--registry-config: Convertido para$HELM_REGISTRY_CONFIG--repository-cache: Convertido para$HELM_REPOSITORY_CACHE--repository-config: Convertido para$HELM_REPOSITORY_CONFIG
Plugins devem exibir texto de ajuda e então sair para -h e --help. Em
todos os outros casos, plugins podem usar flags conforme apropriado.
Fornecendo Auto-Completação de Shell
A partir do Helm 3.2, um plugin pode opcionalmente fornecer suporte para auto-completação de shell como parte do mecanismo de auto-completação existente do Helm.
Auto-Completação Estática
Se um plugin fornece suas próprias flags e/ou subcomandos, ele pode informar o
Helm sobre eles tendo um arquivo completion.yaml localizado no diretório raiz
do plugin. O arquivo completion.yaml tem a seguinte 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 as seções são opcionais, mas devem ser fornecidas se aplicável.
- Flags não devem incluir o prefixo
-ou--. - Tanto flags curtas quanto longas podem e devem ser especificadas. Uma flag curta não precisa estar associada à sua forma longa correspondente, mas ambas as formas devem ser listadas.
- Flags não precisam estar ordenadas de nenhuma forma, mas precisam estar listadas no ponto correto na hierarquia de subcomandos do arquivo.
- As flags globais existentes do Helm já são tratadas pelo mecanismo de
auto-completação do Helm, portanto os plugins não precisam especificar as
seguintes flags:
--debug,--namespaceou-n,--kube-contexte--kubeconfig, ou qualquer outra flag global. - A lista
validArgsfornece uma lista estática de possíveis completações para o primeiro parâmetro após um subcomando. Nem sempre é possível fornecer tal lista antecipadamente (veja a seção Completação Dinâmica abaixo), caso em que a seçãovalidArgspode ser omitida.
O arquivo completion.yaml é totalmente opcional. Se não for fornecido, o Helm
simplesmente não fornecerá auto-completação de shell para o plugin (a menos que
Completação Dinâmica seja suportada pelo plugin). Além
disso, adicionar um arquivo completion.yaml é retrocompatível e não impactará
o comportamento do plugin ao usar versões mais antigas do Helm.
Como exemplo, para o plugin
fullstatus que não tem
subcomandos mas aceita as mesmas flags que o comando helm status, o arquivo
completion.yaml é:
name: fullstatus
flags:
- o
- output
- revision
Um exemplo mais elaborado para o plugin
2to3, tem um arquivo 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
Completação Dinâmica
Também a partir do Helm 3.2, plugins podem fornecer sua própria auto-completação dinâmica de shell. Auto-completação dinâmica de shell é a completação de valores de parâmetros ou valores de flags que não podem ser definidos antecipadamente. Por exemplo, completação dos nomes de releases do Helm atualmente disponíveis no cluster.
Para que o plugin suporte completação dinâmica, ele deve fornecer um arquivo
executável chamado plugin.complete em seu diretório raiz. Quando o script
de completação do Helm requer completações dinâmicas para o plugin, ele
executará o arquivo plugin.complete, passando a linha de comando que precisa
ser completada. O executável plugin.complete precisará ter a lógica para
determinar quais são as escolhas de completação adequadas e exibi-las na saída
padrão para serem consumidas pelo script de completação do Helm.
O arquivo plugin.complete é totalmente opcional. Se não for fornecido, o Helm
simplesmente não fornecerá auto-completação dinâmica para o plugin. Além disso,
adicionar um arquivo plugin.complete é retrocompatível e não impactará o
comportamento do plugin ao usar versões mais antigas do Helm.
A saída do script plugin.complete deve ser uma lista separada por novas linhas
como:
rel1
rel2
rel3
Quando plugin.complete é chamado, o ambiente do plugin é configurado da mesma
forma que quando o script principal do plugin é chamado. Portanto, as variáveis
$HELM_NAMESPACE, $HELM_KUBECONTEXT e todas as outras variáveis do plugin já
estarão definidas, e suas flags globais correspondentes terão sido removidas.
O arquivo plugin.complete pode estar em qualquer forma executável; pode ser um
script shell, um programa Go, ou qualquer outro tipo de programa que o Helm
possa executar. O arquivo plugin.complete deve ter permissões de
execução para o usuário. O arquivo plugin.complete deve sair com um
código de sucesso (valor 0).
Em alguns casos, a completação dinâmica precisará obter informações do cluster
Kubernetes. Por exemplo, o plugin helm fullstatus requer um nome de release
como entrada. No plugin fullstatus, para que seu script plugin.complete
forneça completação para nomes de releases atuais, ele pode simplesmente
executar helm list -q e exibir o resultado.
Se for desejado usar o mesmo executável para execução do plugin e para
completação do plugin, o script plugin.complete pode ser feito para chamar o
executável principal do plugin com algum parâmetro ou flag especial; quando o
executável principal do plugin detectar o parâmetro ou flag especial, ele saberá
que deve executar a completação. No nosso exemplo, plugin.complete poderia ser
implementado assim:
#!/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 "$@"
O script real do plugin fullstatus (status.sh) deve então procurar pela flag
--complete e, se encontrada, exibir as completações adequadas.
Dicas e Truques
- O shell filtrará automaticamente escolhas de completação que não correspondam
à entrada do usuário. Um plugin pode, portanto, retornar todas as completações
relevantes sem remover as que não correspondem à entrada do usuário. Por
exemplo, se a linha de comando for
helm fullstatus ngin<TAB>, o scriptplugin.completepode exibir todos os nomes de releases (do namespacedefault), não apenas os que começam comngin; o shell reterá apenas os que começam comngin. - Para simplificar o suporte à completação dinâmica, especialmente se você
tiver um plugin complexo, você pode fazer seu script
plugin.completechamar seu script principal do plugin e solicitar escolhas de completação. Veja a seção Completação Dinâmica acima para um exemplo. - Para depurar a completação dinâmica e o arquivo
plugin.complete, você pode executar o seguinte para ver os resultados de completação:helm __complete <pluginName> <arguments to complete>. Por exemplo:helm __complete fullstatus --output js<ENTER>,helm __complete fullstatus -o json ""<ENTER>