Esercizio - Creare un'azione GitHub da distribuire nel servizio Azure Kubernetes

Completato

In questo esercizio si completeranno le seguenti attività:

  • Migliorare l'azione GitHub esistente per includere un processo di distribuzione.
  • Verificare che le modifiche vengano distribuite nel cluster servizio Azure Kubernetes.
  • Eseguire il rollback della distribuzione.

Aggiornare il manifesto Kubernetes per il servizio dei prodotti

Per distribuire nuove versioni del servizio dei prodotti eShop, modificare il file product.yml in modo che punti al Registro Azure Container usato nell'unità precedente.

  1. Nel repository di cui è stata creata una copia tramite fork, selezionare la code tab e quindi selezionare il file product.yml.

  2. Per modificare il file, selezionare l'icona di modifica (matita).

  3. Modificare la riga:

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

    Sostituire [replace with your ACR name] con il nome del Registro Azure Container, ad esempio, acseshop186748394.

  4. In alto a destra selezionare Commit delle modifiche e quindi nella finestra di dialogo selezionare Commit delle modifiche.

Creare l'azione di distribuzione

Il codice YAML aggiunge un passaggio GitHub che:

Include un passaggio che distribuisce nuove immagini. Ecco i passaggi di uno strumento di esecuzione ubuntu-latest:

  1. Estrae il repository in cui si trova questo file.
  2. L'account di accesso d Azure accede ad Azure utilizzando le credenziali dell'entità servizio.
  3. La configurazione di kubelogin per l'accesso non interattivo configura il file kubeconfig per l'autenticazione di Azure.
  4. Il passaggio di recupero del contesto K8 imposta le credenziali del servizio Azure Kubernetes nel file dello strumento di esecuzione .kube/config.
  5. Il passaggio di distribuzione dell'applicazione distribuisce l'applicazione nel servizio Azure Kubernetes, usando l'immagine compilata nel passaggio precedente e il file manifesto di Kubernetes modificato in precedenza.

Completare la procedura seguente per creare un'azione GitHub che distribuisce il servizio di gestione dei coupon:

  1. Nel repository di cui è stata creata una copia tramite fork, nella scheda code tab selezionare la scheda .github/workflows.

  2. Selezionare azure-kubernetes-service.yml.

  3. Per modificare il file, selezionare l'icona di modifica (matita).

  4. Alla fine del file, incollare il codice YAML seguente nell'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. In alto a destra selezionare Commit delle modifiche e quindi nella finestra di dialogo selezionare Commit delle modifiche.

Attivare una distribuzione

L'aggiornamento del file azure-kubernetes-service.yml e il commit delle modifiche attiva automaticamente un'altra distribuzione. Vedremo ora come apportare una modifica del codice attiva un'altra distribuzione.

Si supponga di disporre di un nuovo prodotto che il team di marketing vuole aggiungere al catalogo.

  1. Nel repository di cui è stata creata una copia tramite fork, nella code tab selezionare la cartella Products.

  2. Selezionare la cartella Data .

  3. Selezionare il file ProductDataContext.c.

  4. Per modificare il file, selezionare l'icona di modifica (matita).

  5. Alla fine del file aggiungere un nuovo prodotto alla matrice 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. In alto a destra selezionare Commit delle modifiche e quindi nella finestra di dialogo selezionare Commit delle modifiche.

Monitorare la distribuzione

  1. Per monitorare lo stato di avanzamento della distribuzione, selezionare la scheda Actions.

  2. Selezionare l'esecuzione del flusso di lavoro più recente elencata per il flusso di lavoro Build and deploy an app to AKS. Il nome dell'esecuzione è il messaggio di commit usato nel passaggio precedente.

  3. Selezionare il processo deploy per visualizzare i dettagli di questa esecuzione del flusso di lavoro.

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

  4. Nel terminale, eseguire il comando seguente per monitorare i pod del servizio di gestione dei coupon nel cluster del servizio Azure Kubernetes. Il flag --selector filtra l'elenco solo in base ai pod per il servizio di gestione dei coupon e il flag --watch indica a kubectl di controllare le modifiche.

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

    Durante la distribuzione viene visualizzata una variante dell'output seguente:

    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
    

    Nell'output precedente, osservare che è stato creato un nuovo pod productservice. Quando il nuovo pod è pronto, quello precedente viene terminato. Questo processo semplifica al massimo il passaggio alla nuova versione.

Verificare l'app

Completare i passaggi seguenti per verificare che l'app funzioni ancora:

  • Visualizzare l'app eShop distribuita eseguendo questo comando nel terminale:

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

    Il comando precedente restituisce l'indirizzo IP esterno per l'app Web. Tenere premuto CTRL e selezionare il collegamento per aprire l'app in una nuova scheda.

Passare alla pagina dei prodotti per visualizzare la nuova tenda elencata nella parte inferiore della pagina.

Eseguire il rollback della distribuzione

Una mitigazione comune per i problemi di produzione è il ripristino di una versione della distribuzione riuscita nota. Kubernetes mantiene aggiornata una cronologia delle distribuzioni che è possibile usare per eseguire il rollback a una versione precedente dell'app.

Nel terminale eseguire questo comando per rimuovere la nuova tenda appena aggiunta al sito Web:

kubectl rollout undo deployment/productservice

Verrà visualizzato questo messaggio della console:

deployment.apps/productservice rolled back

Aggiornare la pagina dei prodotti nel browser. La nuova tenda non dovrebbe più essere elencata.

Nota

In uno scenario reale, si distribuiscono gli artefatti della compilazione in più ambienti. Ad esempio potranno essere presenti ambienti di sviluppo, test e gestione temporanea. È possibile attivare i flussi di lavoro di distribuzione in base a eventi quali l'unione di richieste pull. Per evitare distribuzioni impreviste nell'ambiente di produzione, è possibile aggiungere soglie di qualità o approvazione, ad esempio l'approvazione della richiesta pull da parte di uno stakeholder.

Verificare le conoscenze

1.

Qual è il posto migliore per archiviare informazioni sensibili, ad esempio credenziali, per GitHub Actions?

2.

Qual è lo scopo della creazione di un'entità servizio di Azure Active Directory che possa essere usata per GitHub Actions?

3.

Durante la distribuzione dell'aggiornamento, perché il servizio Azure Kubernetes crea un nuovo contenitore mentre quello precedente è ancora in esecuzione?