Compilación e implementación en Azure Kubernetes Service con Azure Pipelines

Azure DevOps Services

Use Azure Pipelines para la implementación automática en Azure Kubernetes Service (AKS). Azure Pipelines permite compilar, probar e implementar con integración continua (CI) y entrega continua (CD) mediante Azure DevOps.

En este artículo, verá cómo crear una canalización que compila e implementa la aplicación continuamente. Cada vez que modifique el código de un repositorio que contenga un archivo Dockerfile, las imágenes se insertarán en Azure Container Registry y los manifiestos se implementarán en el clúster de AKS.

Requisitos previos

Obtención del código

Bifurque el repositorio siguiente que contiene una aplicación de ejemplo y un Dockerfile:

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

Creación de recursos de Azure

Inicie sesión en Azure Portal y, a continuación, seleccione el botón de Cloud Shell en la esquina superior derecha. Use la CLI de Azure o PowerShell para crear un clúster de AKS.

Creación de un Registro de contenedor

# 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

Inicio de sesión en Azure Pipelines

Inicie sesión en Azure Pipelines. Una vez que haya iniciado sesión, el explorador accederá a https://dev.azure.com/my-organization-name y aparecerá el panel de Azure DevOps.

En la organización seleccionada, cree un proyecto. Si no tiene ningún proyecto en la organización, aparecerá la pantalla Cree un proyecto para empezar. De lo contrario, seleccione el botón Crear proyecto en la esquina superior derecha del panel.

Creación de la canalización

Conexión y selección del repositorio

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Vaya a Canalizaciones y seleccione Nueva canalización.

  3. Siga los pasos del asistente y seleccione primero GitHub como ubicación del código fuente.

  4. Puede que se le redirija a GitHub para iniciar sesión. Si es así, escriba sus credenciales de GitHub.

  5. Cuando vea la lista de repositorios, seleccione el repositorio.

  6. Es posible que se le redirija a GitHub para instalar la aplicación Azure Pipelines. Si es así, seleccione Aprobar e instalar.

  7. Seleccione Implementar en Azure Kubernetes Service.

  8. Si se le solicita, seleccione la suscripción en la que creó el registro y el clúster.

  9. Seleccione el clúster myapp.

  10. En Espacio de nombres, seleccione Existente y, a continuación, seleccione predeterminado.

  11. Seleccione el nombre del registro de contenedor.

  12. Puede dejar el nombre de la imagen establecido en los valores predeterminados.

  13. Luego, establezca el puerto de servicio en 8080.

  14. Establezca la casilla Enable Review App for Pull Requests (Habilitar la aplicación de revisión para solicitudes de extracción) para la configuración relacionada con la aplicación de revisión que se incluirá en la canalización generada automáticamente por YAML en los pasos posteriores.

  15. Seleccione Validar y configurar.

    A medida que Azure Pipelines cree la canalización, el proceso hará lo siguiente:

    • Crear una conexión de servicio del registro de Docker para permitir que la canalización pueda insertar imágenes en el registro de contenedor.

    • Cree un entorno y un recurso de Kubernetes dentro del entorno. En el caso de un clúster habilitado para RBAC, el recurso de Kubernetes creado crea implícitamente objetos ServiceAccount y RoleBinding en el clúster para que la cuenta ServiceAccount creada no pueda realizar operaciones fuera del espacio de nombres elegido.

    • Genere un archivo azure-pipelines.yml, que define la canalización.

    • Genere los archivos de manifiesto de Kubernetes. Estos archivos se generan mediante la hidratación de las plantillas deployment.yml y service.yml en función de las selecciones realizadas. Cuando esté listo, seleccione Guardar y ejecutar.

  16. Seleccione Guardar y ejecutar.

  17. Puede cambiar el mensaje de confirmación a algo parecido a Agregar la canalización a nuestro repositorio. Cuando esté listo, seleccione Guardar y ejecutar para confirmar la nueva canalización en el repositorio y, a continuación, comience la primera ejecución de la nueva canalización.

Consulta de la implementación de la aplicación

A medida que se ejecuta la canalización, vea cómo la fase de compilación y, después, la fase de implementación, pasan de azul (en ejecución) a verde (completadas). Puede seleccionar las fases y los trabajos para ver la canalización en acción.

Nota:

Si usa un agente hospedado por Microsoft, debe agregar el intervalo IP del agente hospedado por Microsoft al firewall. Obtenga la lista semanal de intervalos IP del archivo JSON semanal, que se publica todos los miércoles. Los nuevos intervalos IP se hacen efectivos el lunes siguiente. Para obtener más información, consulte Agentes hospedados por Microsoft. Para buscar los intervalos IP necesarios para su organización de Azure DevOps, aprenda a identificar los posibles intervalos IP para los agentes hospedados por Microsoft.

Una vez finalizada la ejecución de la canalización, explore lo que ha ocurrido y, a continuación, vaya a ver la aplicación implementada. En el resumen de la canalización:

  1. Seleccione la pestaña Entornos.

  2. Seleccione Ver entorno.

  3. Seleccione la instancia de la aplicación para el espacio de nombres que implementó. Si usó los valores predeterminados, es la aplicación myapp en el espacio de nombres predeterminado.

  4. Seleccione la pestaña Servicios.

  5. Seleccione y copie la dirección IP externa al portapapeles.

  6. Abra una nueva pestaña o ventana del explorador y escriba la <dirección IP>: 8080.

Si va a compilar nuestra aplicación de ejemplo, Hola mundo aparecerá en el explorador.

Cómo se compila la canalización

Cuando haya terminado de seleccionar opciones y, a continuación, haya validado y configurado la canalización, Azure Pipelines ha creado una canalización automáticamente, mediante la plantilla Implementar en Azure Kubernetes Service.

La fase de compilación usa la tarea de Docker para compilar e insertar la imagen en Azure Container Registry.

- 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'

El trabajo de implementación usa la tarea manifiesto de Kubernetes para crear el imagePullSecret necesario para que los nodos del clúster de Kubernetes extraigan del recurso de Azure Container Registry. A continuación, la tarea de manifiesto de Kubernetes usa los archivos de manifiesto para implementarlos en el clúster de Kubernetes. Los archivos de manifiesto service.yml y deployment.yml, se generaron al usar la plantilla Implementación en Azure Kubernetes Service.

- 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)

Limpieza de recursos

Cuando haya terminado con los recursos que ha creado, puede usar el siguiente comando para eliminarlos:

az group delete --name myapp-rg

Escriba y cuando se le pida.

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

Use Azure Pipelines para la implementación automática en Azure Kubernetes Service (AKS). Azure Pipelines permite compilar, probar e implementar con integración continua (CI) y entrega continua (CD) mediante Azure DevOps.

En este artículo, verá cómo crear una canalización que compila e implementa la aplicación continuamente. Cada vez que modifique el código de un repositorio que contenga un archivo Dockerfile, las imágenes se insertarán en Azure Container Registry y los manifiestos se implementarán en el clúster de AKS.

Requisitos previos

Obtención del código

Bifurque el repositorio siguiente que contiene una aplicación de ejemplo y un Dockerfile:

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

Creación de recursos de Azure

Inicie sesión en Azure Portal y, a continuación, seleccione el botón de Cloud Shell en la esquina superior derecha. Use la CLI de Azure o PowerShell para crear un clúster de AKS.

Creación de un Registro de contenedor

# 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 la autenticación

Cuando usa Azure Container Registry (ACR) con Azure Kubernetes Service (AKS), debe establecer un mecanismo de autenticación. Esto se puede lograr de dos maneras:

  1. Concesión de acceso de AKS a ACR. Consulte Autenticación con Azure Container Registry desde Azure Kubernetes Service (AKS).

  2. Use un secreto de extracción de imágenes de Kubernetes. Se puede crear un secreto de extracción de imagen mediante la tarea de implementación de Kubernetes.

Creación de una canalización de versión

La canalización de compilación que se usa para configurar CI ya ha creado una imagen de Docker y la ha insertado a un registro de Azure Container Registry. También ha empaquetado y publicado un gráfico de Helm como un artefacto. En la canalización de versión, implementaremos la imagen de contenedor como una aplicación de Helm en el clúster de AKS.

  1. En Azure Pipelines, abra el resumen de la compilación.

  2. En el resumen de la compilación, elija el icono Versión para iniciar una nueva canalización de versión.

    Si ha creado previamente una canalización de versión que usa estos artefactos de compilación, se le pedirá que cree una nueva versión en su lugar. En ese caso, vaya a la página Versiones e inicie una nueva canalización de versión desde allí eligiendo el icono +.

  3. Seleccione la plantilla Fase vacía.

  4. Abra la página Tareas y seleccione Trabajo de agente.

  5. Elija + para agregar una nueva tarea y agregar una tarea de Instalador de herramientas de Helm. Esto garantiza que el agente que ejecuta las tareas posteriores tenga Helm y Kubectl instalados en él.

  6. Elija + de nuevo y agregue una tarea Empaquetar e implementar los gráficos de Helm. Configure las opciones de esta tarea de la siguiente manera:

    • Tipo de conexión: seleccione Azure Resource Manager para conectarse a un clúster de AKS mediante una conexión de servicio de Azure. Como alternativa, si desea conectarse a cualquier clúster de Kubernetes mediante kubeconfig o una cuenta de servicio, puede seleccionar Conexión de servicio de Kubernetes. En este caso, deberá crear y seleccionar una conexión de servicio de Kubernetes en lugar de una suscripción de Azure para la siguiente configuración.

    • Suscripción de Azure: seleccione una conexión en la lista Conexiones a servicios de Azure disponibles, o cree una conexión con permisos más restrictivos a la suscripción de Azure. Si ve un botón Autorizar junto a la entrada, úselo para autorizar la conexión a su suscripción de Azure. Si no ve la suscripción de Azure necesaria en la lista de suscripciones, consulte Creación de una conexión de servicio de Azure para configurar manualmente la conexión.

    • Grupo de recursos: escriba o seleccione el grupo de recursos que contiene el clúster de AKS.

    • Clúster de Kubernetes: escriba o seleccione el clúster de AKS que ha creado.

    • Comando: seleccione init como comando de Helm. Esto instalará Tiller en el clúster de Kubernetes en ejecución. También configurará cualquier configuración local necesaria. Marque Use canary image version (Usar la versión de imagen de análisis) para instalar la versión anterior más reciente de Tiller. También puede optar por actualizar Tiller si está preinstalado; para ello, marque Actualizar Tiller. Si estas opciones están habilitadas, la tarea ejecutará helm init --canary-image --upgrade

  7. Elija + en el Trabajo de agente y agregue otra tarea Empaquetar e implementar los gráficos de Helm. Configure las opciones de esta tarea de la siguiente manera:

    • Clúster de Kubernetes: escriba o seleccione el clúster de AKS que ha creado.

    • Espacio de nombres: escriba el espacio de nombres del clúster de Kubernetes donde desea implementar la aplicación. Kubernetes admite varios clústeres virtuales con el respaldo del mismo clúster físico. Estos clústeres virtuales se denominan espacios de nombres. Puede usar espacios de nombres para crear entornos diferentes, como desarrollo, pruebas y almacenamiento provisional en el mismo clúster.

    • Comando: seleccione actualizar como comando de Helm. Puede ejecutar cualquier comando de Helm mediante esta tarea y pasar las opciones de comando como argumentos. Al seleccionar actualizar, la tarea muestra algunos campos más:

      • Tipo de gráfico: seleccione Ruta de acceso de archivo. Como alternativa, puede especificar el Nombre del gráfico si desea especificar una dirección URL o un nombre de gráfico. Por ejemplo, si el nombre del gráfico es stable/mysql, la tarea ejecutará helm upgrade stable/mysql

      • Ruta de acceso del gráfico: puede ser una ruta de acceso a un gráfico empaquetado o una ruta de acceso a un directorio de gráfico desempaquetado. En este ejemplo, va a publicar el gráfico mediante una compilación de CI, así que seleccione el paquete de archivos mediante el selector de archivos o escriba $(System.DefaultWorkingDirectory)/**/*.tgz.

      • Nombre de la versión: escriba un nombre para la versión; por ejemplo, azuredevops

      • Volver a crear pods: marque esta casilla si hay un cambio de configuración durante la versión y desea reemplazar un pod en ejecución por la nueva configuración.

      • Restablecer valores: marque esta casilla si desea que los valores integrados en el gráfico invaliden todos los valores proporcionados por la tarea.

      • Forzar: marque esta casilla si, en caso de conflictos, desea actualizar y revertir para eliminar, volver a crear el recurso y volver a instalar la versión completa. Esto es útil en escenarios en los que se puede producir un error al aplicar revisiones (por ejemplo, para los servicios porque la dirección IP del clúster es inmutable).

      • Argumentos: escriba los argumentos del comando de Helm y sus valores; para este ejemplo --set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId) Consulte esta sección para obtener una descripción de por qué se usan estos argumentos.

      • Habilitar TLS: active esta casilla para habilitar conexiones seguras basadas en TLS entre Helm y Tiller.

      • Certificado de entidad de certificación: especifique un certificado de entidad de certificación que se va a cargar y se usará para emitir certificados para el cliente de Tiller y Helm.

      • Certificar: especifique el certificado de Tiller o el certificado de cliente de Helm

      • Clave: especifique la clave de Tiller o la clave de cliente de Helm

  8. En la página Variables de la canalización, agregue una variable denominada imageRepoName y establezca el valor en el nombre del repositorio de imágenes de Helm. Normalmente, está en el formato example.azurecr.io/coderepository

  9. Guarde la canalización de versión.

Argumentos usados en la tarea de actualización de Helm

En la canalización de compilación, la imagen de contenedor se etiqueta con $(Build.BuildId) y se inserta en un registro de Azure Container Registry. En un gráfico de Helm, puede parametrizar los detalles de la imagen de contenedor, como el nombre y la etiqueta, ya que se puede usar el mismo gráfico para implementar en distintos entornos. Estos valores también se pueden especificar en el archivo values.yaml o reemplazarse por un archivo de valores proporcionado por el usuario, que a su vez se puede invalidar mediante parámetros --set durante la instalación o actualización de Helm.

En este ejemplo, se pasan los argumentos siguientes:

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

El valor de $(imageRepoName) se estableció en la página Variables (o en la sección variables del archivo YAML). Como alternativa, puede reemplazarlo directamente por el nombre del repositorio de imágenes en el valor de argumentos --set o el archivo values.yaml. Por ejemplo:

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

Otra alternativa consiste en establecer la opción Establecer valores de la tarea para especificar los valores de argumento como pares clave-valor separados por comas.

Creación de una versión para implementar la aplicación

Ya está listo para crear una versión, lo que significa iniciar el proceso de ejecución de la canalización de versión con los artefactos generados por una compilación específica. Esto da lugar a la implementación de la compilación:

  1. Elija + Versión y seleccione Crear versión.

  2. En el panel Crear una nueva versión, compruebe que la versión del artefacto que desea usar está seleccionada y elija Crear.

  3. Seleccione el enlace de versión en el mensaje de la barra de información. Por ejemplo: "Versión Release-1 se ha creado".

  4. En la vista de canalización, elija el vínculo de estado en las fases de la canalización para ver los registros y la salida del agente.