Marcio Cunha

Como criar charts Helm reutilizáveis sem repetir código

Descubra como estruturar charts Helm reutilizáveis utilizando subcharts, templates avançados e valores dinâmicos para padronizar sua infraestrutura no Kubernetes.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • A repetição de arquivos YAML em diferentes microserviços gera gargalos de manutenção e desvios de configuração na infraestrutura.
  • O encapsulamento de lógica comum em charts pai e filho permite centralizar regras de negócio mantendo flexibilidade por ambiente.
  • A função lookup e o uso de funções de template avançadas permitem injetar lógica condicional robusta nos manifestos.
  • A separação rigorosa entre valores globais e valores específicos de cada aplicação evita o acoplamento excessivo.
  • A adoção de padrões reutilizáveis reduz drasticamente o tempo de entrega de novas aplicações mantendo a conformidade do cluster.

O problema da duplicação de manifestos no Kubernetes

Gerenciar dezenas de aplicações no Kubernetes sem uma estratégia clara de empacotamento transforma qualquer operação em um pesadelo de cópia e cola. Quando cada microserviço possui seu próprio conjunto de arquivos YAML — contendo deployments, services e ingress idênticos —, qualquer alteração estrutural exige mudanças manuais em múltiplos repositórios. Na prática, isso significa que atualizar uma simples política de segurança ou adicionar uma variável de ambiente padrão pode consumir dias de trabalho repetitivo e abrir margem para erros humanos críticos.

Para resolver esse desafio de escala, engenheiros utilizam o Helm, que funciona como um gerenciador de pacotes para o Kubernetes, permitindo empacotar recursos em unidades lógicas chamadas charts. No entanto, usar o Helm de forma ingênua, criando um chart diferente para cada aplicação sem abstrações, apenas move a duplicação para outro formato. A verdadeira eficiência surge quando criamos estruturas modulares capazes de se adaptar a diferentes cenários sem exigir a reescrita de código base.

Antes de avançarmos para as técnicas de reutilização, vale notar que a padronização de entregas em clusters exige bases estáveis, algo que também abordamos ao discutir como escalar runners do GitLab no Kubernetes com alta demanda para garantir consistência operacional em qualquer volume de trabalho.

Estruturando arquiteturas com charts pai e subcharts

A primeira grande estratégia para eliminar a duplicação é a criação de um chart base (muitas vezes chamado de chart pai ou umbrella chart) que consome dependências menores, conhecidas como subcharts. Pense nisso como uma cozinha industrial onde os utensílios fundamentais são compartilhados por todas as estações de trabalho, enquanto cada chef ajusta apenas os ingredientes específicos do seu prato. No universo do Kubernetes, isso significa encapsular a infraestrutura padrão de banco de dados, monitoramento ou logging em um subchart genérico.

Para configurar essa hierarquia, o arquivo Chart.yaml do chart principal declara seus dependentes apontando para repositórios locais ou remotos. Quando o comando de instalação é executado, o Helm mescla os contextos, permitindo que a aplicação pai alimente os subcharts com parâmetros personalizados. Na prática, isso evita que cada equipe tenha que reescrever a lógica de conexão com o banco de dados ou as sondas de saúde da aplicação (liveness e readiness probes).

Além disso, o uso inteligente de valores dinâmicos garante que o mesmo subchart se comporte de maneira diferente dependendo de quem o chama. Um serviço de mensageria pode rodar com três réplicas em produção e apenas uma em desenvolvimento, controlado unicamente pelas diretrizes passadas pelo chart principal, sem alterar uma única linha do template original.

Dominando templates avançados com condicionais e loops

Quando a estrutura básica já não atende a todas as variações de negócio, recorremos aos recursos avançados da engine de templates do Go, que alimenta o Helm. Funções como if/else, range e blocos define permitem escrever manifestos altamente adaptáveis que geram código Kubernetes sob medida com base nas entradas fornecidas pelo usuário. É o equivalente a criar um formulário inteligente que desenha a casa perfeita dependendo do número de moradores informados.

Um erro comum é tentar embutir lógica excessiva diretamente nos arquivos de manifesto, o que torna a leitura e o diagnóstico de falhas extremamente complexos. Para manter o código limpo, a melhor prática consiste em isolar blocos repetitivos em templates nomeados dentro da pasta _helpers.tpl. Desta forma, funções de cálculo de nomes, rótulos padrão (labels) e seletores de rede ficam centralizadas em um único lugar, garantindo consistência em todo o cluster.

Abaixo, veja um exemplo prático de um template reutilizável para a criação de rótulos padronizados em _helpers.tpl:

{{- define 'app.labels' -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.Version | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}

Essa abordagem modular elimina qualquer inconsistência de metadados entre diferentes serviços, facilitando o rastreamento de recursos por ferramentas de observabilidade e garantindo que políticas de segurança sejam aplicadas uniformemente, algo tão crucial quanto proteger os acessos conforme discutido em como usar o Istio para criptografar tráfego mTLS no Kubernetes.

Gerenciamento inteligente de valores e escopos

O segredo definitivo para manter um chart reutilizável funcional a longo prazo reside na gestão rigorosa do arquivo values.yaml. Valores globais devem ser reservados estritamente para parâmetros que afetam múltiplos subcharts simultaneamente, como domínios base, tags de imagens corporativas ou configurações de rede globais. Misturar parâmetros específicos de uma aplicação no escopo global destrói a modularidade e cria dependências invisíveis e perigosas.

Na prática, cada subchart deve declarar seus próprios valores padrão em seu respectivo arquivo values.yaml, permitindo que funcionem de forma isolada para testes unitários ou deploys independentes. Quando o chart pai os consome, ele sobrescreve apenas o que é necessário para aquele ambiente específico. Essa separação de escopos evita surpresas desagradáveis durante atualizações de versão na esteira de integração contínua.

Para garantir que o processo de empacotamento e entrega ocorra sem surpresas, pipelines eficientes dependem de uma base sólida de build, tema que exploramos detalhadamente em pipeline lento? Como acelerar builds no Docker com cache, otimizando o ciclo de vida desde a imagem até o deploy no cluster.

Considerações finais sobre a padronização com Helm

A adoção de charts Helm reutilizáveis transforma a governança da infraestrutura, substituindo o caos de manifests duplicados por um ecossistema limpo, auditável e altamente escalável. Ao investir tempo na criação de subcharts bem desenhados e templates inteligentes, as equipes de engenharia eliminam o trabalho repetitivo e reduzem drasticamente o risco de falhas humanas em ambientes produtivos.

Em suma, o sucesso dessa jornada depende da disciplina arquitetural: isole o que é comum, parametrize o que varia e mantenha a documentação dos valores sempre atualizada. Com essas práticas consolidadas, sua organização ganha agilidade para lançar novas aplicações com a certeza de que a fundação técnica permanece sólida e padronizada.