Como instalar software em clusters Kubernetes com o gerenciador de pacotes Helm 3

Introdução

O Helm é um gerenciador de pacotes para Kubernetes que permite aos desenvolvedores e operadores configurar e implantar aplicativos em clusters Kubernetes com mais facilidade.

Os pacotes do Helm são chamados de charts, e eles contêm modelos de definições de recursos que implantam e configuram aplicativos específicos com o mínimo de esforço necessário do usuário. Com a utilização de modelos, é possível gerenciar o chart, suas configurações e comportamento passando definições de variáveis sem modificar o próprio chart. O Helm gerencia automaticamente as definições de recursos personalizadas, bem como modificações em definições já implantadas. Um chart implantado, com personalizações possíveis, é chamado de release.

Neste tutorial, você configurará o Helm 3 e aprenderá como instalar, atualizar, reverter e gerenciar charts e releases. Você também aprenderá a criar e empacotar seus próprios charts, além de configurar repositórios de charts, que hospedam charts que você pode instalar imediatamente.

Pré-requisitos

  • Um cluster Kubernetes com controle de acesso baseado em funções (RBAC) habilitado. Para mais informações sobre releases, você pode verificar a página de releases do Helm.

  • O comando de linha de comando kubectl instalado em sua máquina local, configurado para se conectar ao seu cluster. Você pode ler mais sobre a instalação do kubectl na documentação oficial.

    Você pode testar sua conectividade com o seguinte comando:

    1. kubectl cluster-info

    Se você não receber erros, estará conectado ao cluster. Se acessar vários clusters com o kubectl, verifique se selecionou o contexto do cluster correto executando:

    1. kubectl config get-contexts

    A saída listará as configurações disponíveis:

    Saída
    ATUAL NOME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin

    Aqui, o asterisco (*) indica que estamos conectados ao cluster do-fra1-helm3-example. Para trocar de clusters, execute:

    1. kubectl config use-context nome-do-contexto

Quando estiver conectado ao cluster correto, continue para a Etapa 1 para começar a instalar o Helm.

Etapa 1 — Instalando o Helm 3

Nesta seção, você instalará o Helm 3 usando o script shell fornecido oficialmente.

Comece navegando até /tmp, onde você armazenará o script de instalação executando:

  1. cd /tmp

Baixe o script com o seguinte comando:

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

Você pode examinar get_helm.sh em seu editor de texto para garantir que seja seguro.

Torne-o executável definindo suas permissões para o seguinte:

  1. chmod u+x get_helm.sh

Finalmente, execute-o para instalar o Helm 3:

  1. ./get_helm.sh

Você receberá uma saída semelhante à seguinte:

Output
Downloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz Verifying checksum... Done. Preparing to install helm into /usr/local/bin helm installed into /usr/local/bin/helm

Você tem o Helm 3 instalado em sua máquina. Agora você aprenderá sobre repositórios de gráficos e como usá-los.

Passo 2 — Configurando Repositórios de Gráficos

Os gráficos do Helm são armazenados em repositórios de gráficos que qualquer pessoa pode hospedar. Por padrão, o Helm 3 não vem pré-configurado com nenhum repositório. Versões anteriores do Helm incluíam um repositório de gráficos centralizado e curado; no entanto, o design do Helm 3 evoluiu deliberadamente para desenvolvedores de gráficos gerenciarem seu próprio repositório, permitindo mais liberdade e lançamentos mais rápidos. Isso significa que para cada gráfico que você deseja usar, você precisa garantir que adiciona o repositório de hospedagem à sua instalação do Helm.

Para ajudá-lo a encontrar o repositório certo, você pode usar o ArtifactHub.io, um site de código aberto gerenciado pelo CNCF que cataloga gráficos do Helm e seus repositórios. Ele também rastreia gráficos populares e úteis que outros projetos CNCF usam, então difere do repositório stable com o qual versões anteriores do Helm trabalhavam. Para projetos comuns, como ingressos Nginx ou ferramentas de monitoramento, é uma ótima fonte.

Você pode pesquisar por um gráfico que deseja instalar através da página inicial. Pesquisar por nginx mostrará todos os gráficos indexados que estão relacionados a ele.

Você vai instalar a edição comunitária gerenciada pela equipe do Kubernetes. Procure por ingress-nginx para encontrá-la nos seus resultados. Selecione-a para acessar sua página.

Cada gráfico deve ter uma descrição detalhando o que faz, juntamente com comandos para adicionar seu repositório à sua instalação e instalar o gráfico. Se não tiver, você ainda pode obter os comandos necessários pressionando o botão INSTALAR à direita da página.

Você pode clicar no botão azul ao lado de um comando para copiá-lo. Faça isso para o primeiro comando e execute-o:

  1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

Para adicionar um repositório ao Helm, você executa helm repo add. Os parâmetros que ele aceita são o nome do repositório e sua localização.

A saída será:

Output
"ingress-nginx" has been added to your repositories

Ao adicionar um novo repositório, você precisa informar ao Helm o que ele contém executando:

  1. helm repo update

Você receberá a seguinte saída, mostrando que a atualização foi bem-sucedida:

Output
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "ingress-nginx" chart repository Update Complete. ⎈Happy Helming!⎈

Neste passo, você aprendeu sobre o ArtifactHub e o que ele oferece. Você também adicionou um novo repositório à sua instalação do Helm. No próximo passo, você instalará um gráfico do Helm.

Passo 3 — Instalando um Gráfico do Helm

No seção anterior, você adicionou o repositório para o gráfico ingress-nginx. Agora você o instalará em seu cluster.

Cada gráfico possui variáveis de configuração que você pode definir para modificar seu comportamento. Essas variáveis são armazenadas em um arquivo chamado values.yaml que faz parte do gráfico. A menos que você tenha baixado o gráfico para sua máquina, será necessário executar o seguinte comando para visualizá-lo:

  1. helm show values chart_name

Para mostrar as variáveis disponíveis para ingress-nginx, substitua chart_name:

  1. helm show values ingress-nginx/ingress-nginx

A saída será longa mostrando o conteúdo de values.yaml para ingress-nginx.

Para instalar um gráfico, você pode usar helm install:

  1. helm install release_name repository/chart_name

A release is a deployed instance of the chart, and here you’re calling it ingress-nginx.

Este comando instalaria o gráfico em seu cluster com os valores padrão das variáveis. Se desejar modificar alguns deles, você pode passar os novos valores das variáveis usando --set:

  1. helm install ingress-nginx/ingress-nginx --set variable_name=variable_value

Você pode repetir --set para quantas variáveis precisar. Como não estaremos personalizando agora, instale como está executando:

  1. helm install ingress-nginx ingress-nginx/ingress-nginx

A saída será semelhante ao seguinte:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 10:12:37 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The ingress-nginx controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller' ...

Observe que o NOME corresponde ao nome da versão que você especificou. O Helm também lista informações comuns, como o status da versão e o namespace no qual está implantado. A seção NOTAS varia entre os gráficos e geralmente contém orientações de inicialização rápida ou alerta sobre algumas armadilhas comuns ao usar os recursos do gráfico. Aqui, ele observa que o Balanceador de Carga está sendo criado e que pode levar algum tempo para ser concluído.

Para verificar os gráficos implantados, use helm list:

  1. helm list

Você verá que ingress-nginx é o único gráfico implantado no momento:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0

Você pode encontrar os serviços que estão em seu cluster executando:

  1. kubectl get services

A saída será semelhante a esta:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m

Agora que você implantou uma versão em seu cluster, você modificará sua configuração enquanto ela está implantada.

Passo 4 — Atualizando uma Versão

Uma vez que uma versão está implantada, você não precisa desmontá-la e implantá-la novamente completamente quando precisar alterar sua configuração. Você pode usar o comando helm upgrade para atualizar a versão com uma nova versão do gráfico ou para definir novas configurações.

O gráfico ingress-nginx expõe a variável controller.replicaCount que controla o número de pods do controlador implantados. Por padrão, está definido como um, o que você pode verificar listando os pods disponíveis:

  1. kubectl get pods

Você verá que há apenas um:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m

Se você deseja implantar mais para redundância (por exemplo, três), você pode atualizar a versão e definir a variável como 3 executando:

  1. helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values

Você também passa --reuse-values, que instrui o Helm a basear suas alterações na versão implantada, preservando a configuração anterior.

Na saída, o Helm aumentará a revisão para sinalizar que a versão foi atualizada:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 12:07:54 2021 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: ...

Você pode listar os pods disponíveis executando:

  1. kubectl get pods

Você encontrará três pods listados, em vez de um:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s

Em seguida, você irá reverter as alterações e excluir as versões por completo.

Passo 5 — Revertendo e Excluindo uma Versão

Ao atualizar uma versão, seu número de revisão é incrementado. Internamente, o Helm armazena todas as revisões de uma versão, permitindo que você retorne a uma revisão anterior, se necessário.

Para reverter o número de pods para apenas um, você poderia executar helm upgrade novamente e definir manualmente o número, pois é uma alteração pequena. No entanto, ao trabalhar com gráficos maiores com muitas variáveis, reverter manualmente não é viável e deve ser automatizado.

Para reverter uma versão, use helm rollback:

  1. helm rollback release_name release_revision

Você pode usá-lo para reverter as alterações feitas em ingress-nginx ao voltar para a revisão 1:

  1. helm rollback ingress-nginx 1

Você receberá a seguinte saída, indicando que a ação foi bem-sucedida:

Output
Rollback was a success! Happy Helming!

Você pode verificar a revisão atual listando as versões:

  1. helm list

Você verá que a revisão agora é 3, e não 1:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0

O Helm considera cada alteração, incluindo as reversões, como uma nova revisão de uma versão. Você pode verificar se a revisão 3 é igual à primeira verificando o número de pods implantados executando:

  1. kubectl get pods

Você verá que há apenas um:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m

Para excluir uma versão e todas as suas revisões, você pode usar helm delete:

  1. helm delete release_name

Já que você não vai precisar mais dele, exclua o ingress-nginx executando o seguinte comando:

  1. helm delete ingress-nginx

A saída será:

Output
release "ingress-nginx" uninstalled

Você pode listar as versões para verificar que não há nenhuma:

  1. helm list

A tabela de saída não terá linhas:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

Agora que a versão foi excluída, você pode reutilizar seu nome para implantações futuras.

Passo 6 — (Opcional) Criando Gráficos Personalizados

Neste passo opcional, você aprenderá como criar um gráfico personalizado, onde colocar suas definições de recursos e como empacotá-lo para distribuição posterior.

Você criará um novo gráfico chamado example-chart. Execute o seguinte comando para criá-lo:

  1. helm create example-chart

Isso criará um novo diretório chamado example-chart com os seguintes arquivos e estrutura:

example-chart/
charts/
templates/
├─ tests/
│  ├─ test-connection.yaml
├─ deployment.yaml
├─ hpa.yaml
├─ ingress.yaml
├─ NOTES.txt
├─ service.yaml
├─ serviceaccount.yaml
├─ _helpers.tpl
Chart.yaml
values.yaml

As definições de recursos que seu gráfico instalará nos clusters de destino estão localizadas no diretório templates. As predefinições que o Helm criou como ponto de partida implementam um controlador de ingresso Nginx. Embora a extensão do arquivo seja YAML, eles usam a sintaxe de modelagem do Go para permanecerem personalizáveis através de variáveis expostas que você pode passar. Você pode verificar mostrando o conteúdo de service.yaml executando:

  1. cat example-chart/templates/service.yaml

Você verá que ele contém diretivas de modelagem para gerar valores cercados por chaves duplas:

Output
apiVersion
: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}

As variáveis referenciadas são expostas ao usuário e definidas em values.yaml. O texto NOTES que o Helm mostra após a implantação é armazenado em NOTES.txt e também é modelado. Metadados do gráfico, como nome, versão e versão do software sendo implantado, são especificados em Chart.yaml:

example-chart/Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

Para verificar o que o Helm implantaria, você pode passar --dry-run e --debug para helm install apontando para o diretório do gráfico:

  1. helm install example-chart --dry-run --debug ./example-chart

A saída será longa e conterá todas as definições de recursos finais que seriam aplicadas ao seu cluster. Enquanto você trabalha no seu gráfico, você pode usar helm upgrade para enviar novas versões para o Kubernetes.

Quando chegar a hora de compartilhar seu gráfico concluído, você pode empacotá-lo para distribuição executando:

  1. helm package ./example-chart

A saída será:

Output
Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz

O gráfico empacotado pode ser instalado da mesma forma que os gráficos dos repositórios adicionados:

  1. helm install example-chart example-chart-0.1.0.tgz

Neste passo, você criou um gráfico personalizado e o implantou. Você também o empacotou e aprendeu sobre sua estrutura.

Conclusão

Agora você sabe como usar o Helm para instalar e atualizar software implantado em seu cluster Kubernetes. Você adicionou repositórios de gráficos e aprendeu por que eles são importantes e como o ArtifactHub pode ajudá-lo a encontrá-los. Você também criou um novo gráfico personalizado e aprendeu sobre revisões de lançamento e como reverter se necessário.

Para obter mais informações sobre como criar gráficos personalizados, visite o guia oficial.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager