DevOps & CI/CD

Como Usar Helm: Gerenciador de Pacotes Kubernetes na Prática em Produção

14 min de leitura

Como Usar Helm: Gerenciador de Pacotes Kubernetes na Prática em Produção

O que é Helm e Por Que Você Precisa Dele 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 Charts. Um Chart é um pacote contendo templates YAML pré-configurados que descrevem todos os recursos Kubernetes necessários para rodar uma aplicação. 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. Instalação e Conceitos Fundamentais Instalando o Helm A instalação é direta. No Linux ou macOS, execute: Verifique a instalação: O Helm 3 não requer nenhuma configuração especial no cluster (diferente

<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: &quot;1.0&quot;

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: &quot;1.21.0&quot;

pullPolicy: IfNotPresent

service:

type: ClusterIP

port: 80

ingress:

enabled: true

className: &quot;nginx&quot;

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 &quot;minha-aplicacao.fullname&quot; . }}

labels:

{{- include &quot;minha-aplicacao.labels&quot; . | nindent 4 }}

spec:

replicas: {{ .Values.replicaCount }}

selector:

matchLabels:

{{- include &quot;minha-aplicacao.selectorLabels&quot; . | nindent 6 }}

template:

metadata:

labels:

{{- include &quot;minha-aplicacao.selectorLabels&quot; . | nindent 8 }}

spec:

containers:

  • name: {{ .Chart.Name }}

image: &quot;{{ .Values.image.repository }}:{{ .Values.image.tag }}&quot;

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=&quot;1.22.0&quot; \

--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: &quot;1.22.0&quot;

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: &quot;11.x.x&quot;

repository: &quot;https://charts.bitnami.com/bitnami&quot;

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 &quot;production&quot; }}

apiVersion: batch/v1

kind: Job

metadata:

name: {{ include &quot;minha-aplicacao.fullname&quot; . }}-pre-upgrade

annotations:

&quot;helm.sh/hook&quot;: pre-upgrade

&quot;helm.sh/hook-weight&quot;: &quot;-5&quot;

&quot;helm.sh/hook-delete-policy&quot;: before-hook-creation,hook-succeeded

spec:

template:

spec:

serviceAccountName: {{ include &quot;minha-aplicacao.serviceAccountName&quot; . }}

restartPolicy: Never

containers:

  • name: migrate

image: &quot;{{ .Values.image.repository }}:{{ .Values.image.tag }}&quot;

command: [&quot;./migrate.sh&quot;]

{{- 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: &quot;-5&quot;</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: &quot;{{ include &quot;minha-aplicacao.fullname&quot; . }}-test-connection&quot;

labels:

{{- include &quot;minha-aplicacao.labels&quot; . | nindent 4 }}

annotations:

&quot;helm.sh/hook&quot;: test

spec:

containers:

  • name: wget

image: busybox

command: [&#039;wget&#039;]

args: [&#039;{{ include &quot;minha-aplicacao.fullname&quot; . }}:{{ .Values.service.port }}&#039;]

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>&lt;!-- FIM --&gt;</p>

Comentários

Mais em DevOps & CI/CD

Como Usar Segurança em Containers Docker: Rootless, Capabilities e Scanning em Produção
Como Usar Segurança em Containers Docker: Rootless, Capabilities e Scanning em Produção

Segurança em Containers Docker: Rootless, Capabilities e Scanning Quando fala...

Dominando Namespaces, RBAC e Segurança em Clusters Kubernetes em Projetos Reais
Dominando Namespaces, RBAC e Segurança em Clusters Kubernetes em Projetos Reais

Namespaces em Kubernetes: Isolamento Lógico e Segurança Namespaces são um rec...

Dominando Jaeger e Zipkin: Distributed Tracing em Microsserviços em Projetos Reais
Dominando Jaeger e Zipkin: Distributed Tracing em Microsserviços em Projetos Reais

Introdução ao Distributed Tracing A arquitetura de microsserviços revoluciono...