7.4 Implantação automática no Google Kubernetes Engine (GKE)
Last updated
Last updated
Para automatizar nosso fluxo de entrega e integração, vimos nas seções passadas que as automações são, geralmente, realizadas em servidores. Assim, levamos o versionamento de código para um repositório centralizado: Gitlab. Também publicamos a nossa imagem Docker em um repositório centralizado: Docker Hub. Por fim, vamos servir nosso classificador em um serviço de Kubernetes e não mais na nossa própria máquina.
Para fins didáticos, vamos buscar um serviço de Kubernetes que possa ser utilizado de forma gratuita. O link abaixo nos apresenta algumas opções:
Opções Free Tier de Kubernetes
Nesse tutorial utilizaremos a Google Kubernetes Engine (GKE) da Google Cloud Platform (GCP).
O primeiro passo para provisionarmos um cluster Kubernetes é criarmos uma conta na google cloud.
Através desse link você pode configurar a sua conta. Para novos usuários, a GCP oferece U$300 de crédito para o uso de alguns serviços.
ATENÇÃO: Uma ferramenta cloud possui políticas de preço para cada serviço, então esteja sempre atento aos serviços que você está utilizando. De preferência, elimine os objetos criados após a aula para evitar cobranças inesperadas.
Para conferir os seus créditos e o período de trial, acesse o Menu do console > Faturamento > Visão Geral.
Para interagir com os serviços da GCP, podemos utilizar a UI do console Web ou podemos utilizar o terminal com o utilitário de linha de comando gcloud.
É recomendado o uso do utilitário gcloud, pois permite a reproducibilidade e automação das configurações que estamos realizando futuramente.
Temos duas opções para utilizar o gcloud CLI:
Via terminal do Cloud Shell
Via terminal da nossa estação de trabalho: Guia de instalação
Quickstart da configuração local
Para configuração local, devemos adicionar o pacote adicional gke-auth:
Na sequência, finalizamos a configuração da CLI com o comando abaixo:
Uma vez configurada, podemos listar a contas autenticadas:
Também podemos verificar informações da instalação:
Agora que já temos o pré-requisito da gcloud CLI atendido, podemos criar um cluster GKE usando a linha de comando:
Primeiro vamos criar um projeto
Vamos ativar esse projeto
Habilitando o uso da API do GKE
Conferindo se o serviço está habilitado
Criando um cluster no formato Autopilot
Conferindo o status do nosso cluster Kubernetes
Podemos conferir também pela UI, usando a rota: Console GCP > Kubernetes Engine > Clusters
Como fizemos nas seções anteriores, vamos primeiro realizar a implantação do nosso serviço "classificador" de forma manual para entendermos todos os passos e requisitos necessários. Assim, ficará mais claro como deve ser formato o script de automação.
Como vimos na sessão 5.3, para interagir e realizar o deploy de aplicações no Kubernetes, podemos utilizar o utilitário de linha de comando kubectl. Portanto, se você ainda não realizou a instalação desse binário volte na sessão mencionada e siga o tutorial de instalação.
Conferindo a instalação do kubectl:
Configurando os parâmetros de acesso ao GKE Cloud:
Agora podemos fazer um deployment "hello-world" para validar a configuração
Agora, vamos expor o serviço do classificador para acesso público:
Podemos validar o nosso serviço classificador entrando no endereço IP onde nossa aplicação está exposta:
Devemos ter um output com o External IP que podemos usar no nosso navegador para validar a aplicação
Também podemos analisar o output em yaml dos serviços criados, pois isso vai nos auxiliar na automação:
Na interface do GKE, podemos conferir o deployment criado pela rota: Console GCP > Kubernetes Engine > Cargas de trabalho:
Também na UI, podemos conferir os serviços criados e ter fácil acesso ou link do serviço pela rota: Console GCP > Kubernetes Engine > Serviços e Entradas:
Pra finalizar, vamos deletar os objetos criados:
Para implantar nossa aplicação no GKE de forma consistente e automatizada, vamos precisar usar um arquivo manifesto YAML para definir o estado desejado dos recursos do Kubernetes.
Crie o arquivo classificador.yaml
com a seguinte especificação:
Esse arquivo especifica dois objetos: Deployment e Service. O deployment faz o uso da imagem que estamos utilizando no curso para rodar a API do nosso classificador de produtos. Já o Service expõe essa API para acesso público por meio de um LoadBalance.
Após criar os manifestos dos objetos que vamos criar no GKE, basta utilizarmos o comando abaixo para realizar o deploy:
Podemos validar nossa aplicação listando o serviço criado e acessando o external IP.
Finalizado o teste do deploy manual, basta remover o deployment:
Com toda experimentação que realizamos, alguns pré-requisitos para a automação do nosso deploy ficam claros:
Precisamos dos binários da gcloud e do kubectl
Precisamos de uma autenticação na GCP
Precisamos da configuração do cluster GKE no kubectl
Na sequência, vamos resolver cada um desses items e criar nossa automação.
No deploy manual utilizamos nossa credencial pessoal para realizar a autenticação com o GCP. Na prática, automações de serviços cloud devem utilizar contas de serviço para se autenticar.
Para criar uma conta de serviço, podemos seguir os passos abaixo:
Criar uma conta de serviço
Uma identificação será criada para a conta de serviço com o seguinte padrão:
No caso de uma conta com o nome "gitlab-gke" e projeto com nome "mba-mle-ufscar":
Adicionar permissão de Agente de Serviço de Kubernetes Engine
Criar uma chave json de acesso
Encondar chave de acesso em base64
Agora, vamos utilizar o conteúdo do arquivo json encoded para criar nossa variável de ambiente no gitlab. Pra isso:
Acessar opção "Settings" no menu lateral do repositório no Gitlab
Opção CI/CD
Seção "Variables"
Criar a variável GKE_SERVICE_ACCOUNT
com o conteúdo base64 do arquivo json.
Com todos os pré-requisitos configurados, podemos enfim atualizar o nosso arquivo .gitlab-ci.yaml
:
Essa alteração adiciona uma stage de deploy que será responsável por criar a nossa aplicação dentro do GKE.
De forma detalhada, o script cumpre as seguintes funções:
Cria um arquivo de autenticação com a CLI do gcloud.
Autentica com a Google Cloud usando a conta de serviço configurada
Configura o cluster 'autopilot-cluster-ufscar' pra ser utilizado pelo utilitário kubectl
Aplica os manifestos dos objetos do Kubernetes, efetivando o deploy.
Na nossa automação estamos utilizando o comando de apply para criar a nossa aplicação.
Porém, como não estamos versionando as imagens docker com tags, nas próximas execuções do pipeline vamos nos deparar com um cenário indesejado. Ao realizar o apply de uma imagem com o mesmo nome, os manifestos yaml não apresentam nenhuma alteração. Assim, o Kubernetes entender que não alterações a serem aplicadas.
Para corrigir esse cenário, vamos criar um script bash chamado apply_and_restart.sh
que irá verificar se após o commando apply
temos um output de deployment unchanged
. Se esse for o cenário encontrado, faremos um restart do deployment. Isso irá forçar que o Kubernetes sempre baixe a versão do classificador mais recente disponível no Docker Hub.
Por fim, basta adicionar a chamada do script na nossa automação de CI/CD:
Como falamos no início dessa seção, é importante ter ciência das cobranças envolvidas em um ambiente cloud. Para finalizar nossa aula e evitar cobranças indevidas, vamos remover nosso cluster kubernetes utilizando a gcloud cli:
Documentação oficial: Como excluir um cluster GKE
Nesta seção demonstramos como configurar um ambiente de deploy Kubernetes na cloud com o serviço GKE. Também passamos por todo o passo a passo de automação desses tipos de deployment.
Apesar de ser um cenário inicial, os conceitos aplicados aqui permitem uma série de melhorias que podem ser utilizadas tanto em casos práticos como na continuidade da exploração de Continuous Deployment com esse exemplo. Seguem algumas sugestões:
Como configurar um ambiente de homologação e automatizar o deploy com múltiplas etapas
Como versionar as imagens docker por meio de tags de forma automatizada
Como criar templates de manifestos yaml de objetos Kubernetes para realizar configurações dinâmicas
Como adicionar probes na aplicação e automatizar um smoke test após deployment
Como realizar o rollback automático nos casos de deploys mal sucedidos
Como otimizar o tempo de execução do pipeline