Exercício – Criar uma ação do GitHub para implantar no AKS

Concluído

Neste exercício, você vai concluir as seguintes tarefas:

  • Aprimore a ação existente do GitHub para incluir um trabalho de implantação.
  • Verificar se as alterações são implantadas no cluster do AKS (Serviço de Kubernetes do Azure).
  • Reverter a implantação.

Atualizar o manifesto do Kubernetes para o serviço do produto

Para implantar novas versões do serviço de produto da eShop, edite o arquivo product.yml para apontar para o Registro de Contêiner do Azure (ACR) que você usou na unidade anterior.

  1. Em seu repositório bifurcado, selecione code tab e, em seguida, selecione o arquivo product.yml.

  2. Para editar o arquivo, selecione o ícone de edição (lápis).

  3. Edite a linha:

    containers:
      - image: [replace with your ACR name].azurecr.io/productservice:latest
    

    Substitua o [replace with your ACR name] pelo nome do ACR, por exemplo, acseshop186748394.

  4. No canto superior direito, selecione Fazer commit das alterações... em seguida, na caixa de diálogo, selecione Fazer commit das alterações.

Criar a ação de implantação

O código YAML adiciona uma etapa do GitHub que:

Tem uma etapa que implanta novas imagens. Estas são as etapas em um executor ubuntu-latest:

  1. Verifica o repositório no qual este arquivo se encontra.
  2. Logon do Azure entra no Azure com as credenciais da entidade de serviço.
  3. Configurar o kubelogin para logon não interativo configura o arquivo kubeconfig para autenticação do Azure.
  4. Obter o contexto do K8s define as credenciais do AKS (Serviço de Kubernetes do Azure) no arquivo do executor .kube/config.
  5. Implantar o aplicativo implanta o aplicativo no AKS, usando a imagem criada na etapa anterior e o arquivo de manifesto do Kubernetes que você editou anteriormente.

Realize as seguintes etapas para criar uma ação do GitHub que implanta o serviço de cupom:

  1. No repositório bifurcado, no code tab selecione a guia .github/workflows.

  2. Selecione azure-kubernetes-service.yml.

  3. Para editar o arquivo, selecione o ícone de edição (lápis).

  4. Na parte inferior do arquivo, cole o seguinte código YAML no editor:

    
      deploy:
        permissions:
          actions: read
          contents: read
          id-token: write
        runs-on: ubuntu-latest
        needs: [buildImage]
        steps:
          # Checks out the repository this file is in
          - uses: actions/checkout@v3
    
          # Logs in with your Azure credentials
          - name: Azure login
            uses: azure/login@v1.4.6
            with:
              creds: '${{ secrets.AZURE_CREDENTIALS }}'
    
          # Use kubelogin to configure your kubeconfig for Azure auth
          - name: Set up kubelogin for non-interactive login
            uses: azure/use-kubelogin@v1
            with:
              kubelogin-version: 'v0.0.25'
    
          # Retrieves your Azure Kubernetes Service cluster's kubeconfig file
          - name: Get K8s context
            uses: azure/aks-set-context@v3
            with:
              resource-group: ${{ env.RESOURCE_GROUP }}
              cluster-name: ${{ env.CLUSTER_NAME }}
              admin: 'false'
              use-kubelogin: 'true'
    
          # Deploys application based on given manifest file
          - name: Deploys application
            uses: Azure/k8s-deploy@v4
            with:
              action: deploy
              manifests: ${{ env.DEPLOYMENT_MANIFEST_PATH }}
              images: |
                ${{ env.AZURE_CONTAINER_REGISTRY }}.azurecr.io/${{ env.CONTAINER_NAME }}:${{ github.sha }}
              pull-images: false
    
    
  5. No canto superior direito, selecione Confirmar alterações... e, na caixa de diálogo, selecione Confirmar alterações.

Disparar uma implantação

Atualizar o arquivo azure-kubernetes-service.yml e fazer commit das alterações dispara automaticamente outra implantação. Agora veja como a alteração do código dispara outra implementação.

Você tem um novo produto que sua equipe de marketing gostaria de adicionar ao catálogo.

  1. No repositório bifurcado, no code tab selecione a pasta Products.

  2. Selecione a pasta Data .

  3. Selecione o arquivo ProductDataContext.c.

  4. Para editar o arquivo, selecione o ícone de edição (lápis).

  5. Na parte inferior do arquivo, adicione um novo produto à matriz products:

    new Product {  Name = "Camping Tent 2", Description = "This updated tent is improved and cheaper, perfect for your next trip.", Price = 79.99m, ImageUrl = "product9.png" },
    
  6. No canto superior direito, selecione Fazer commit das alterações... em seguida, na caixa de diálogo, selecione Fazer commit das alterações.

Monitorar a implantação

  1. Para monitorar o andamento da implantação, selecione a guia Actions.

  2. Selecione a execução do fluxo de trabalho mais recente listada para o fluxo de trabalho Build and deploy an app to AKS. O nome da execução é a mensagem de commit usada na etapa anterior.

  3. Selecione o trabalho deploy para ver os detalhes desta execução do fluxo de trabalho.

    Screenshot that shows the deploy job selected with a list of all the steps.

  4. No terminal, execute o comando a seguir para monitorar os pods do serviço de cupom no cluster do AKS. O sinalizador --selector filtra a lista para mostrar apenas os pods do serviço de cupom e o sinalizador --watch instrui o kubectl a inspecionar as alterações.

    kubectl get pods --selector=app=productservice --watch
    

    Durante a implantação, uma variação da seguinte saída é exibida:

    NAME                             READY   STATUS    RESTARTS   AGE
    productservice-7979d4c47-xlcrr   1/1     Running   0          17m
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     ContainerCreating   0          0s
    productservice-ff98b6d8d-7wmsh   1/1     Running             0          4s
    productservice-7979d4c47-xlcrr   1/1     Terminating         0          19m
    

    Na saída anterior, observe que um novo pod productservice foi criado. Quando o novo pod estiver pronto, o antigo será encerrado. Esse processo torna a transição para a nova versão o mais tranquila possível.

Verificar o aplicativo

Realize as seguintes etapas para verificar se o aplicativo ainda funciona:

  • Visualize o eShop implantado executando este comando no terminal:

    echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    

    O comando acima retorna o endereço IP externo do aplicativo Web. Mantenha CTRL pressionado e selecione o link para abrir o aplicativo em uma nova guia.

Vá para a página de produtos para exibir a nova tenda listada na parte inferior da página.

Reverter a implantação

Uma mitigação comum para problemas de produção é reverter para uma implantação válida conhecida. O Kubernetes mantém um histórico de implantação que pode ser usado para reverter para uma versão anterior do seu aplicativo.

Em seu terminal, execute este comando para remover a nova tenda que você acabou de adicionar ao site:

kubectl rollout undo deployment/productservice

Você deverá ver esta mensagem de console:

deployment.apps/productservice rolled back

Atualize a página de produtos no navegador e a nova tenda não deverá mais estar listada.

Observação

Em um cenário da vida real, você implanta os artefatos do build em vários ambientes. Por exemplo, você pode ter ambientes de desenvolvimento, teste e preparo. Você pode disparar fluxos de trabalho de implantação por eventos como mesclagem de PRs. Você pode adicionar condições de qualidade ou aprovação, como a aprovação do PR por um stakeholder, para evitar implantações inesperadas na produção.

Verifique seu conhecimento

1.

Qual é o melhor lugar para armazenar informações confidenciais, como credenciais, para o GitHub Actions?

2.

Qual é a finalidade de criar uma entidade de serviço do Azure Active Directory para usar no GitHub Actions?

3.

Durante a implantação da atualização, por que o AKS cria um contêiner enquanto o antigo ainda está em execução?