Compile e implante no Serviço de Kubernetes do Azure com o Azure Pipelines

Azure DevOps Services

Use o Azure Pipelines para implantar automaticamente no AKS (Serviço de Kubernetes do Azure). O Azure Pipelines permite criar, testar e implantar com CI (integração contínua) e CD (entrega contínua) usando o Azure DevOps.

Neste artigo, aprenda a criar um pipeline que compila e implanta continuamente seu aplicativo. Sempre que você altera seu código em um repositório que contém um Dockerfile, as imagens são enviadas ao Registro de Contêiner do Azure e os manifestos são implantados em seu cluster do AKS.

Pré-requisitos

Obter o código

Crie fork para o seguinte repositório contendo um aplicativo de exemplo e um Dockerfile:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Criar os recursos do Azure

Entre no portal do Azure e pressione o botão Cloud Shell no canto superior direito. Use a CLI do Azure ou o PowerShell para criar um cluster do AKS.

Criar um registro de contêiner

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

Entrar no Azure Pipelines

Entre no Azure Pipelines. Depois de entrar, o navegador vai para https://dev.azure.com/my-organization-name e exibe o painel do Azure DevOps.

Na organização selecionada, crie um projeto. Se você não tiver nenhum projeto em sua organização, verá uma tela Criar um projeto para começar. Caso contrário, selecione o botão Criar Projeto no canto superior direito do painel.

Criar o pipeline

Conectar e selecionar seu repositório

  1. Entre na organização do Azure DevOps e acesse seu projeto.

  2. Acesse Pipelines e selecione Novo pipeline.

  3. Percorra as etapas do assistente selecionando primeiro o GitHub como o local do código-fonte.

  4. Você pode ser redirecionado para o GitHub para então entrar. Nesse caso, insira suas credenciais do GitHub.

  5. Quando a lista de repositórios for exibida, selecione o repositório.

  6. Você poderá ser redirecionado ao GitHub para instalar o aplicativo do Azure Pipelines. Se sim, selecione Aprovar e instalar.

  7. Selecione Implantar no Serviço de Kubernetes do Azure.

  8. Se for solicitado, selecione a assinatura na qual você criou o registro e o cluster.

  9. Selecione o cluster myapp.

  10. Para Namespace, selecione Existente e, em seguida, padrão.

  11. Selecione o nome do registro de contêiner.

  12. Você pode manter o nome da imagem definido como padrão.

  13. Defina a porta de serviço como 8080.

  14. Marque a caixa de seleção Habilitar aplicativo de revisão para solicitações de pull para que a configuração relacionada ao aplicativo de revisãoseja incluída no YAML gerado automaticamente pelo YAML nas etapas subsequentes.

  15. Selecione Validate and configure.

    Conforme o Azure Pipelines cria o pipeline, o processo fará o seguinte:

    • Criará uma conexão de serviço do registro do Docker para permitir que o pipeline envie imagens ao registro de contêiner.

    • Criará um ambiente e um recurso do Kubernetes nele. Para um cluster habilitado para RBAC, o recurso Kubernetes criado cria implicitamente os objetos ServiceAccount e RoleBinding no cluster para que o ServiceAccount criado não possa executar operações fora do namespace escolhido.

    • Gerará um arquivo azure-pipelines.yml que definirá seu pipeline.

    • Gerará arquivos de manifesto do Kubernetes. Esses arquivos são gerados por meio da hidratação dos modelos deployment.yml e service.yml com base nas seleções feitas. Ao final, selecione Salvar e executar.

  16. Selecione Salvar e executar.

  17. Você pode alterar a Mensagem de confirmação para algo como Adicionar pipeline ao nosso repositório. Quando você estiver pronto, selecione Salvar e executar para confirmar o novo pipeline no repositório e, em seguida, iniciar a primeira execução dele!

Ver a implantação do aplicativo

À medida que o pipeline é executado, observe como o estágio de compilação e, em seguida, o estágio de implantação mudam a cor de azul (em execução) para verde (concluído). É possível selecionar os estágios e trabalhos para observar seu pipeline em ação.

Observação

Com um agente hospedado pela Microsoft, você deve adicionar o intervalo de IP dele ao firewall. Obtenha a lista semanal de intervalos de IP no arquivo JSON semanal, que é publicado toda quarta-feira. Os novos intervalos de IP entram em vigor na segunda-feira seguinte. Para saber mais, confira Agentes hospedados pela Microsoft. Para encontrar os intervalos de IP necessários para sua organização do Azure DevOps, saiba como identificar os intervalos de IP possíveis para agentes hospedados pela Microsoft.

Depois da execução do pipeline, veja o que aconteceu e o aplicativo implantado. No resumo do pipeline:

  1. Selecione a guia Ambientes.

  2. Selecione Exibir ambiente.

  3. Selecione a instância do aplicativo para o namespace no qual ele foi implantado. Se você usou os padrões, é o aplicativo myapp no namespace padrão.

  4. Selecione a guia Serviços.

  5. Selecione e copie o endereço IP externo para a área de transferência.

  6. Abra uma nova guia ou janela do navegador e digite <Endereço IP>:8080.

Se você estiver compilando o aplicativo de exemplo, Hello world aparecerá em seu navegador.

Como o pipeline é compilado

Quando você selecionou as opções e, em seguida, validou e configurou o pipeline, o Azure Pipelines criou um pipeline para você com o modelo Implantar no Serviço de Kubernetes do Azure.

O estágio de compilação usa a tarefa do Docker para criar e enviar a imagem ao Registro de Contêiner do Azure.

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

O trabalho de implantação usa a tarefa de manifesto do Kubernetes para criar o imagePullSecret necessário para os nós de cluster do Kubernetes a fim de efetuar pull do recurso do Registro de Contêiner do Azure. Em seguida, os arquivos de manifesto são usados ​​pela tarefa de manifesto do Kubernetes na implantação no cluster do Kubernetes. Os arquivos de manifesto, service.yml e deployment.yml, foram gerados quando você usou o modelo Implantar no Serviço de Kubernetes do Azure.

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment.yml
                $(System.ArtifactsDirectory)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

Limpar os recursos

Ao concluir a criação de recursos, você pode usar o seguinte comando para excluí-los:

az group delete --name myapp-rg

Insira y quando solicitado.

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Use o Azure Pipelines para implantar automaticamente no AKS (Serviço de Kubernetes do Azure). O Azure Pipelines permite criar, testar e implantar com CI (integração contínua) e CD (entrega contínua) usando o Azure DevOps.

Neste artigo, aprenda a criar um pipeline que compila e implanta continuamente seu aplicativo. Sempre que você altera seu código em um repositório que contém um Dockerfile, as imagens são enviadas ao Registro de Contêiner do Azure e os manifestos são implantados em seu cluster do AKS.

Pré-requisitos

Obter o código

Crie fork para o seguinte repositório contendo um aplicativo de exemplo e um Dockerfile:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Criar os recursos do Azure

Entre no portal do Azure e pressione o botão Cloud Shell no canto superior direito. Use a CLI do Azure ou o PowerShell para criar um cluster do AKS.

Criar um registro de contêiner

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys 

Configurar autenticação

Ao usar o ACR (Registro de Contêiner do Azure) com o AKS (Serviço de Kubernetes do Azure), estabeleça um mecanismo de autenticação. Isso pode ser feito de duas maneiras:

  1. Conceda acesso do AKS ao ACR. Confira Autenticar-se com o Registro de Contêiner do Azure no Serviço de Kubernetes do Azure.

  2. Use um segredo de pull de imagem do Kubernetes. Um segredo de pull de imagem pode ser criado usando a tarefa de implantação do Kubernetes.

Criar um pipeline de lançamento

O pipeline de compilação usado para configurar o CI já criou uma imagem do Docker e a enviou para um Registro de Contêiner do Azure. Também empacotou e publicou um gráfico do Helm como um artefato. No pipeline de lançamento, implantaremos a imagem de contêiner como um aplicativo Helm no cluster do AKS.

  1. No Azure Pipelines, abra o resumo da compilação.

  2. No resumo da compilação, escolha o ícone Lançamento para iniciar um novo pipeline de lançamento.

    Se você já criou um pipeline de lançamento que usa esses artefatos de compilação, será solicitado a criar um novo lançamento. Nesse caso, acesse a página Lançamentos e inicie um novo pipeline de lançamento selecionando o ícone +.

  3. Selecione o modelo Trabalho vazio.

  4. Abra a página Tarefas e selecione Tarefa do agente.

  5. Escolha + para adicionar uma nova tarefa e uma tarefa do instalador de ferramenta do Helm. Isso garante que o agente que executa as tarefas subsequentes tenha o Helm e o Kubectl instalados nele.

  6. Escolha + novamente e adicione uma tarefa Empacotar e implantar gráficos do Helm. Defina as configurações dessa tarefa da seguinte maneira:

    • Tipo de conexão: selecione Azure Resource Manager para se conectar a um cluster do AKS usando uma conexão de serviço do Azure. Como alternativa, para se conectar a qualquer cluster do Kubernetes usando o kubeconfig ou uma conta de serviço, selecione Conexão do Serviço de Kubernetes. Nesse caso, você precisará criar e selecionar uma conexão de serviço do Kubernetes em vez de uma assinatura do Azure para a configuração a seguir.

    • Assinatura do Azure: selecione uma conexão na lista em Conexões de serviço do Azure disponíveis ou crie uma conexão de permissões mais restritas para sua assinatura do Azure. Se você encontrar um botão Autorizar ao lado da entrada, use-o para autorizar a conexão com a assinatura do Azure. Se você não encontrar a assinatura do Azure necessária na lista de assinaturas, confira Criar uma conexão de serviço do Azure para configurar manualmente a conexão.

    • Grupo de recursos: insira ou selecione o grupo de recursos que contém seu cluster do AKS.

    • Cluster do Kubernetes: insira ou selecione o cluster do AKS criado.

    • Comando: selecione init como o comando do Helm. Isso instala o Tiller no cluster do Kubernetes em execução. Também definirá qualquer configuração local necessária. Marque Usar versão de imagem canário para instalar a versão de pré-lançamento mais recente do Tiller. Você também pode optar por atualizar o Tiller se ele estiver pré-instalado marcando Atualizar o Tiller. Se essas opções estiverem habilitadas, a tarefa executa helm init --canary-image --upgrade

  7. Escolha + em Tarefa do agente e adicione outra tarefa Empacotar e implantar gráficos do Helm. Defina as configurações dessa tarefa da seguinte maneira:

    • Cluster do Kubernetes: insira ou selecione o cluster do AKS criado.

    • Namespace: insira o namespace do cluster do Kubernetes no qual você deseja implantar o aplicativo. O Kubernetes dá suporte a diversos clusters virtuais apoiados pelo mesmo cluster físico. Esses clusters virtuais são chamados de namespaces. É possível usar namespaces para criar ambientes diferentes, como de desenvolvimento, teste e preparação, no mesmo cluster.

    • Comando: selecione atualizar como o comando do Helm. É possível executar qualquer comando do Helm usando esta tarefa e transmitir opções de comando como argumentos. Ao selecionar atualizar, a tarefa mostra mais alguns campos:

      • Tipo de gráfico: selecione Caminho do arquivo. Como alternativa, é possível especificar o Nome do gráfico para determinar uma URL ou um nome de gráfico. Por exemplo, se o nome do gráfico for stable/mysql, a tarefa executa helm upgrade stable/mysql

      • Caminho do gráfico: pode ser um caminho para um gráfico empacotado ou um diretório de gráficos descompactado. Neste exemplo, você está publicando o gráfico com uma compilação do CI, portanto, selecione o pacote de arquivos usando o seletor de arquivos ou digite $(System.DefaultWorkingDirectory)/**/*.tgz

      • Nome da versão: insira um nome para sua versão, por exemplo, azuredevops

      • Recriar pods: marque esta caixa de seleção se houver uma alteração de configuração durante o lançamento e você quiser substituir um pod em execução pela nova configuração.

      • Redefinir valores: marque esta caixa de seleção para que os valores integrados ao gráfico substituam todos os valores fornecidos pela tarefa.

      • Forçar: marque esta caixa de seleção se ocorrerem conflitos e você quiser atualizar e reverter para excluir, recriar o recurso e reinstalar a versão completa. Isso é útil em cenários em que a aplicação de patches pode falhar (por exemplo, para serviços porque o endereço IP do cluster é imutável).

      • Argumentos: insira os argumentos do comando do Helm e seus valores; para este exemplo --set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId) Confira esta seção para compreender porque estamos usando esses argumentos.

      • Habilitar TLS: marque esta caixa de seleção para habilitar conexões fortes baseadas em TLS entre o Helm e o Tiller.

      • Certificado de AC: especifique um certificado de AC a ser carregado e usado para emitir certificados para os clientes Tiller e Helm.

      • Certificado: especifique o certificado Tiller ou o certificado do cliente do Helm

      • Chave: especifique a chave do Tiller ou a chave do cliente do Helm

  8. Na página Variáveis ​​do pipeline, adicione uma variável chamada imageRepoName e defina o valor para o nome do repositório de imagens do Helm. Normalmente, ela está no formato example.azurecr.io/coderepository

  9. Salve o pipeline de lançamento.

Argumentos usados ​​na tarefa de atualização do Helm

No pipeline de compilação, a imagem do contêiner com a tag $(Build.BuildId) é enviada para um Registro de Contêiner do Azure. Em um gráfico do Helm, é possível parametrizar os detalhes da imagem do contêiner, como o nome e a tag, pois o mesmo gráfico pode ser usado para implantações em diferentes ambientes. Esses valores também podem ser especificados no arquivo values.yaml ou substituídos por um arquivo de valores fornecido pelo usuário, que pode ser substituído por parâmetros --set durante a instalação ou a atualização do Helm.

Neste exemplo, aprovamos os seguintes argumentos:

--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId)

O valor de $(imageRepoName) foi definido na página Variáveis (ou na seção variáveis do arquivo YAML). Como alternativa, você pode substituí-lo diretamente pelo nome do repositório de imagens no valor de argumentos --set ou no arquivo values.yaml. Por exemplo:

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

Outra alternativa é definir a opção Definir valores da tarefa para especificar os valores de argumento como pares chave-valor separados por vírgula.

Criar uma versão para implantar o aplicativo

Agora você está pronto para criar uma versão, o que significa iniciar o processo de execução do pipeline de lançamento com os artefatos produzidos por uma compilação específica. Isso resulta na implantação da compilação:

  1. Escolha + Versão e selecione Criar versão.

  2. No painel Criar nova versão, verifique se a versão do artefato que você deseja usar está selecionada e escolha Criar.

  3. Escolha o link de versão na mensagem da barra de informações. Por exemplo: "A versão Release-1 foi criada".

  4. Na visualização do pipeline, escolha o link de status nos estágios do pipeline para ver os logs e a saída do agente.