Como adicionar novas aplicações no Kubernetes com HELM

Se você já teve que instalar alguma aplicação em cluster do Kubernetes provavelmente já se deparou com esse nome… Helm Chart. Normalmente em instalações que precisam interagir de modo mais profundo com o Kubernetes e é necessário customizar um comportamento ou componente adicionamos operadores. O Openshift por exemplo é uma customização do Kubernetes que implementa uma série de operadores para implementar um modelo de uso mais simplificado em certa medida.

Tanto nos casos em que se quer subir um novo operador ou simplesmente um banco de dados, no final das contas, você vai ter que ter um arquivo YAML que irá instruir o Kubernetes como seu estado deve ficar. Lembre-se, o Kubernetes utiliza o paradigma de programação declarativa, ou seja, dizemos para ele como queremos que ele fique e o próprio cluster sabe o que deve ser feito.

Mesmo no caso do Helm o que acontece é que os famigerados arquivos YAML seram utilizados para realizar o deploy. Você deve estar se perguntando: que vantagem temos ao utilizar o Helm ao invés de simplesmente aplicar os manifestos diretamente?

Será exatamente isso que você verá no decorrer deste post como sempre mostrando na prática isso será atingido.

O que é?

O Helm é uma ferramenta de gestão de pacotes de aplicações para Kubernetes e segundo os seus criadores teve profunda inspiração nos gerenciadores de pacote apt e brew. O principal foco para a criação desta ferramenta foi a de simplificar a instalação de aplicações em clusters Kubernetes.

Ela foi concebida com a idéia de que até mesmo um novato conseguisse realizar as instalações de aplicações no Kubernetes sem tem que lidar com os mal falados arquivos de manifestos do Kubernetes.

Uma curiosidade legal é que o Helm foi criado a partir de um Hackaton na empresa Deis na qual o fundador do Helm Matt Butcher liderava uma equipe que precisava entregar a primeira oferta de PaaS com base no Kubernetes. Para a participação ele formou uma equipe com mais dois colegas Jack Francis e Rimas Mocevicius já com a intenção de resolver o problema de deploy no Kubernetes. Foi ai que nasceu o Helm mas com o nome de k8s place (“Kate’s Place”).

Uma curiosidade legal é que o Helm foi criado a partir de um Hackaton na empresa Deis na qual o fundador do Helm Matt Butcher liderava uma equipe que precisava entregar a primeira oferta de PaaS com base no Kubernetes. Para a participação ele formou uma equipe com mais dois colegas Jack Francis e Rimas Mocevicius já com a intenção de resolver o problema de deploy no Kubernetes. Foi ai que nasceu o Helm mas com o nome de k8s place (“Kate’s Place”).

Caso você queira conhecer um pouco mais sobre o Matt Butcher acesse a sua entrevista ao InfoQ.

Como Funciona?

Por ele ter forte inspiração em outras ferramentas de gerenciamento de pacotes, como apt, yum, brew e etc o funcionamento é praticamente o mesmo.

Quando você deseja realizar uma instalação simplesmente é necessário fazer a chamada do binário do Helm seguido da palavra chave da ação e informar o nome da aplicação que, no caso do Helm, é chamado de chart deseja instalar.

Após a instalação o Helm mantém um registro do que foi instalado. Da mesma forma que os seus primos (apt, yum, etc). Ele também permite que um chart possa ser atualizado, modificado ou removido.

Um ponto importante de se falar é que diferentemente dos outros gerenciadores de pacote os charts não são mantidos de forma centralizada acontece com as distribuições de Linux. No caso do Helm existem alguns repositórios disponíveis na internet que você pode configurar. Além disso, você também pode criar um chart personalizado para fazer o deploy de uma aplicação da sua empresa no Kubernetes.

Agora que já sabemos o que é o Helm e em linhas gerais como ele funciona vamos para a parte prática!

Instalação

Para fazer a instalação basicamente precisamos baixar arquivo compactado e então descompactá-lo em uma pasta local da sua estação de trabalho. O binário do Helm não fica dentro do cluster e sim na máquina que você está utilizando para realizar as operações.

Para obter a versão do Helm relativa ao seu sistema operacional visite o repositório do Helm no Github clicando aqui.

Caso você esteja usando Linux, pode seguir os passos abaixo:

# Baixa arquivo de instalação
wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz

# Descompacta em um diretório
mkdir ~/helm && tar -zxvf helm-v3.7.1-linux-amd64.tar.gz -C ~/helm

# Adicione o binário do helm na variável PATH
echo "export PATH=\$PATH:~/helm/linux-amd64" >> ~/.bashrc

# Atualize a variável de ambiente
source ~/.bashrc

# Teste para verificar se o Helm foi instalado corretamente
helm version
version.BuildInfo{Version:"v3.7.1", GitCommit:"1d11fcb5d3f3bf00dbe6fe31b8412839a96b3dc4", GitTreeState:"clean", GoVersion:"go1.16.9"}

Adicionando Repositórios

Como eu havia explicado o Helm precisa ser configurado para apontar para um repositório para que desta maneira, ele possa pesquisar quais Charts estarão disponíveis para instalação.

Um repositório que eu gosto é o da Bitnami que além de fornecer os charts também disponibiliza em outros formatos como: containers, máquinas virtuais e etc. Para o nosso exemplo iremos instalar o SonarQube do repositório.

Acessando a página é possível ver que lá estão as instruções para a instalação.

Primeiro vamos adicionar o repositório da Bitnami ao nosso Helm. Para isso execute o comando abaixo:

$ helm repo add bitnami https://charts.bitnami.com/bitnami

Agora é só realizar a instalação propriamente dita mas primeiro, vamos criar um namespace separado para o Sonar. Além de ser uma boa prática isto vai ajudar a organizar um pouco as coisas.

# Criando o namespace sonar
$ kubectl create ns sonar
namespace/sonar created

# Instalando o Sonarqube no namespace sonar
$ helm install sonarqube bitnami/sonarqube -n sonar
NAME: sonarqube
LAST DEPLOYED: Wed Nov 10 11:44:52 2021
NAMESPACE: sonar
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **

Your SonarQube site can be accessed through the following DNS name from within your cluster:

    sonarqube.sonar.svc.cluster.local (port 80)

To access your SonarQube site from outside the cluster follow the steps below:

1. Get the SonarQube URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace sonar -w sonarqube'

   export SERVICE_IP=$(kubectl get svc --namespace sonar sonarqube --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
   echo "SonarQube URL: http://$SERVICE_IP/"

2. Open a browser and access SonarQube using the obtained URL.

3. Login with the following credentials below:

  echo Username: user
  echo Password: $(kubectl get secret --namespace sonar sonarqube -o jsonpath="{.data.sonarqube-password}" | base64 --decode)

Para acompanhar o andamento da instalação vamos rodar o comando abaixo:

kubectl get all -n sonar
NAME                            READY   STATUS    RESTARTS   AGE
pod/sonarqube-b767f6779-5t7s2   1/1     Running   0          2m52s
pod/sonarqube-postgresql-0      1/1     Running   0          2m52s

NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                       AGE
service/sonarqube                       LoadBalancer   10.104.32.195    192.168.122.150   80:32662/TCP,9001:30608/TCP   2m52s
service/sonarqube-postgresql            ClusterIP      10.101.129.120   <none>            5432/TCP                      2m52s
service/sonarqube-postgresql-headless   ClusterIP      None             <none>            5432/TCP                      2m52s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/sonarqube   1/1     1            1           2m52s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/sonarqube-b767f6779   1         1         1       2m52s

NAME                                    READY   AGE
statefulset.apps/sonarqube-postgresql   1/1     2m52s

Perceba que ele não somente fez a instalação do Sonar como também do Postgresql para servir como banco de dados da aplicação. Além disso, como já tenho um load balancer configurado neste cluster o serviço foi criado em : http://192.168.122.150. Abrindo a URL no browser a tela do Sonar é carregada:

Note que na saida do comando do helm install que realizamos ele nos fornece algumas informações importantes, entre elas qual usuário deve ser utilizado e onde pode ser obtida a senha. Para o usuário deve ser utilizado: user e para a senha devemos rodar o seguinte comando:

$ kubectl get secret --namespace sonar sonarqube -o jsonpath="{.data.sonarqube-password}" | base64 --decode
Y9cVeECkOf

Utilizando essa combinação de usuário e senha conseguimos acessar a aplicação sem problemas.

Conclusão

Fácil né?! É fácil perceber como o Helm simplifica o deploy de novas ferramentas e aplicações em um cluster Kubernetes. No nosso exemplo de uso não precisamos editar nenhum arquivo de manifesto, nem fazer configurações mirabolantes nem nada. De forma simples fizemos a instalação com um único comando.

Acho que o Matt Butcher conseguiu o que queria. Simplificar os deploys no Kubernetes para que qualquer um pudesse realizar esta tarefa sem a necessidade de ter profundos conhecimentos tanto de infraestrutura como dos manifestos.

Penso que sim! E que você o que achou? Concorda que fica mais fácil ou prefere você mesmo escrever os seus manifestos?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s