Kubernetes + Azure DevOps: build e deployment automatizado de aplicações

Renato Groffe
8 min readMar 9, 2020

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:

--

--

Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker