Kubernetes + Azure DevOps: build e deployment automatizado de aplicações
Em um artigo anterior demonstrei como configurar passo a passo o build e o deployment automatizados de projetos baseados em Docker no Azure DevOps, fazendo uso para isto de um projeto ASP.NET Core 3.1 e do Azure Web App for Containers para a hospedagem da aplicação em questão. Para o armazenamento das imagens geradas durante o build utilizei ainda o Azure Container Registry:
Docker + Azure DevOps: build e deployment automatizado de aplicações
Neste novo tutorial abordarei o mesmo tipo de procedimento empregando o Azure DevOps e desta vez o Azure Kubernetes Service. A intenção com isso é demonstrar o suporte que o Azure DevOps nos oferece para o deployment de aplicações em um cluster Kubernetes.
E aproveito este espaço para deixar aqui um convite.
Que tal aprender mais sobre Docker, Kubernetes e a implementação de soluções baseadas em containers utilizando o Microsoft Azure, em um workshop que acontecerá durante um sábado (dia 04/04/2020) em São Paulo Capital e implementando um case na prática?
Acesse então o link a seguir para efetuar sua inscrição (inclui camiseta, emissão de certificado e almoço para todos os participantes) com desconto:
http://bit.ly/anp-docker-blog-groffe
Informações sobre o projeto no GitHub
Utilizarei mais uma vez o seguinte projeto:
https://github.com/renatogroffe/ASPNETCore3.1-API-REST_Docker-Alpine
Optei na prática por duplicar este repositório, uma vez que em tal cópia serão gravados arquivos com configurações de build/deployment para um cluster Kubernetes do Azure Pipelines.
Na listagem a seguir temos o conteúdo do arquivo Dockerfile, em que estão referenciadas as imagens Alpine do SDK do .NET Core 3.1 (para restauração de pacotes e build da aplicação) e do runtime do ASP.NET Core 3.1 (com o ambiente necessário para a execução da API REST a partir de um container):
Recursos a serem criados no Microsoft Azure
Um recurso do Azure Container Registry chamado groffeazuredevops foi criado para este tutorial:
Maiores informações sobre como criar um recurso do Azure Container Registry podem ser encontradas no tutorial mencionado no início deste artigo.
Para o exemplo aqui descrito foi necessário ainda gerar um cluster Kubernetes, com isto acontecendo por meio da utilização do Azure Kubernetes Service (AKS):
A criação de um novo recurso do AKS também foi descrita em detalhes no seguinte artigo que produzi para o portal Microsoft Tech:
Orquestração de containers na Nuvem com o Azure Kubernetes Service (AKS) | Microsoft Tech
Criando um novo projeto do Azure DevOps
Projetos do Azure DevOps encontram-se agrupados em Organizations. Para o exemplo descrito nesse tutorial será utilizada uma Organization chamada groffe-demos.
Acionar dentro da Organization a opção + New project:
Preencher então os campos Project name e Description, selecionando ainda a opção Private , Git em Version control, Basic em Worker item process e finalmente clicando na opção Create:
Na próxima imagem aparecerá o projeto APIContagem-TutorialKubernetes já criado:
Implementando o Pipeline para build e deployment automatizados
Será por meio do Azure Pipelines que definiremos o processo automatizado (pipeline) de build de imagens Docker e deployment em um cluster Kubernetes para o projeto APIContagem-TutorialKubernetes. Na seção Summary deste projeto acessar na barra lateral Pipelines > Pipelines, como indicado na imagem a seguir:
Acessar agora a opção Create Pipeline:
Em Where is your code? selecionar a opção GitHub YAML:
Já em Select a repository definir o repositório do GitHub ao qual estará atrelado o pipeline de build:
Será solicitada neste momento a autenticação junto ao GitHub. Realizado este procedimento, aparecerá agora uma tela com informações do Azure Pipelines:
Descer então com a barra de rolagem até o final da página, certificando-se de que o repositório escolhido está selecionado em Repository access. Confirmar esta escolha acionando o botão Approve and install:
Em Configure your pipeline selecionar a opção Deploy to Azure Kubernetes Service, a fim de iniciar a montagem do pipeline com um mínimo de configurações:
Em Deploy to Azure Kubernetes Service selecionar a Azure subscription em que se encontram o cluster do AKS e o Container Registry criados anteriormente:
Após a autenticação no Microsoft Azure aparecerá agora o painel Deploy to Azure Kubernetes Service com os campos para a seleção do Azure Container Registry e do cluster Kubernetes:
- Em Cluster selecionar o recurso do AKS (AKSCluster);
- Já em Namespace marcar a opção New, informando um namespace para a criação dos recursos no Kubernetes (tutorialartigo);
- Em Container Registry selecionar o recurso criado anteriormente para armazenamento de imagens (groffeazuredevops);
- Em Image Name preencher o nome da imagem Docker gerada durante o build (apicontagem);
- Para o campo Service Port manter a porta 80, que será utilizada no acesso à API REST representada pelo projeto de testes.
Concluir este procedimento acionando o botão Validate and configure.
A partir da tela Revise your pipeline YAML será possível editar as configurações do pipeline:
Localizar o ponto no qual se encontra a task para build e push da imagem no Azure Container Registry:
Incluir logo após $(tag) o valor latest, a fim de gerar uma imagem Docker também com esta tag (uma convenção adotada para a mais recente imagem criada em um Container Registry). Já a expressão $(tag) conterá o BuildId do projeto do Azure DevOps (com a geração de uma imagem cuja tag será identificada por este valor):
Após esse ajuste o pipeline contará com o seguinte código YAML:
Concluir a configuração deste pipeline acionando a opção Save and run:
Em Save and run:
- Definir uma mensagem para o campo Commit message;
- Uma descrição opcional poderá ser informada em Optional extended description;
- Serão adicionados 3 arquivos ao repositório do GitHub como indicado em Files to be added to your repository;
- Manter selecionada a opção Commit directly to the master branch (trabalharemos apenas com a branch master no exemplo deste tutorial).
Acionar finalmente o botão Save and run.
Neste momento terá início um Job para build e deployment da aplicação de testes (estágios destacados em vermelho):
Clicando sobre os Stages podemos observar o andamento dos mesmos:
Após algum tempo o status do Job indicará que os stages de Build e Deploy tiveram sucesso(ícones em verde):
Observando o repositório no GitHub será possível notar a presença do arquivo azure-pipelines.yml e do diretório manifests, gerados via Azure DevOps e no qual constam as definições de build/deployment:
O diretório manifests conterá os arquivos YAML com as definições para a criação dos objetos Deployment e Service, bem como do Pod no qual a aplicação será executada. Para escalar a aplicação podemos alterar o arquivo deployment.yml indicando o número de réplicas/instâncias da mesma:
Acessando o recurso do Azure Container Registry criado na seção anterior será possível notar a presença da imagem apicontagem em Repositories:
Clicando sobre esta imagem serão listadas as diferentes tags/versões existentes para a mesma (81 e latest, que basicamente correspondem à mesma imagem):
Ao acessar via PowerShell as estruturas do namespace tutorialartigo teremos o Deployment, o Pod e o Service criados para a aplicação de testes:
Um teste de acesso à API que está no IP público 23.96.122.184 trará como resultado:
Testando o build e deployment automatizados
A gravação de uma alteração na branch master fará com que o processo de build e deployment seja disparado automaticamente. A fim de simular isto farei uma alteração no arquivo ContadorController.cs (a mudança realizada aqui foi no conteúdo da propriedade Local):
Acessando o pipeline no Azure DevOps será possível constatar que um novo processo de build e deployment está em execução:
Na imagem a seguir visualizamos detalhes deste processo:
Concluída a execução do pipeline a execução do comando kubectl get pods mostrará que um novo Pod foi gerado para a aplicação:
Um teste via browser trará o nome do novo Pod (propriedade machineName), bem como o conteúdo alterado para a propriedade Local: