Helm charts permitem empacotar aplicações Kubernetes em um bundle conveniente que inclui todos os recursos necessários para implantação e gerenciamento. Charts automatizam a criação, atualização e remoção de aplicações no Kubernetes, tornando a gestão mais simples e flexível.
Para criar um novo chart, use o comando:
helm create <chart_name>
O Helm vai gerar automaticamente uma estrutura de diretórios básica e arquivos contendo os templates e configurações necessários para implantar a aplicação no Kubernetes.
O arquivo principal do chart, que contém metadados: nome, versão, descrição e versão da aplicação. Pode incluir informações de dependências caso a aplicação dependa de outros charts.
Exemplo de uso:
Arquivo com parâmetros padrão usados para definir valores aplicados aos templates do chart, gerando os manifests finais do Kubernetes.
Exemplo de uso:
--set ou arquivo adicional durante a instalação.Diretório contendo templates YAML para arquivos Kubernetes que definem objetos (pods, deployments, services etc.) que serão criados quando o chart for instalado. Templates usam a linguagem Go para gerar dinamicamente manifests com base nos valores do values.yaml.
Exemplo de uso:
deployment.yaml, service.yaml).Diretório para dependências, ou seja, outros charts necessários para a aplicação funcionar. Dependências podem ser instaladas localmente ou baixadas de repositórios remotos.
Exemplo de uso:
Dependências são baixadas com helm dependency update se especificadas no Chart.yaml.
Arquivo que funciona como .gitignore, excluindo arquivos e diretórios ao empacotar o chart em um arquivo tar.
Exemplo de uso:
Exclui arquivos desnecessários (ex.: documentação ou arquivos temporários) do pacote final.
Agora que revisamos a estrutura básica de um chart e a finalidade dos arquivos principais, vamos para um exemplo prático. Vamos criar um chart para implantar NGINX, configurar todos os parâmetros necessários e ver como os templates usam os dados do values.yaml para gerar recursos Kubernetes.
Comece criando a estrutura básica do chart:
helm create nginx-chart
Isso criará o diretório nginx-chart/ com os arquivos básicos.
nginx-chart
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
O Chart.yaml é um elemento chave de qualquer Helm chart. Ele especifica metadados do chart, como nome, versão, descrição e informações sobre dependências.
Exemplo de conteúdo do Chart.yaml para o chart NGINX:
apiVersion: v2
name: nginx-chart
description: A Helm chart for deploying NGINX
version: 0.1.0
appVersion: "1.21.0"
Campos principais:
apiVersion: versão da API do Helm para este chart. Use v2 para charts do Helm 3.name: nome do chart, único no repositório.description: breve descrição do que o chart faz.version: versão do chart. Sempre que fizer alterações no chart, atualize esta versão.appVersion: versão da aplicação (neste caso, NGINX) que será implantada. Não afeta a lógica do Helm, mas ajuda o usuário a identificar a versão instalada.O values.yaml é usado para definir valores padrão de parâmetros que podem ser alterados durante a instalação do chart. Configure assim:
replicaCount: 2
image:
repository: nginx
tag: "1.21.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
serviceAccount:
create: true
name: ""
ingress:
enabled: false
annotations: {}
hosts:
- host: chart-example.local
paths: []
tls: []
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 5
targetCPUUtilizationPercentage: 80
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}
Este arquivo contém as seguintes configurações:
replicaCount: número de réplicas da aplicação.image: configuração da imagem do container NGINX, incluindo versão (tag).service: tipo de serviço e porta de acesso ao NGINX.serviceAccount: cria uma service account para o chart.ingress: parâmetros do Ingress (desativado por padrão).autoscaling: parâmetros de autoscaling (desativado por padrão).Agora vamos configurar os templates na pasta templates/, que usarão os valores do values.yaml.
Template para criar um serviço Kubernetes:
apiVersion: v1
kind: Service
metadata:
name: {{ include "nginx-chart.fullname" . }}
labels:
app: {{ include "nginx-chart.name" . }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: 80
selector:
app: {{ include "nginx-chart.name" . }}
Template para criar um deployment NGINX:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "nginx-chart.fullname" . }}
labels:
app: {{ include "nginx-chart.name" . }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ include "nginx-chart.name" . }}
template:
metadata:
labels:
app: {{ include "nginx-chart.name" . }}
spec:
serviceAccountName: {{ if .Values.serviceAccount.create }}{{ include "nginx-chart.serviceAccountName" . }}{{ else }}{{ .Values.serviceAccount.name }}{{ end }}
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: 80
Template para criar uma service account:
{{- if .Values.serviceAccount.create }}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "nginx-chart.serviceAccountName" . }}
{{- end }}
Verifique o chart em busca de erros:
helm lint ./nginx-chart
Instale o chart:
helm install test-nginx ./nginx-chart
Verifique o status do release:
helm status test-nginx
Verifique o estado dos pods:
kubectl get pods
Quando a aplicação não for mais necessária, pode ser removida:
helm uninstall test-nginx