<h2>O que é Helm e Por Que Você Precisa Dele</h2>
<p>Helm é um gerenciador de pacotes para Kubernetes, similar ao npm para Node.js ou pip para Python. Ele simplifica a distribuição, instalação e gerenciamento de aplicações containerizadas em clusters Kubernetes através de abstrações chamadas <strong>Charts</strong>. Um Chart é um pacote contendo templates YAML pré-configurados que descrevem todos os recursos Kubernetes necessários para rodar uma aplicação.</p>
<p>Sem o Helm, você teria que escrever centenas de linhas de YAML manualmente, lidar com variações entre ambientes (desenvolvimento, staging, produção) através de cópias-pasta de arquivos, e gerenciar dependências entre componentes de forma frágil. O Helm resolve esses problemas oferecendo templating, versionamento de releases e a capacidade de empacotar aplicações inteiras em um único comando. Pense nele como um gestor de dependências e deployment unificado.</p>
<h2>Instalação e Conceitos Fundamentais</h2>
<h3>Instalando o Helm</h3>
<p>A instalação é direta. No Linux ou macOS, execute:</p>
<pre><code class="language-bash">curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash</code></pre>
<p>Verifique a instalação:</p>
<pre><code class="language-bash">helm version</code></pre>
<p>O Helm 3 não requer nenhuma configuração especial no cluster (diferente do Helm 2, que precisava do Tiller). Ele comunica-se diretamente com o API Server do Kubernetes usando seu kubeconfig.</p>
<h3>Os Três Conceitos Principais</h3>
<p><strong>Chart</strong>: Um pacote contendo templates, valores padrão e metadados. É como uma receita de bolo — descreve os ingredientes e proporções, mas não é o bolo pronto.</p>
<p><strong>Release</strong>: Uma instância de um Chart executada no cluster. Você pode instalar o mesmo Chart várias vezes com diferentes valores, gerando releases diferentes. É o bolo assado.</p>
<p><strong>Repository</strong>: Um servidor HTTP que hospeda Charts. Pense como PyPI para Python ou npm Registry. O Helm oficial mantém repositórios públicos que qualquer pessoa pode acessar.</p>
<pre><code class="language-bash"># Adicionar repositório oficial do Helm
helm repo add stable https://charts.helm.sh/stable
Listar repositórios cadastrados
helm repo list
Atualizar informações dos repositórios
helm repo update</code></pre>
<h2>Criando Seu Primeiro Chart</h2>
<h3>Estrutura de um Chart</h3>
<p>Vamos criar um Chart do zero para uma aplicação simples. Execute:</p>
<pre><code class="language-bash">helm create minha-aplicacao</code></pre>
<p>Isso gera a seguinte estrutura:</p>
<pre><code>minha-aplicacao/
├── Chart.yaml
├── values.yaml
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── _helpers.tpl
└── charts/</code></pre>
<p>O arquivo <code>Chart.yaml</code> contém metadados:</p>
<pre><code class="language-yaml">apiVersion: v2
name: minha-aplicacao
description: Uma aplicação web simples
type: application
version: 0.1.0
appVersion: "1.0"
maintainers:
- name: Seu Nome
email: seu.email@example.com</code></pre>
<p>O arquivo <code>values.yaml</code> define os valores padrão que serão injetados nos templates:</p>
<pre><code class="language-yaml">replicaCount: 2
image:
repository: nginx
tag: "1.21.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: true
className: "nginx"
hosts:
- host: app.local
paths:
- path: /
pathType: Prefix
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 250m
memory: 128Mi</code></pre>
<h3>Usando Templates com Variáveis</h3>
<p>Os templates usam a sintaxe de Go templating. Abra <code>templates/deployment.yaml</code> e veja como os valores são injetados:</p>
<pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "minha-aplicacao.fullname" . }}
labels:
{{- include "minha-aplicacao.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "minha-aplicacao.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "minha-aplicacao.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
resources:
{{- toYaml .Values.resources | nindent 12 }}</code></pre>
<p>Note a sintaxe <code>{{ .Values.replicaCount }}</code> — isso é substituído pelo valor definido em <code>values.yaml</code>. O arquivo <code>_helpers.tpl</code> contém funções reutilizáveis (como <code>minha-aplicacao.fullname</code>) para evitar repetição.</p>
<h2>Instalando, Atualizando e Removendo Releases</h2>
<h3>Instalando um Chart Localmente</h3>
<p>Supondo que seu Chart esteja na pasta <code>minha-aplicacao/</code>, instale-o no cluster padrão (namespace default):</p>
<pre><code class="language-bash">helm install minha-release ./minha-aplicacao</code></pre>
<p>O Helm retorna informações sobre os recursos criados. Para visualizar a release:</p>
<pre><code class="language-bash">helm list</code></pre>
<p>Para detalhar a release:</p>
<pre><code class="language-bash">helm status minha-release</code></pre>
<h3>Sobrescrevendo Valores na Instalação</h3>
<p>Você pode sobrescrever valores sem editar <code>values.yaml</code>:</p>
<pre><code class="language-bash">helm install minha-release ./minha-aplicacao \
--set replicaCount=3 \
--set image.tag="1.22.0" \
--namespace producao \
--create-namespace</code></pre>
<p>Ou usando um arquivo YAML alternativo:</p>
<pre><code class="language-bash">helm install minha-release ./minha-aplicacao \
-f valores-producao.yaml</code></pre>
<p>Onde <code>valores-producao.yaml</code> contém:</p>
<pre><code class="language-yaml">replicaCount: 5
image:
tag: "1.22.0"
service:
type: LoadBalancer</code></pre>
<h3>Atualizando uma Release</h3>
<p>Depois de fazer mudanças no Chart ou nos valores, atualize a release sem fazer downtime total:</p>
<pre><code class="language-bash">helm upgrade minha-release ./minha-aplicacao --set replicaCount=4</code></pre>
<p>Você pode visualizar o histórico de releases:</p>
<pre><code class="language-bash">helm history minha-release</code></pre>
<p>Se algo der errado, reverta para a versão anterior:</p>
<pre><code class="language-bash">helm rollback minha-release 1</code></pre>
<h3>Removendo uma Release</h3>
<pre><code class="language-bash">helm uninstall minha-release</code></pre>
<p>Isso remove todos os recursos Kubernetes associados à release.</p>
<h2>Trabalhando com Repositórios e Charts Públicos</h2>
<h3>Instalando Charts de Repositórios</h3>
<p>Após adicionar um repositório (como <code>stable</code>), você pode buscar e instalar Charts:</p>
<pre><code class="language-bash"># Buscar um chart
helm search repo nginx
Instalar a última versão
helm install meu-nginx stable/nginx-ingress
Instalar uma versão específica
helm install meu-nginx stable/nginx-ingress --version 3.26.0</code></pre>
<h3>Criando Dependências Entre Charts</h3>
<p>Se sua aplicação depende de um banco de dados, você pode declarar isso em <code>Chart.yaml</code>:</p>
<pre><code class="language-yaml">apiVersion: v2
name: aplicacao-completa
dependencies:
- name: postgresql
version: "11.x.x"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled</code></pre>
<p>Depois, execute:</p>
<pre><code class="language-bash">helm dependency update ./aplicacao-completa</code></pre>
<p>Isso baixa o Chart do PostgreSQL. Configure-o em <code>values.yaml</code>:</p>
<pre><code class="language-yaml">postgresql:
enabled: true
auth:
username: appuser
password: senhaSegura123
database: appdb</code></pre>
<p>Agora, quando você instalar <code>aplicacao-completa</code>, o PostgreSQL será provisionado automaticamente junto.</p>
<h3>Publicando Seu Chart em um Repositório</h3>
<p>Se você quer compartilhar seu Chart, empacote-o:</p>
<pre><code class="language-bash">helm package ./minha-aplicacao</code></pre>
<p>Isso cria um arquivo <code>minha-aplicacao-0.1.0.tgz</code>. Para hostar em um repositório HTTP, você pode usar o GitHub Pages ou qualquer servidor estático. Basta criar um arquivo <code>index.yaml</code>:</p>
<pre><code class="language-bash">helm repo index . --url https://seu-usuario.github.io/helm-charts/</code></pre>
<p>Depois, outras pessoas podem usar seu Chart:</p>
<pre><code class="language-bash">helm repo add meus-charts https://seu-usuario.github.io/helm-charts/
helm install minha-app meus-charts/minha-aplicacao</code></pre>
<h2>Helm Hooks e Ciclo de Vida</h2>
<p>Helm suporta hooks que executam ações em momentos específicos do deployment. Um caso de uso comum é executar migrations de banco de dados antes de um upgrade.</p>
<p>Crie <code>templates/pre-upgrade-job.yaml</code>:</p>
<pre><code class="language-yaml">{{- if eq .Values.environment "production" }}
apiVersion: batch/v1
kind: Job
metadata:
name: {{ include "minha-aplicacao.fullname" . }}-pre-upgrade
annotations:
"helm.sh/hook": pre-upgrade
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
spec:
template:
spec:
serviceAccountName: {{ include "minha-aplicacao.serviceAccountName" . }}
restartPolicy: Never
containers:
- name: migrate
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
command: ["./migrate.sh"]
{{- end }}</code></pre>
<p>As anotações definem quando o Job executa:</p>
<ul>
<li><code>helm.sh/hook: pre-upgrade</code> — roda antes do upgrade</li>
<li><code>helm.sh/hook-weight: "-5"</code> — define ordem de execução (menor = primeiro)</li>
<li><code>helm.sh/hook-delete-policy</code> — remove o Job após sucesso</li>
</ul>
<p>Outros hooks disponíveis: <code>pre-install</code>, <code>post-install</code>, <code>pre-delete</code>, <code>post-delete</code>, <code>pre-rollback</code>, <code>post-rollback</code>.</p>
<h2>Testes e Validação de Charts</h2>
<h3>Validando a Sintaxe</h3>
<p>Antes de instalar, valide seu Chart:</p>
<pre><code class="language-bash">helm lint ./minha-aplicacao</code></pre>
<p>Isso verifica indentação YAML, nomes obrigatórios e outras validações básicas.</p>
<h3>Visualizando o YAML Gerado</h3>
<p>Para ver exatamente o que será criado no cluster, sem instalar:</p>
<pre><code class="language-bash">helm template minha-release ./minha-aplicacao --values valores-producao.yaml</code></pre>
<p>Isso mostra todos os manifestos YAML processados. É útil para debug e review antes de deploy.</p>
<h3>Dry-Run: Simulando a Instalação</h3>
<p>Para testar sem criar recursos:</p>
<pre><code class="language-bash">helm install minha-release ./minha-aplicacao --dry-run --debug</code></pre>
<p>O <code>--debug</code> mostra detalhes adicionais da renderização.</p>
<h3>Testes Automatizados</h3>
<p>Helm permite definir testes dentro do Chart. Crie <code>templates/tests/test-connection.yaml</code>:</p>
<pre><code class="language-yaml">apiVersion: v1
kind: Pod
metadata:
name: "{{ include "minha-aplicacao.fullname" . }}-test-connection"
labels:
{{- include "minha-aplicacao.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "minha-aplicacao.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never</code></pre>
<p>Execute os testes:</p>
<pre><code class="language-bash">helm test minha-release</code></pre>
<p>O Helm criará um Pod que valida a conectividade com sua aplicação.</p>
<h2>Conclusão</h2>
<p>Você agora domina os conceitos fundamentais do Helm e pode utilizá-lo para gerenciar deployments Kubernetes de forma profissional. Os três aprendizados principais são: <strong>(1)</strong> Helm simplifica drasticamente o gerenciamento de aplicações Kubernetes através de templating e versionamento, eliminando a necessidade de copiar YAML repetitivamente entre ambientes; <strong>(2)</strong> Charts são compostos por templates, valores e metadados que trabalham juntos, permitindo reutilização e configuração flexível sem modificar código-base; <strong>(3)</strong> O ciclo de vida completo — instalação, upgrade, rollback, testes e hooks — oferece segurança e controle fino sobre deployments em produção.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://helm.sh/docs/" target="_blank" rel="noopener noreferrer">Documentação Oficial do Helm</a></li>
<li><a href="https://artifacthub.io/" target="_blank" rel="noopener noreferrer">Helm Hub - Repositório de Charts Públicos</a></li>
<li><a href="https://helm.sh/docs/chart_best_practices/" target="_blank" rel="noopener noreferrer">Best Practices de Charts Helm</a></li>
<li><a href="https://github.com/bitnami/charts" target="_blank" rel="noopener noreferrer">Bitnami Helm Charts - Exemplos Reais</a></li>
<li><a href="https://kubernetes.io/docs/" target="_blank" rel="noopener noreferrer">Kubernetes Official Documentation</a></li>
</ul>
<p><!-- FIM --></p>