Charts
O Helm usa um formato de empacotamento chamado charts. Um chart é uma coleção de arquivos que descrevem um conjunto relacionado de recursos do Kubernetes. Um único chart pode ser usado para implantar algo simples, como um pod do memcached, ou algo complexo, como uma pilha completa de aplicação web com servidores HTTP, bancos de dados, caches e assim por diante.
Os charts são criados como arquivos organizados em uma estrutura de diretórios específica. Eles podem ser empacotados em arquivos compactados versionados para serem implantados.
Se você deseja baixar e examinar os arquivos de um chart publicado, sem
instalá-lo, você pode fazer isso com helm pull chartrepo/chartname.
Este documento explica o formato de chart e fornece orientações básicas para criar charts com o Helm.
A Estrutura de Arquivos do Chart
Um chart é organizado como uma coleção de arquivos dentro de um diretório. O
nome do diretório é o nome do chart (sem informações de versão). Assim, um chart
que descreve o WordPress seria armazenado em um diretório wordpress/.
Dentro deste diretório, o Helm espera uma estrutura que corresponda a isto:
wordpress/
Chart.yaml # Um arquivo YAML contendo informações sobre o chart
LICENSE # OPCIONAL: Um arquivo de texto simples contendo a licença do chart
README.md # OPCIONAL: Um arquivo README legível
values.yaml # Os valores de configuração padrão para este chart
values.schema.json # OPCIONAL: Um JSON Schema para impor uma estrutura ao arquivo values.yaml
charts/ # Um diretório contendo quaisquer charts dos quais este chart depende.
crds/ # Custom Resource Definitions
templates/ # Um diretório de templates que, quando combinados com values,
# irão gerar arquivos de manifesto Kubernetes válidos.
templates/NOTES.txt # OPCIONAL: Um arquivo de texto simples contendo notas de uso breves
O Helm reserva o uso dos diretórios charts/, crds/ e templates/, e dos
nomes de arquivos listados. Outros arquivos serão deixados como estão.
O Arquivo Chart.yaml
O arquivo Chart.yaml é obrigatório para um chart. Ele contém os seguintes
campos:
apiVersion: A versão da API do chart (obrigatório)
name: O nome do chart (obrigatório)
version: A versão do chart (obrigatório)
kubeVersion: Um intervalo SemVer de versões compatíveis do Kubernetes (opcional)
description: Uma descrição de uma frase deste projeto (opcional)
type: O tipo do chart (opcional)
keywords:
- Uma lista de palavras-chave sobre este projeto (opcional)
home: A URL da página inicial deste projeto (opcional)
sources:
- Uma lista de URLs para o código-fonte deste projeto (opcional)
dependencies: # Uma lista das dependências do chart (opcional)
- name: O nome do chart (nginx)
version: A versão do chart ("1.2.3")
repository: (opcional) A URL do repositório ("https://example.com/charts") ou alias ("@repo-name")
condition: (opcional) Um caminho yaml que resolve para um booleano, usado para habilitar/desabilitar charts (ex: subchart1.enabled)
tags: # (opcional)
- Tags podem ser usadas para agrupar charts para habilitar/desabilitar juntos
import-values: # (opcional)
- ImportValues contém o mapeamento de valores de origem para a chave pai a ser importada. Cada item pode ser uma string ou par de itens de sublista filho/pai.
alias: (opcional) Alias a ser usado para o chart. Útil quando você precisa adicionar o mesmo chart várias vezes
maintainers: # (opcional)
- name: O nome do mantenedor (obrigatório para cada mantenedor)
email: O email do mantenedor (opcional para cada mantenedor)
url: Uma URL para o mantenedor (opcional para cada mantenedor)
icon: Uma URL para uma imagem SVG ou PNG para ser usada como ícone (opcional).
appVersion: A versão da aplicação que este contém (opcional). Não precisa ser SemVer. Aspas recomendadas.
deprecated: Se este chart está obsoleto (opcional, booleano)
annotations:
example: Uma lista de anotações identificadas por nome (opcional).
A partir da v3.3.2, campos
adicionais não são permitidos. A abordagem recomendada é adicionar metadados
personalizados em annotations.
Charts e Versionamento
Cada chart deve ter um número de versão. Uma versão deve seguir o padrão SemVer 2, mas não é rigorosamente obrigatório. Diferente do Helm Classic, o Helm v2 e posteriores usam números de versão como marcadores de release. Pacotes em repositórios são identificados por nome mais versão.
Por exemplo, um chart nginx cujo campo de versão é definido como version: 1.2.3 será nomeado:
nginx-1.2.3.tgz
Nomes SemVer 2 mais complexos também são suportados, como version: 1.2.3-alpha.1+ef365. Mas nomes não-SemVer são explicitamente proibidos pelo
sistema. Exceções são feitas para versões no formato x ou x.y. Por exemplo,
se houver um v inicial ou uma versão listada sem todas as 3 partes (ex: v1.2),
o sistema tentará convertê-la para uma versão semântica válida (ex: v1.2.0).
NOTA: Enquanto o Helm Classic e o Deployment Manager eram muito orientados ao GitHub quando se tratava de charts, o Helm v2 e posteriores não dependem ou exigem GitHub ou mesmo Git. Consequentemente, ele não usa Git SHAs para versionamento.
O campo version dentro do Chart.yaml é usado por muitas ferramentas do Helm,
incluindo a CLI. Ao gerar um pacote, o comando helm package usará a versão que
encontrar no Chart.yaml como um token no nome do pacote. O sistema assume que
o número da versão no nome do pacote do chart corresponde ao número da versão no
Chart.yaml. Se essa condição não for atendida, ocorrerá um erro.
O Campo apiVersion
O campo apiVersion deve ser v2 para charts Helm que requerem pelo menos Helm
3. Charts que suportam versões anteriores do Helm têm um apiVersion definido
como v1 e ainda são instaláveis pelo Helm 3.
Mudanças de v1 para v2:
- Um campo
dependenciesdefinindo dependências do chart, que estavam localizadas em um arquivorequirements.yamlseparado para chartsv1(veja Dependências do Chart). - O campo
type, discriminando charts de aplicação e biblioteca (veja Tipos de Chart).
O Campo appVersion
Note que o campo appVersion não está relacionado ao campo version. É uma
forma de especificar a versão da aplicação. Por exemplo, o chart drupal pode
ter um appVersion: "8.2.1", indicando que a versão do Drupal incluída no chart
(por padrão) é 8.2.1. Este campo é informativo e não tem impacto nos cálculos
de versão do chart. Colocar a versão entre aspas é altamente recomendado. Isso
força o parser YAML a tratar o número da versão como uma string. Deixá-lo sem
aspas pode levar a problemas de parsing em alguns casos. Por exemplo, o YAML
interpreta 1.0 como um valor de ponto flutuante, e um SHA de commit git como
1234e10 como notação científica.
A partir do Helm v3.5.0, helm create coloca o campo appVersion padrão entre
aspas.
O Campo kubeVersion
O campo opcional kubeVersion pode definir restrições semver em versões
suportadas do Kubernetes. O Helm validará as restrições de versão ao instalar o
chart e falhará se o cluster executar uma versão não suportada do Kubernetes.
As restrições de versão podem incluir comparações AND separadas por espaços como
>= 1.13.0 < 1.15.0
que podem ser combinadas com o operador OR || como no exemplo a seguir
>= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0
Neste exemplo, a versão 1.14.0 é excluída, o que pode fazer sentido se um bug
em certas versões é conhecido por impedir o funcionamento adequado do chart.
Além das restrições de versão usando operadores = != > < >= <=, as
seguintes notações abreviadas são suportadas:
- intervalos com hífen para intervalos fechados, onde
1.1 - 2.3.4é equivalente a>= 1.1 <= 2.3.4. - curingas
x,Xe*, onde1.2.xé equivalente a>= 1.2.0 < 1.3.0. - intervalos til (mudanças de versão patch permitidas), onde
~1.2.3é equivalente a>= 1.2.3 < 1.3.0. - intervalos circunflexo (mudanças de versão minor permitidas), onde
^1.2.3é equivalente a>= 1.2.3 < 2.0.0.
Para uma explicação detalhada das restrições semver suportadas, veja Masterminds/semver.
Descontinuando Charts
Ao gerenciar charts em um Repositório de Charts, às vezes é necessário
descontinuar um chart. O campo opcional deprecated no Chart.yaml pode ser
usado para marcar um chart como descontinuado. Se a última versão de um
chart no repositório estiver marcada como descontinuada, então o chart como um
todo é considerado descontinuado. O nome do chart pode ser reutilizado
posteriormente publicando uma versão mais nova que não esteja marcada como
descontinuada. O fluxo de trabalho para descontinuar charts é:
- Atualizar o
Chart.yamldo chart para marcá-lo como descontinuado, incrementando a versão - Publicar a nova versão do chart no Repositório de Charts
- Remover o chart do repositório de código-fonte (ex: git)
Tipos de Chart
O campo type define o tipo do chart. Existem dois tipos: application e
library. Application é o tipo padrão e é o chart padrão que pode ser operado
completamente. O chart de biblioteca fornece
utilitários ou funções para o construtor do chart. Um chart de biblioteca
difere de um chart de aplicação porque não é instalável e geralmente não contém
objetos de recursos.
Nota: Um chart de aplicação pode ser usado como um chart de biblioteca. Isso
é habilitado definindo o tipo como library. O chart será então renderizado
como um chart de biblioteca onde todos os utilitários e funções podem ser
aproveitados. Todos os objetos de recursos do chart não serão renderizados.
Chart LICENSE, README e NOTES
Os charts também podem conter arquivos que descrevem a instalação, configuração, uso e licença de um chart.
Uma LICENSE é um arquivo de texto simples contendo a licença do chart. O chart pode conter uma licença pois pode ter lógica de programação nos templates e, portanto, não seria apenas configuração. Também pode haver licença(s) separadas para a aplicação instalada pelo chart, se necessário.
Um README para um chart deve ser formatado em Markdown (README.md), e geralmente deve conter:
- Uma descrição da aplicação ou serviço que o chart fornece
- Quaisquer pré-requisitos ou requisitos para executar o chart
- Descrições das opções em
values.yamle valores padrão - Qualquer outra informação que possa ser relevante para a instalação ou configuração do chart
Quando hubs e outras interfaces de usuário exibem detalhes sobre um chart, esses
detalhes são extraídos do conteúdo do arquivo README.md.
O chart também pode conter um breve arquivo de texto simples
templates/NOTES.txt que será impresso após a instalação e ao visualizar o
status de uma release. Este arquivo é avaliado como um
template, e pode ser usado para exibir notas de uso,
próximos passos ou qualquer outra informação relevante para uma release do
chart. Por exemplo, instruções podem ser fornecidas para conectar a um banco de
dados ou acessar uma interface web. Como este arquivo é impresso no STDOUT ao
executar helm install ou helm status, é recomendado manter o conteúdo breve
e apontar para o README para mais detalhes.
Dependências do Chart
No Helm, um chart pode depender de qualquer número de outros charts. Essas
dependências podem ser vinculadas dinamicamente usando o campo dependencies no
Chart.yaml ou trazidas para o diretório charts/ e gerenciadas manualmente.
Gerenciando Dependências com o campo dependencies
Os charts requeridos pelo chart atual são definidos como uma lista no campo
dependencies.
dependencies:
- name: apache
version: 1.2.3
repository: https://example.com/charts
- name: mysql
version: 3.2.1
repository: https://another.example.com/charts
- O campo
nameé o nome do chart que você deseja. - O campo
versioné a versão do chart que você deseja. - O campo
repositoryé a URL completa para o repositório de charts. Note que você também deve usarhelm repo addpara adicionar esse repositório localmente. - Você pode usar o nome do repositório em vez da URL
$ helm repo add fantastic-charts https://charts.helm.sh/incubator
dependencies:
- name: awesomeness
version: 1.0.0
repository: "@fantastic-charts"
Depois de definir as dependências, você pode executar helm dependency update e
ele usará seu arquivo de dependências para baixar todos os charts especificados
para o seu diretório charts/.
$ 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
Quando helm dependency update obtém os charts, ele os armazenará como arquivos
compactados de chart no diretório charts/. Então, para o exemplo acima, seria
esperado ver os seguintes arquivos no diretório charts:
charts/
apache-1.2.3.tgz
mysql-3.2.1.tgz
Campo alias em dependencies
Além dos outros campos acima, cada entrada de requisitos pode conter o campo
opcional alias.
Adicionar um alias para um chart de dependência colocaria um chart nas dependências usando o alias como nome da nova dependência.
Pode-se usar alias nos casos em que precisam acessar um chart com outro(s)
nome(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
No exemplo acima, teremos 3 dependências no total para parentchart:
subchart
new-subchart-1
new-subchart-2
A forma manual de conseguir isso é copiar/colar o mesmo chart no diretório
charts/ várias vezes com nomes diferentes.
Campos Tags e Condition em dependencies
Além dos outros campos acima, cada entrada de requisitos pode conter os campos
opcionais tags e condition.
Todos os charts são carregados por padrão. Se os campos tags ou condition
estiverem presentes, eles serão avaliados e usados para controlar o carregamento
do(s) chart(s) aos quais são aplicados.
Condition - O campo condition contém um ou mais caminhos YAML (delimitados por vírgulas). Se este caminho existir nos values do pai de nível superior e resolver para um valor booleano, o chart será habilitado ou desabilitado com base nesse valor booleano. Apenas o primeiro caminho válido encontrado na lista é avaliado e se nenhum caminho existir, então a condição não tem efeito.
Tags - O campo tags é uma lista YAML de rótulos para associar com este chart. Nos values do pai de nível superior, todos os charts com tags podem ser habilitados ou desabilitados especificando a tag e um 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
No exemplo acima, todos os charts com a tag front-end seriam desabilitados,
mas como o caminho subchart1.enabled avalia para 'true' nos values do pai, a
condição sobrescreverá a tag front-end e subchart1 será habilitado.
Como subchart2 está marcado com back-end e essa tag avalia para true,
subchart2 será habilitado. Note também que embora subchart2 tenha uma
condição especificada, não há caminho e valor correspondente nos values do pai,
então essa condição não tem efeito.
Usando a CLI com Tags e Conditions
O parâmetro --set pode ser usado como de costume para alterar valores de tags
e conditions.
helm install --set tags.front-end=true --set subchart2.enabled=false
Resolução de Tags e Condition
- Conditions (quando definidas em values) sempre sobrescrevem tags. O primeiro caminho de condition que existir vence e os subsequentes para esse chart são ignorados.
- Tags são avaliadas como 'se qualquer uma das tags do chart for true, então habilite o chart'.
- Valores de tags e conditions devem ser definidos nos values do pai de nível superior.
- A chave
tags:nos values deve ser uma chave de nível superior. Globals e tabelastags:aninhadas não são atualmente suportadas.
Importando Child Values via dependencies
Em alguns casos, é desejável permitir que os values de um chart filho se
propaguem para o chart pai e sejam compartilhados como padrões comuns. Um
benefício adicional de usar o formato exports é que ele permitirá que
ferramentas futuras inspecionem valores configuráveis pelo usuário.
As chaves contendo os valores a serem importados podem ser especificadas no
campo import-values nas dependencies do chart pai usando uma lista YAML.
Cada item na lista é uma chave que é importada do campo exports do chart
filho.
Para importar valores não contidos na chave exports, use o formato
child-parent. Exemplos de ambos os formatos
são descritos abaixo.
Usando o formato exports
Se o arquivo values.yaml de um chart filho contiver um campo exports na
raiz, seu conteúdo pode ser importado diretamente para os values do pai
especificando as chaves a importar como no exemplo abaixo:
# parent's Chart.yaml file
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
import-values:
- data
# child's values.yaml file
exports:
data:
myint: 99
Como estamos especificando a chave data em nossa lista de importação, o Helm
procura no campo exports do chart filho pela chave data e importa seu
conteúdo.
Os values finais do pai conteriam nosso campo exportado:
# parent's values
myint: 99
Note que a chave pai data não está contida nos values finais do pai. Se você
precisar especificar a chave pai, use o formato 'child-parent'.
Usando o formato child-parent
Para acessar valores que não estão contidos na chave exports dos values do
chart filho, você precisará especificar a chave de origem dos valores a serem
importados (child) e o caminho de destino nos values do chart pai (parent).
O import-values no exemplo abaixo instrui o Helm a pegar quaisquer valores
encontrados no caminho child: e copiá-los para os values do pai no caminho
especificado em parent:
# parent's Chart.yaml file
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
No exemplo acima, os valores encontrados em default.data nos values do
subchart1 serão importados para a chave myimports nos values do chart pai como
detalhado abaixo:
# parent's values.yaml file
myimports:
myint: 0
mybool: false
mystring: "helm rocks!"
# subchart1's values.yaml file
default:
data:
myint: 999
mybool: true
Os values resultantes do chart pai seriam:
# parent's final values
myimports:
myint: 999
mybool: true
mystring: "helm rocks!"
Os values finais do pai agora contêm os campos myint e mybool importados do
subchart1.
Gerenciando Dependências manualmente via o diretório charts/
Se mais controle sobre as dependências for desejado, essas dependências podem
ser expressas explicitamente copiando os charts de dependência para o diretório
charts/.
Uma dependência deve ser um diretório de chart descompactado, mas seu nome não
pode começar com _ ou .. Tais arquivos são ignorados pelo carregador de
charts.
Por exemplo, se o chart WordPress depende do chart Apache, o chart Apache (da
versão correta) é fornecido no diretório charts/ do chart WordPress:
wordpress:
Chart.yaml
# ...
charts/
apache/
Chart.yaml
# ...
mysql/
Chart.yaml
# ...
O exemplo acima mostra como o chart WordPress expressa sua dependência do Apache
e MySQL incluindo esses charts dentro de seu diretório charts/.
DICA: Para colocar uma dependência em seu diretório charts/, use o
comando helm pull
Aspectos operacionais do uso de dependências
As seções acima explicam como especificar dependências de charts, mas como isso
afeta a instalação de charts usando helm install e helm upgrade?
Suponha que um chart chamado "A" crie os seguintes objetos Kubernetes
- namespace "A-Namespace"
- statefulset "A-StatefulSet"
- service "A-Service"
Além disso, A é dependente do chart B que cria os objetos
- namespace "B-Namespace"
- replicaset "B-ReplicaSet"
- service "B-Service"
Após a instalação/atualização do chart A, uma única release Helm é criada/modificada. A release criará/atualizará todos os objetos Kubernetes acima na seguinte ordem:
- A-Namespace
- B-Namespace
- A-Service
- B-Service
- B-ReplicaSet
- A-StatefulSet
Isso ocorre porque quando o Helm instala/atualiza charts, os objetos Kubernetes dos charts e todas as suas dependências são
- agregados em um único conjunto; então
- ordenados por tipo seguido de nome; e então
- criados/atualizados nessa ordem.
Portanto, uma única release é criada com todos os objetos do chart e suas dependências.
A ordem de instalação dos tipos Kubernetes é dada pela enumeração InstallOrder em kind_sorter.go (veja o arquivo fonte do Helm).
Templates e Values
Os templates de Chart Helm são escritos na linguagem de template Go, com a adição de 50 ou mais funções de template adicionais da biblioteca Sprig e algumas outras funções especializadas.
Todos os arquivos de template são armazenados na pasta templates/ de um chart.
Quando o Helm renderiza os charts, ele passará cada arquivo nesse diretório pelo
motor de templates.
Os values para os templates são fornecidos de duas formas:
- Desenvolvedores de charts podem fornecer um arquivo chamado
values.yamldentro de um chart. Este arquivo pode conter valores padrão. - Usuários de charts podem fornecer um arquivo YAML que contém values. Isso pode
ser fornecido na linha de comando com
helm install.
Quando um usuário fornece values personalizados, esses valores sobrescreverão os
valores no arquivo values.yaml do chart.
Arquivos de Template
Os arquivos de template seguem as convenções padrão para escrever templates Go (veja a documentação do pacote Go text/template para detalhes). Um exemplo de arquivo de template pode parecer algo assim:
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 }}
O exemplo acima, baseado livremente em
https://github.com/deis/charts, é um template
para um replication controller do Kubernetes. Ele pode usar os seguintes quatro
valores de template (geralmente definidos em um arquivo values.yaml):
imageRegistry: O registro de origem para a imagem Docker.dockerTag: A tag para a imagem docker.pullPolicy: A política de pull do Kubernetes.storage: O backend de armazenamento, cujo padrão é definido como"minio"
Todos esses valores são definidos pelo autor do template. O Helm não requer ou determina parâmetros.
Para ver muitos charts funcionando, confira o Artifact Hub da CNCF.
Values Predefinidos
Values que são fornecidos via um arquivo values.yaml (ou via a flag --set)
são acessíveis a partir do objeto .Values em um template. Mas existem outros
dados predefinidos que você pode acessar em seus templates.
Os seguintes values são predefinidos, estão disponíveis para todo template, e não podem ser sobrescritos. Como todos os values, os nomes diferenciam maiúsculas de minúsculas.
Release.Name: O nome da release (não o chart)Release.Namespace: O namespace em que o chart foi liberado.Release.Service: O serviço que conduziu a release.Release.IsUpgrade: Isso é definido como true se a operação atual for um upgrade ou rollback.Release.IsInstall: Isso é definido como true se a operação atual for uma instalação.Chart: O conteúdo doChart.yaml. Assim, a versão do chart é obtida comoChart.Versione os mantenedores estão emChart.Maintainers.Files: Um objeto semelhante a um mapa contendo todos os arquivos não especiais no chart. Isso não dará acesso a templates, mas dará acesso a arquivos adicionais que estão presentes (a menos que sejam excluídos usando.helmignore). Arquivos podem ser acessados usando{{ index .Files "file.name" }}ou usando a função{{.Files.Get name }}. Você também pode acessar o conteúdo do arquivo como[]byteusando{{ .Files.GetBytes }}Capabilities: Um objeto semelhante a um mapa que contém informações sobre as versões do Kubernetes ({{ .Capabilities.KubeVersion }}) e as versões de API do Kubernetes suportadas ({{ .Capabilities.APIVersions.Has "batch/v1" }})
NOTA: Qualquer campo desconhecido do Chart.yaml será descartado. Eles não
serão acessíveis dentro do objeto Chart. Assim, Chart.yaml não pode ser
usado para passar dados estruturados arbitrariamente para o template. O arquivo
values pode ser usado para isso.
Arquivos de Values
Considerando o template na seção anterior, um arquivo values.yaml que fornece
os valores necessários seria assim:
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"
Um arquivo de values é formatado em YAML. Um chart pode incluir um arquivo
values.yaml padrão. O comando helm install permite que um usuário sobrescreva
valores fornecendo valores YAML adicionais:
$ helm install --generate-name --values=myvals.yaml wordpress
Quando os values são passados desta forma, eles serão mesclados no arquivo de
values padrão. Por exemplo, considere um arquivo myvals.yaml que se parece com
isto:
storage: "gcs"
Quando isso é mesclado com o values.yaml no chart, o conteúdo gerado
resultante será:
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "gcs"
Note que apenas o último campo foi sobrescrito.
NOTA: O arquivo de values padrão incluído dentro de um chart deve ser
nomeado values.yaml. Mas arquivos especificados na linha de comando podem ter
qualquer nome.
NOTA: Se a flag --set for usada em helm install ou helm upgrade, esses
valores são simplesmente convertidos para YAML no lado do cliente.
NOTA: Se existirem entradas obrigatórias no arquivo de values, elas podem ser declaradas como obrigatórias no template do chart usando a função 'required'
Qualquer um desses valores é então acessível dentro de templates usando o 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 }}
Escopo, Dependências e Values
Arquivos de values podem declarar valores para o chart de nível superior, bem
como para qualquer um dos charts que estão incluídos no diretório charts/
desse chart. Ou, para colocar de outra forma, um arquivo de values pode fornecer
valores para o chart assim como para qualquer uma de suas dependências. Por
exemplo, o chart de demonstração WordPress acima tem tanto mysql quanto
apache como dependências. O arquivo de values poderia fornecer valores para
todos esses componentes:
title: "My WordPress Site" # Enviado para o template WordPress
mysql:
max_connections: 100 # Enviado para MySQL
password: "secret"
apache:
port: 8080 # Passado para Apache
Charts de níveis superiores têm acesso a todas as variáveis definidas abaixo.
Então o chart WordPress pode acessar a senha do MySQL como
.Values.mysql.password. Mas charts de níveis inferiores não podem acessar
coisas em charts pais, então MySQL não será capaz de acessar a propriedade
title. Nem, aliás, pode acessar apache.port.
Os values têm namespaces, mas os namespaces são podados. Então para o chart
WordPress, ele pode acessar o campo de senha do MySQL como
.Values.mysql.password. Mas para o chart MySQL, o escopo dos values foi
reduzido e o prefixo de namespace removido, então ele verá o campo password
simplesmente como .Values.password.
Global Values
A partir da versão 2.0.0-Alpha.2, o Helm suporta um "global" value especial. Considere esta versão modificada do exemplo anterior:
title: "My WordPress Site" # Enviado para o template WordPress
global:
app: MyWordPress
mysql:
max_connections: 100 # Enviado para MySQL
password: "secret"
apache:
port: 8080 # Passado para Apache
O acima adiciona uma seção global com o valor app: MyWordPress. Este valor
está disponível para todos os charts como .Values.global.app.
Por exemplo, os templates mysql podem acessar app como {{ .Values.global.app}}, e assim pode o chart apache. Efetivamente, o arquivo de
values acima é regenerado assim:
title: "My WordPress Site" # Enviado para o template WordPress
global:
app: MyWordPress
mysql:
global:
app: MyWordPress
max_connections: 100 # Enviado para MySQL
password: "secret"
apache:
global:
app: MyWordPress
port: 8080 # Passado para Apache
Isso fornece uma maneira de compartilhar uma variável de nível superior com
todos os subcharts, o que é útil para coisas como definir propriedades de
metadata como labels.
Se um subchart declarar uma variável global, essa global será passada para baixo (para os subcharts do subchart), mas não para cima para o chart pai. Não há como um subchart influenciar os values do chart pai.
Além disso, variáveis globais de charts pais têm precedência sobre as variáveis globais de subcharts.
Arquivos de Schema
Às vezes, um mantenedor de chart pode querer definir uma estrutura em seus
values. Isso pode ser feito definindo um schema no arquivo values.schema.json.
Um schema é representado como um JSON Schema. Pode
parecer algo assim:
{
"$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 schema será aplicado aos values para validá-lo. A validação ocorre quando qualquer um dos seguintes comandos é invocado:
helm installhelm upgradehelm linthelm template
Um exemplo de um arquivo values.yaml que atende aos requisitos deste schema
pode parecer algo assim:
name: frontend
protocol: https
port: 443
Note que o schema é aplicado ao objeto .Values final, e não apenas ao arquivo
values.yaml. Isso significa que o seguinte arquivo yaml é válido, dado que o
chart é instalado com a opção --set apropriada mostrada abaixo.
name: frontend
protocol: https
helm install --set port=443
Além disso, o objeto .Values final é verificado contra todos os schemas de
subcharts. Isso significa que restrições em um subchart não podem ser
contornadas por um chart pai. Isso também funciona ao contrário - se um subchart
tem um requisito que não é atendido no arquivo values.yaml do subchart, o
chart pai deve satisfazer essas restrições para ser válido.
A validação de schema pode ser desabilitada definindo a opção mostrada abaixo. Isso é particularmente útil em ambientes air-gapped quando o arquivo JSON Schema de um chart contém referências remotas.
helm install --skip-schema-validation
Referências
Quando se trata de escrever templates, values e arquivos de schema, existem várias referências padrão que ajudarão você.
Custom Resource Definitions (CRDs)
O Kubernetes fornece um mecanismo para declarar novos tipos de objetos Kubernetes. Usando CustomResourceDefinitions (CRDs), desenvolvedores Kubernetes podem declarar tipos de recursos personalizados.
No Helm 3, CRDs são tratados como um tipo especial de objeto. Eles são instalados antes do resto do chart e estão sujeitos a algumas limitações.
Arquivos YAML de CRD devem ser colocados no diretório crds/ dentro de um
chart. Múltiplos CRDs (separados por marcadores de início e fim YAML) podem ser
colocados no mesmo arquivo. O Helm tentará carregar todos os arquivos no
diretório CRD para o Kubernetes.
Arquivos CRD não podem conter templates. Eles devem ser documentos YAML simples.
Quando o Helm instala um novo chart, ele fará upload dos CRDs, pausará até que
os CRDs estejam disponíveis pelo servidor de API, e então iniciará o motor de
templates, renderizará o resto do chart, e fará upload para o Kubernetes. Por
causa dessa ordenação, informações de CRD estão disponíveis no objeto
.Capabilities nos templates Helm, e templates Helm podem criar novas
instâncias de objetos que foram declarados em CRDs.
Por exemplo, se seu chart tiver um CRD para CronTab no diretório crds/, você
pode criar instâncias do kind CronTab no diretório templates/:
crontabs/
Chart.yaml
crds/
crontab.yaml
templates/
mycrontab.yaml
O arquivo crontab.yaml deve conter o CRD sem diretivas de template:
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
Então o template mycrontab.yaml pode criar um novo CronTab (usando templates
como de costume):
apiVersion: stable.example.com
kind: CronTab
metadata:
name: {{ .Values.name }}
spec:
# ...
O Helm garantirá que o kind CronTab foi instalado e está disponível no
servidor de API do Kubernetes antes de prosseguir instalando as coisas em
templates/.
Limitações em CRDs
Diferente da maioria dos objetos no Kubernetes, CRDs são instalados globalmente. Por essa razão, o Helm adota uma abordagem muito cautelosa no gerenciamento de CRDs. CRDs estão sujeitos às seguintes limitações:
- CRDs nunca são reinstalados. Se o Helm determinar que os CRDs no diretório
crds/já estão presentes (independentemente da versão), o Helm não tentará instalar ou atualizar. - CRDs nunca são instalados em upgrade ou rollback. O Helm só criará CRDs em operações de instalação.
- CRDs nunca são deletados. Deletar um CRD automaticamente deleta todo o conteúdo do CRD em todos os namespaces no cluster. Consequentemente, o Helm não deletará CRDs.
Operadores que desejam atualizar ou deletar CRDs são encorajados a fazer isso manualmente e com muito cuidado.
Usando o Helm para Gerenciar Charts
A ferramenta helm tem vários comandos para trabalhar com charts.
Ela pode criar um novo chart para você:
$ helm create mychart
Created mychart/
Uma vez que você tenha editado um chart, helm pode empacotá-lo em um arquivo
compactado de chart para você:
$ helm package mychart
Archived mychart-0.1.-.tgz
Você também pode usar helm para ajudá-lo a encontrar problemas com a
formatação ou informações do seu chart:
$ helm lint mychart
No issues found
Repositórios de Charts
Um repositório de charts é um servidor HTTP que hospeda um ou mais charts
empacotados. Embora helm possa ser usado para gerenciar diretórios de charts
locais, quando se trata de compartilhar charts, o mecanismo preferido é um
repositório de charts.
Qualquer servidor HTTP que pode servir arquivos YAML e tar e pode responder requisições GET pode ser usado como um servidor de repositório. A equipe do Helm testou alguns servidores, incluindo Google Cloud Storage com modo website habilitado, e S3 com modo website habilitado.
Um repositório é caracterizado principalmente pela presença de um arquivo
especial chamado index.yaml que tem uma lista de todos os pacotes fornecidos
pelo repositório, junto com metadados que permitem obter e verificar esses
pacotes.
No lado do cliente, repositórios são gerenciados com os comandos helm repo. No
entanto, o Helm não fornece ferramentas para fazer upload de charts para
servidores de repositório remotos. Isso ocorre porque fazer isso adicionaria
requisitos substanciais a um servidor implementador, e assim aumentaria a
barreira para configurar um repositório.
Chart Starter Packs
O comando helm create aceita uma opção opcional --starter que permite
especificar um "starter chart". A opção starter também tem um alias curto -p.
Exemplos de uso:
helm create my-chart --starter starter-name
helm create my-chart -p starter-name
helm create my-chart -p /absolute/path/to/starter-name
Starters são apenas charts regulares, mas estão localizados em
$XDG_DATA_HOME/helm/starters. Como desenvolvedor de charts, você pode criar
charts que são especificamente projetados para serem usados como starters. Tais
charts devem ser projetados com as seguintes considerações em mente:
- O
Chart.yamlserá sobrescrito pelo gerador. - Os usuários esperarão modificar o conteúdo de tal chart, então a documentação deve indicar como os usuários podem fazer isso.
- Todas as ocorrências de
<CHARTNAME>serão substituídas pelo nome do chart especificado para que starter charts possam ser usados como templates, exceto para alguns arquivos variáveis. Por exemplo, se você usar arquivos personalizados no diretóriovarsou certos arquivosREADME.md,<CHARTNAME>NÃO será substituído dentro deles. Além disso, a descrição do chart não é herdada.
Atualmente, a única maneira de adicionar um chart a $XDG_DATA_HOME/helm/starters
é copiá-lo manualmente para lá. Na documentação do seu chart, você pode querer
explicar esse processo.