7.2 Configurando o ambiente local de desenvolvimento

A configuração do ambiente visa permitir ao desenvolvedor executar localmente a aplicação em um cluster na sua própria máquina, bem como possibilitar que seja realizado o deploy em uma nuvem pública utilizando os mesmos arquivos para a definição dos recursos.

Com isso, obtém-se um ambiente local que é muito mais próximo ao ambiente de produção, diminuindo as chances de ocorrerem erros devido às diferenças entre os ambientes, que poderiam ocorrer, por exemplo, ao utilizar o Docker Compose localmente e o Kubernetes no ambiente de produção.

Serão utilizadas diversas ferramentas como kubectl, k0s, Skaffold e Helm e Terraform, as quais terão suas funcionalidades apresentadas e discutidas. A seguir é apresentado o modo de configurar o ambiente local, utilizando as plataformas Linux e Windows.

Linux Ubuntu

Instalação do k0s

A primeira ferramenta que vamos instalar é o k0s , o qual permite que criemos um cluster localmente na nossa máquina para testarmos nossa aplicação. Ele também será utilizado para criar o cluster que será utilizado no ambiente de produção. Ele pode ser instalado com o seguinte comando:

curl -sSLf https://get.k0s.sh | sudo sh

Podemos então instalar um serviço que permitirá a criação de um cluster (com uma única máquina) com o seguinte comando (será necessário digitar sua senha para entrar no modo de super usuário):

sudo k0s install controller --single

Uma vez instalado o serviço, devemos executá-lo (após esse passo, o serviço executará automaticamente sempre que a máquina for reiniciada):

sudo k0s start

Após um ou dois minutos, o cluster estará funcional. Para verificar o status do serviço, pode-se utilizar o seguinte comando:

sudo k0s status

A resposta deverá ser semelhante a essa:

Version: v0.11.0
Process ID: 436
Parent Process ID: 1
Role: controller+worker
Init System: linux-systemd

Instalação do kubectl

A ferramenta de linha de comando kubectl permite a execução de comandos para interação com o cluster criado. Essa ferramenta é bem interessante, pois permite, por exemplo, a utilização de seus comandos em scripts de automatização. É possível utilizar a versão que vem disponível com o próprio k0s, do seguinte modo:

sudo k0s kubectl COMANDO_DO_KUBECTL

Onde COMANDO_DO_KUBECTL deve ser substituído por algum comando específico do kubect. Por exemplo, podemos ver os nós do cluster desse modo:

sudo k0s kubectl get nodes

No entanto, também é possível instalar uma versão arbitrária do kubectl usando um repositório. Esse modo é recomendável, pois assim é possível ter um controle maior sobre sua versão e suas atualizações.

O primeiro passo é atualizar o índice de pacotes do Ubuntu e instalar as dependências necessárias:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

Na sequencia, deve ser baixada a chave GPG do repositório:

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

Deve-se adicionar o repositório ao índice de pacotes do Ubuntu:

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

Atualizar o índice e por fim instalar o kubect:

sudo apt-get update
sudo apt-get install -y kubectl

Desse modo, o kubectl poderá ser executado assim:

sudo kubectl COMANDO_DO_KUBECTL

Porém será necessário executar os passos da próxima seção.

Configurando o kubectl para acessar o cluster do k0s

Se você instalou o kubectl em vez de usar o kubectl do k0s, necessitará executar os seguintes passos. É necessário criar um arquivo de configuração do kubectl, chamado config. O k0s tem u comando que cria essa configuração, e deve ser utilizado do seguinte modo:

sudo k0s kubeconfig create --groups "system:masters" NOME_USUARIO > k0s.config

Devemos substituir o NOME_USUARIO por um nome arbitrário, que será o nome do usuário que vamos utilizar para a acessar o cluster, por meio do kubectl.

Na sequencia, vamos criar o usuário no cluster, com a permissão de administrador, do seguinte modo (não se esqueça de substituir novamente o NOME_DO_USUARIO pelo nome definido no comando anterior) e jogar a saída para o arquivo k0s.config:

sudo k0s kubectl create clusterrolebinding NOME_USUARIO-binding --clusterrole=admin --user=NOME_USUARIO > k0s.config

Será gerado um arquivo semelhante a esse:

apiVersion: v1
clusters:
- cluster:
    server: https://192.168.0.15:6443
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQWVpZ0F3SUJBZ0lVVEdYWWsvcGF6M01VY29FL0dBOGUyZjJ5VVVNd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0....
  name: k0s
contexts:
- context:
    cluster: k0s
    user: NOME_USUARIO
  name: k0s
current-context: k0s
kind: Config
preferences: {}
users:
- name: NOME_USUARIO
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURWVENDQWoyZ0F3SUJBZ0lVTWdCMEtHcTk1M0ZjRjNXTEtDWU1vWEhZd2NVd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0....
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBMXlyUEpndFRSdmJFS3orNUh3SFV5U2ZoRTU3TjN0d0VLdmVtcjhDTU9vbGM0UWVWCn....

Devemos agora mover esse arquivo para o diretório padrão de configuração do kubectl:

mv k0s.config $HOME/.kube/config

No arquivo gerado, na linha 12, temos a configuração current-context: k0s, que informa ao kubectl qual o contexto deve ser usado. Essa informação é interessante, pois podemos definir no arquivo diferentes contextos, e permitir a conexão a diferentes clusters Kubernetes. Também é possível definir o contexto atual usando a linha de comando:

kubectl config use-context k0s

Para verificar qual o contexto está sendo utilizado atualmente, é possível usar o seguinte comando:

kubectl config current-context

Instalação do Registry do Docker

Vamos precisar configurar um registry de imagens Docker. Nele, as imagens geradas pela nossa aplicação será armazenadas, e posteriormente acessadas pelo Kubernetes para a criação dos nossos containers.

Um único comando para o Docker inicializa o registry, na porta 5005:

docker run -d -p 5005:5000 --restart=always --name registry registry:2

A seguir, devemos alterar o nosso arquivo /etc/hosts, para criar um alias para o registry. Desse modo, vamos poder acessá-lo pela url http://registry-local:5005. Para isso, devemos editar o arquivo /etc/hosts e buscar a linha que contenha esse conteúdo:

127.0.1.1 nome-da-maquina

Ela é uma das primeiras linhas desse arquivo. Vamos alterá-la para acrescentar o alias do registry:

127.0.1.1 nome-da-maquina registry-local

Basta salvar o arquivo, para terminar a definição do alias. Para testar se está tudo correto, podemos utilizar o curl:

curl registry-local:5005/v2/

A resposta deve ser {}.

Por esse registry e o cluster rodarem localmente na nossa máquina, não precisamos definir um acesso seguro a ele, utilizando certificados SSL. No entanto, teremos que realizar algumas configurações no k0s para que o cluster Kubernetes possa acessar esse registry de maneira insegura. Para isso, vamos gerar um arquivo de configuração utilizado pelo k0s:

sudo containerd config default > containerd.toml

Devemos editar o arquivo containerd.toml gerado, e alterar as seguintes linhas:

root = "/var/lib/containerd" state = "/run/containerd"

Para que fiquem assim:

root = "/var/lib/k0s/containerd" state = "/var/lib/k0s/run/containerd"

Já a linha:

address = "/run/containerd/containerd.sock"

Deverá ficar assim:

address = "/var/lib/k0s/run/containerd.sock"

Por último, logo abaixo da linha:

endpoint = ["https://registry-1.docker.io"]

Vamos acrescentar o seguinte trecho:

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry-local:5005"]
          endpoint = ["http://registry-local:5005"]
        [plugins."io.containerd.grpc.v1.cri".registry.configs]
          [plugins."io.containerd.grpc.v1.cri".registry.configs."registry-local:5005".tls]
            insecure_skip_verify = true

De modo que essa parte do arquivo fique assim:

    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://registry-1.docker.io"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry-local:5005"]
          endpoint = ["http://registry-local:5005"]
        [plugins."io.containerd.grpc.v1.cri".registry.configs]
          [plugins."io.containerd.grpc.v1.cri".registry.configs."registry-local:5005".tls]
            insecure_skip_verify = true

Lembre-se de manter a identação correta para que não haja problemas. Após essas alterações, vamos copiar esse arquivo para o diretório que o k0s usa para ler suas configurações:

sudo mkdir /etc/k0s/
sudo mv containerd.toml /etc/k0s/

Agora é necessário reiniciar o k0s com os dois comandos abaixo para que a alteração entre em vigor:

sudo service k0scontroller stop
sudo service k0scontroller start

Para checar se não houve nenhum problema, execute o comando a seguir:

sudo service k0scontroller status

A saída deverá indicar que o serviço está ativo:

● k0scontroller.service - k0s - Zero Friction Kubernetes
     Loaded: loaded (/etc/systemd/system/k0scontroller.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2021-06-09 09:35:50 -03; 2h 25min ago

Agora que já estão corretos o cluster, o registry, e a comunicação entre eles, vamos instalar o Skaffold.

Instalação do Skaffold

O Skaffold é uma ferramenta que automatiza os processos de:

  • Geração de imagem

  • Envio da imagem para um registry

  • Deploy da aplicação no cluster Kubernetes

Com isso, o desenvolvedor consegue ficar focado somente no desenvolvimento da aplicação. Utilizaremos ele para realizar o deploy da aplicação tanto no cluster local, quanto no cluster do ambiente de produção. A sua instalação é bem simples e pode ser realizada com o seguinte comando, o qual instala a versão mais nova:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 && sudo install skaffold /usr/local/bin/

Para verificar a versão instalada, é possível utilizar o comando skaffold version, que deverá retornar algo semelhante a:

v1.25.0

Vamos agora definir que o repositório padrão de imagens, ou seja, o registry que será utilizado para enviar e obter imagens Docker, será o registry que instalamos:

skaffold config set --global default-repo registry-local:5005
skaffold config set --global insecure-registries registry-local:5005

Para confirmar que as configurações foram aplicadas com sucesso, execute o seguinte comando:

skaffold config list

A saída dele deve ser semelhante a:

skaffold config: 
global:
  default-repo: registry-local:5005
  insecure-registries:
  - registry-local:5005
  survey:
    last-prompted: "2021-06-07T19:22:17-03:00"
  collect-metrics: true
  update:
    last-prompted: "2021-06-08T17:39:15-03:00"
kubeContexts:
- kube-context: k0s

Uma vez configurado o Skaffold, podemos finalmente utilizá-lo.

Instalação do Helm

O Helm é uma ferramenta que gerencia pacotes do Kubernetes, e vai permitir que criemos uma pacote, denominado chart para distribuir, instalar e atualizar nossa aplicação em um cluster Kubernetes.

O Skaffold consegue utilizar o Helm para instalar a nossa aplicação no cluster, e com a utilização do Helm podemos ter diferentes configurações de acordo com o ambiente no qual vamos realizar o deploy da aplicação. Desse modo, por exemplo, podemos controlar o endereço no qual a aplicação vai estar disponível, a quantidade de memória e processamento que ela vai poder utilizar, entre outras configurações que podem variar de um ambiente para outro.

A instalação do Helm é bem simples no Linux, bastando executar os comandos a seguir:

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

Para verificar a versão instalada, execute:

helm version

Instalação do Terraform

O Terraform é uma aplicação que permite codificar a infraestrutura necessária para executar a aplicação como código, o qual pode ser armazenado e versionado em repositórios de código, tais como GitHub e GitLab.

Ao transformar a infraestrutura em código versionado, é possível ter um histórico atualizado das alterações promovidas na infraestrutura, e eventualmente reverter de modo simplificado as alterações realizadas, caso ocorra algum problema.

Para instalar o Terraform é necessário adidiconar a chave GPG do repositório:

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

Na sequencia deve ser adicionado o repositório do Terraform:

sudo sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"

E por último atualizar o repositório e instalar a ferramenta:

sudo apt-get update && sudo apt-get install terraform

Para conferir a versão instalada use o seguinte comando:

terraform -v

Após a configuração do ambiente local de desenvolvimento, vamos entender os recursos do Kubernetes que utilizaremos para realizar o deploy da aplicação na próxima seção.

Last updated