Ejercicio: Creación de una acción de GitHub para implementarla en AKS

Completado

En este ejercicio, completará las siguientes tareas:

  • Mejore la acción de GitHub existente para incluir un trabajo de implementación.
  • Comprobar que los cambios se implementan en el clúster de Azure Kubernetes Service (AKS).
  • Revertir la implementación.

Actualización del manifiesto de Kubernetes del servicio de producto

Para implementar nuevas versiones del servicio de producto eShop, edite el archivo product.yml para que apunte al Azure Container Registry (ACR) que usó en la unidad anterior.

  1. En el repositorio bifurcado, seleccione el code tab y, a continuación, seleccione el archivo product.yml.

  2. Para editar el archivo, seleccione el icono de edición (lápiz).

  3. Edite la línea:

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

    Reemplace [replace with your ACR name] por el nombre de su ACR; por ejemplo, acseshop186748394.

  4. En la parte superior derecha, seleccione Confirmar cambios... y, en el cuadro de diálogo, seleccione Confirmar cambios.

Creación de una acción de implementación

El código YAML agrega un paso de GitHub que:

Tiene un paso que implementa nuevas imágenes. Estos son los pasos de un ejecutor ubuntu-latest:

  1. Extrae el repositorio en el que se encuentra este archivo.
  2. Inicio de sesión de Azure inicia sesión en Azure con las credenciales de la entidad de servicio.
  3. Configurar kubelogin para el inicio de sesión no interactivo configura el archivo kubeconfig para la autenticación de Azure.
  4. Obtener contexto de K8s establece las credenciales de Azure Kubernetes Service (AKS) en el archivo .kube/config del ejecutor.
  5. Implementa la aplicación implementa la aplicación en AKS mediante la imagen integrada en el paso anterior y el archivo de manifiesto de Kubernetes que editó anteriormente.

Complete los pasos siguientes para crear una acción de GitHub que implemente el servicio de cupones:

  1. En el repositorio bifurcado, en code tab, seleccione la pestaña .github/workflows.

  2. Seleccione azure-kubernetes-service.yml.

  3. Para editar el archivo, seleccione el icono de edición (lápiz).

  4. En la parte inferior del archivo, pegue el siguiente código YAML en el 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. En la parte superior derecha, seleccione Confirmar cambios... y en el cuadro de diálogo seleccione Confirmar cambios.

Desencadenar una implementación

La actualización del archivo azure-kubernetes-service.yml y la confirmación de los cambios desencadenan automáticamente otra implementación. Ahora vea cómo realizar un cambio de código desencadena otra implementación.

Tiene un nuevo producto que el equipo de marketing desea agregar al catálogo.

  1. En el repositorio bifurcado, en code tab, seleccione la carpeta Products.

  2. Seleccione la carpeta Data.

  3. Seleccione el archivo ProductDataContext.c.

  4. Para editar el archivo, seleccione el icono de edición (lápiz).

  5. En la parte inferior del archivo, agregue un nuevo producto a la 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. En la parte superior derecha, seleccione Confirmar cambios... y, en el cuadro de diálogo, seleccione Confirmar cambios.

Supervisa la implementación.

  1. Para supervisar el progreso de la implementación, seleccione la pestaña Actions.

  2. Seleccione la ejecución del flujo de trabajo más reciente para el flujo de trabajo Build and deploy an app to AKS. El nombre de la ejecución es el mensaje de confirmación usado en el paso anterior.

  3. Seleccione el trabajo deploy para ver los detalles de esta ejecución de flujo de trabajo.

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

  4. En el terminal, ejecute el siguiente comando para supervisar los pods del servicio de cupones en el clúster de AKS. La marca --selector filtra la lista solo para pods para el servicio de cupones y la marca --watch indica a kubectl que inspeccione los cambios.

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

    Durante la implementación, aparece una variación de la salida siguiente:

    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
    

    En la salida anterior, observe que se crea un nuevo pod productservice. Cuando el nuevo pod esté listo, el antiguo se termina. Este proceso hace que la transición a la nueva versión sea lo más fluida posible.

Comprobación de la aplicación

Complete los pasos siguientes para comprobar que la aplicación sigue funcionando:

  • Para ver eShop implementado, ejecute este comando en el terminal:

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

    El comando anterior devuelve la dirección IP externa de la aplicación web. Mantenga presionada la tecla CTRL y seleccione en el vínculo para abrir la aplicación en una nueva pestaña.

Vaya a la página de productos para ver la nueva tienda que aparece en la parte inferior de la página.

Reversión de la implementación

Una mitigación común durante las incidencias de producción consiste en revertir una implementación a una implementación válida conocida. Kubernetes mantiene un historial de implementación que puede usar para volver a una versión anterior de la aplicación.

En el terminal, ejecute este comando para quitar la nueva tienda que acaba de agregar al sitio web:

kubectl rollout undo deployment/productservice

Debería ver este mensaje de la consola:

deployment.apps/productservice rolled back

Actualice la página de productos en el explorador y la nueva tienda ya no debería aparecer.

Nota:

En un escenario real, se implementan los artefactos de la compilación en varios entornos. Por ejemplo, podría tener entornos de desarrollo, pruebas y ensayo. Puede desencadenar flujos de trabajo de implementación mediante eventos como combinar PR. Puede agregar puertas de calidad o aprobaciones, como una aprobación de PR de una parte interesada, para prevenir implementaciones inesperadas en producción.