Capítulo 10.2 - Helm Charts
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Compreender a estrutura de um Chart Helm
- Criar um Chart do zero
- Utilizar templates Go
- Personalizar com values.yaml
- Gerenciar dependências
- Publicar um Chart
Introdução
Um Chart Helm é um pacote que contém todos os arquivos necessários para fazer o deploy de uma aplicação no Kubernetes. Ele utiliza templates para tornar os arquivos YAML dinâmicos.
Estrutura de um Chart
Estrutura Completa
my-chart/
├── Chart.yaml # Metadados do Chart
├── Chart.lock # Lock de dependências
├── values.yaml # Valores padrão
├── values.schema.json # Esquema de validação (opcional)
├── templates/ # Templates Kubernetes
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # Helpers reutilizáveis
│ └── NOTES.txt # Notas exibidas após instalação
├── charts/ # Charts dependentes (opcional)
└── README.md # Documentação
Criar um Chart
Criar um Chart Básico
# Criar um novo Chart
helm create my-chart
# Estrutura criada
my-chart/
├── Chart.yaml
├── values.yaml
└── templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── _helpers.tpl
└── NOTES.txt
Chart.yaml
apiVersion: v2
name: my-chart
description: A Helm chart for my application
type: application
version: 0.1.0
appVersion: "1.0.0"
keywords:
- web
- application
maintainers:
- name: John Doe
email: john@example.com
Templates Go
Sintaxe Básica
Os templates utilizam a sintaxe Go templates:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
Variáveis Disponíveis
.Release.Name: Nome da release.Release.Namespace: Namespace.Chart.Name: Nome do Chart.Values.*: Valores do values.yaml.Capabilities.*: Informações do cluster
values.yaml
Exemplo de values.yaml
# Número de réplicas
replicaCount: 3
# Imagem
image:
repository: nginx
tag: "1.20"
pullPolicy: IfNotPresent
# Service
service:
type: ClusterIP
port: 80
# Ingress
ingress:
enabled: true
className: nginx
hosts:
- host: example.com
paths:
- path: /
pathType: Prefix
tls: []
# Resources
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
Exemplo Completo: Chart Web App
Chart.yaml
apiVersion: v2
name: web-app
description: A simple web application
type: application
version: 0.1.0
appVersion: "1.0.0"
values.yaml
replicaCount: 2
image:
repository: myapp
tag: "1.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8080
ingress:
enabled: true
className: nginx
hosts:
- host: myapp.example.com
paths:
- path: /
pathType: Prefix
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "web-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "web-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 8080
name: http
resources:
{{- toYaml .Values.resources | nindent 10 }}
templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "web-app.selectorLabels" . | nindent 4 }}
templates/_helpers.tpl
{{/*
Labels comuns
*/}}
{{- define "web-app.labels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "web-app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Nome completo
*/}}
{{- define "web-app.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name }}
{{- end }}
Instalação de um Chart Local
Instalar
# A partir de um diretório local
helm install my-release ./my-chart
# Com valores personalizados
helm install my-release ./my-chart -f custom-values.yaml
# Com valores inline
helm install my-release ./my-chart \
--set replicaCount=5 \
--set image.tag=1.1.0
Atualizar
# Atualizar
helm upgrade my-release ./my-chart
# Com novos valores
helm upgrade my-release ./my-chart -f new-values.yaml
Dependências
Chart.yaml com Dependências
apiVersion: v2
name: my-app
dependencies:
- name: postgresql
version: "12.0.0"
repository: "https://charts.bitnami.com/bitnami"
- name: redis
version: "17.0.0"
repository: "https://charts.bitnami.com/bitnami"
Instalar Dependências
# Baixar as dependências
helm dependency update
# Ver dependências
helm dependency list
Empacotamento e Distribuição
Criar um Pacote
# Criar um pacote .tgz
helm package ./my-chart
# Resultado: my-chart-0.1.0.tgz
Publicar em um Repositório
# Adicionar ao repositório
helm repo index . --url https://charts.example.com
# Fazer upload do pacote
# (de acordo com seu método de armazenamento)
Comandos Úteis
Validação
# Linter
helm lint ./my-chart
# Template com dry-run
helm install my-release ./my-chart --dry-run --debug
# Ver valores calculados
helm template my-release ./my-chart
Teste
# Instalar em modo teste
helm install my-release ./my-chart --dry-run
# Ver o manifest gerado
helm get manifest my-release
Boas Práticas
1. Estrutura Clara
Organize os templates de forma lógica.
2. Helpers
Use _helpers.tpl para código reutilizável.
3. Documentação
Documente todos os valores em values.yaml.
4. Validação
Use values.schema.json para validar os valores.
5. Versionamento
Siga o semantic versioning para os Charts.
Resumo
Neste capítulo, você aprendeu:
Estrutura: Chart.yaml, values.yaml, templates/, charts/
Templates Go: Sintaxe com chaves duplas, variáveis disponíveis
values.yaml: Valores padrão personalizáveis
Helpers: _helpers.tpl para código reutilizável
Dependências: Gerenciamento via Chart.yaml
Empacotamento: helm package para criar .tgz
Instalação: helm install a partir do local ou repositório
Boas práticas: Estrutura, helpers, documentação, versionamento
Próximos Passos
Capítulo 10.3: Templates Avançados e Hooks
Lab 10.2: Personalização com values.yaml
Lab 10.3: Criação de um Chart Personalizado
Capítulo criado em: Dezembro 2024