Helm Charts – From Zero To Hero
Helm é um gerenciador de pacotes para Kubernetes com o objetivo principal de descrever uma estrutura de aplicação através dos Helm Charts, facilitando a instalação e gestão dos pacotes e suas dependências. Ele foi concebido na Deis Labs durante um hackathon ganho por Matt Bucher, Jack Francis e Rimas Mocevicius, em seguida o projeto foi doado para a Cloud Native Computing Foundation.
Helm Charts
O objetivo inicial do Helm era gerenciar os arquivos YAML do Kubernetes, para cumprir esse objetivo foram criados os Helm Charts. Cada chart é um agrupamento de um ou mais manifestos do Kubernetes que podem fazer referência para outros charts, assim criando toda a árvore de dependências de um serviço.
Vantagens
Os charts permitem que façamos a instalação de um serviço no kubernetes com apenas um comando ao invés de criarmos todas as dependências desse serviços através dos arquivos YAML e aplicá-los um a um com o kubectl.
Outra vantagem é a possibilidade do versionamento dos manifestos e releases, assim podemos não só estabelecer instalações e configurações específicas para cada versão, mas também fazermos rollback em caso de algum upgrade mal sucedido.
A proposta básica do Kubernetes é gerenciar seus containers para você, mas não te permite criar arquivos YAMLs dos objetos de forma genérica, caso precise reaproveitar esses arquivos em alguma automação, seria necessário criar os arquivos com um rótulo de ambiente e na automação substituir esses rótulos com seus valores de configuração.
Pegamos como exemplo o arquivo de deployment de uma aplicação qualquer, ele seria mais ou menos como na imagem a seguir:

Para deixarmos o arquivo de deployment genérico e reaproveitá-lo em um pipeline teríamos que criar os rótulos de ambiente dessa forma:

No pipeline precisaríamos ter um step, antes do deploy para substituir os valores. Como por exemplo:
Fazer o mesmo para os demais arquivos do sistemas já seria trabalhoso, imagine então fazer o mesmo para vários sistemas com grau de complexidade diferentes um do outro, a gestão desses arquivos e deploys seria praticamente impossível.
A criação de templates também é resolvida com o Helm, quando criamos os Charts, cada manifesto dos objetos necessários para executar a aplicação se encontram no diretório templates, esses templates são escritos em Go Template e todos os valores necessários para configurar e personalizar o deployment da aplicação são obtidos do arquivo values.yaml ou com a flag –set no CLI.
Values.yaml

Deployment-template.yaml

Como criar os Helm Charts
Os HelmCharts geralmente não são criados e mantidos pelos grandes projetos públicos, podemos criar nossos próprios HelmCharts para nossas aplicações desenvolvidas internamente e privadas. O processo de criação dos HelmCharts é bem simples, com o comando “helm init <nome-projeto>” na versão 2 do Helm ou “helm create <nome-projeto>” na versão 3, o Helm gera uma estrutura básica de templates dos principais objetos do kubernetes.
Diretório raiz do Helm Chart


Vamos analisar cada arquivo e diretório que está no diretório raiz:
- Chart.yaml: É o arquivo onde colocamos as informações do nosso chart como a versão do chart, nome, descrição, nele também podemos colocar as dependências externas do nosso chart caso exista.
- values.yaml: É o arquivo onde declaramos os valores das variáveis padrão.
- templates: É o diretório onde colocamos os arquivos de manifestos de todos os objetos necessários no deploy.
- charts: Caso nosso chart dependa de outro chart nós criamos essa dependência nesse diretório, caso nosso chart (A), dependa do chart B que depende do chart C, as dependências são instaladas em ordem de dependência. Ou seja, primeiro o C, depois o B e por último o A.
Arquivos no diretório templates

Exemplo de uma Aplicação usando HelmChart
Vamos criar os HelmCharts de uma aplicação, Hello World, em Python e vamos fazer o deploy dela em um cluster kubernetes. Para este exemplo usaremos uma aplicação que encontra-se em um repositório no GitHub:
Preparação do ambiente
Clone do repositório:
‘git clone https://github.com/joao-vicaria/python-helloworld.git’
Build da imagem:
‘docker build -t py-hello . ‘
Push image:
‘docker tag py-hello your-registry/example:py-hello’ ‘docker push your-registry/example:py-hello’
Cria e configura helm charts:
‘helm create brownbag-helmcharts’
Configuração do values.yaml:
Editar os seguintes campos:
repository: your-registry/example tag: "py-hello" ingress.enabled: true ingress.annotations: kubernetes.io/ingress.class: nginx ingress.hosts.host: domain.com.br
Importante: Nosso container image está subindo na porta 5000, será necessário editar o container port do arquivo templates/deployment.yaml de 80 para a 5000.

Deploy:
‘helm.exe upgrade <release-name> --install <dir-app-chart> --namespace <namespace>’![]()
Validação:
Status do Pod como “Ready” no Cluster

Status do Service como “Ready” no Cluster

Status do Ingress como “Ready” no Cluster

Teste da aplicação

Como vimos, o Helm e os Helm Charts são ferramentas poderosas para gestão de aplicações em cluster kubernetes, com elas ganhamos flexibilidade, segurança e governança em cada deploy de uma nova versão.
Referências:
Deis Labs – https://deislabs.io/about