Implementación en Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Puede usar Azure Pipelines para implementar en Azure Kubernetes Service y clústeres de Kubernetes ofrecidos por otros proveedores de nube. Azure Pipelines tiene dos tareas para trabajar con Kubernetes:

  • Tarea KubernetesManifest: simule manifiestos mediante "bake" e impleméntelos en clústeres de Kubernetes con Helm, Kompose o Kustomize
  • Tarea Kubectl: implemente, configure y actualice un clúster de Kubernetes en Azure Container Service mediante la ejecución de comandos kubectl

Si usa Azure Kubernetes Service con cualquiera de las tareas, el tipo de conexión de servicio de Azure Resource Manager es la mejor manera de conectarse a un clúster privado o a un clúster que tenga deshabilitadas las cuentas locales.

Para una rastreabilidad de implementación agregada, use un recurso de Kubernetes en entornos con una tarea de Kubernetes.

Para empezar a trabajar con Azure Pipelines y Azure Kubernetes Service, consulte Compilación e implementación en Azure Kubernetes Service con Azure Pipelines. Para empezar a trabajar con Azure Pipelines, Kubernetes y la estrategia de implementación controlada específicamente, consulte Uso de una estrategia de implementación de valor controlado para implementaciones de Kubernetes con Azure Pipelines.

Tarea KubernetesManifest

La tarea KubernetesManifest comprueba si hay estabilidad de objetos antes de marcar una tarea como correcta o errónea. La tarea también puede realizar una sustitución de artefactos, agregar anotaciones relacionadas con la rastreabilidad de canalización, simplificar la creación y la referencia de imagePullSecrets, simular manifiestos mediante "bake" y ayudar en la implementación de estrategias de implementación.

Nota:

Si bien la canalización basada en YAML admite desencadenadores en un repositorio de Git único, si necesita un desencadenador para un archivo de manifiesto almacenado en otro repositorio de Git o si se necesitan desencadenadores para Azure Container Registry o Docker Hub, debe usar una canalización clásica en lugar de una canalización basada en YAML.

Puede usar la acción bake en la tarea de manifiesto de Kubernetes para simular mediante "bake" plantillas en archivos de manifiesto de Kubernetes. La acción le permite usar herramientas como Helm, kustomize y kompose. La acción bake de la tarea de manifiesto de Kubernetes proporciona visibilidad sobre la transformación entre las plantillas de entrada y los archivos de manifiesto final que se usan en las implementaciones. Puede consumir archivos de manifiesto a los que se ha aplicado la acción "bake" de bajada (en tareas) como entradas para la acción de implementación de la tarea de manifiesto de Kubernetes.

Puede dirigirse a recursos de Kubernetes que forman parte de entornos con trabajos de implementación. El uso de entornos y la implementación de recursos proporciona acceso a una mejor rastreabilidad de canalización para que pueda diagnosticar problemas de implementación. También puede implementar en clústeres de Kubernetes con trabajos normales sin las mismas características de mantenimiento.

El código YAML siguiente es un ejemplo de simulación mediante "bake" de archivos de manifiesto de gráficos de Helm.

steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from Helm chart
  inputs:
    action: bake
    helmChart: charts/sample
    overrides: 'image.repository:nginx'

- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: someK8sSC
    namespace: default
    manifests: $(bake.manifestsBundle)
    containers: |
      nginx: 1.7.9

Tarea Kubectl

Como alternativa a la tarea KubernetesManifest, puede usar la tarea Kubectl para implementar, configurar y actualizar un clúster de Kubernetes en Azure Container Service mediante la ejecución de comandos kubectl.

En el ejemplo siguiente, se muestra cómo se usa una conexión de servicio para hacer referencia al clúster de Kubernetes.

- task: Kubernetes@1
  displayName: kubectl apply
  inputs:
    connectionType: Kubernetes Service Connection
    kubernetesServiceEndpoint: Contoso

tarea Script

También puede usar kubectl con una tarea de script.

En el ejemplo siguiente, se usa un script para ejecutar kubectl.

- script: |
    kubectl apply -f manifest.yml

Estrategias de implementación de Kubernetes

La tarea Manifiesto de Kubernetes admite actualmente la estrategia de implementación controlada. Use la estrategia de implementación controlada para implementar parcialmente cambios nuevos para que los nuevos cambios coexistan con las implementaciones actuales antes de una implementación completa.

Para más información sobre las implementaciones controladas con canalizaciones, consulte Uso de una estrategia de implementación de valor controlado para implementaciones de Kubernetes con Azure Pipelines.

Implementaciones de Kubernetes multinube

Kubernetes se ejecuta de la misma manera en todos los proveedores de nube. Azure Pipelines se puede usar para implementar en Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) o clústeres de cualquier otro proveedor de nube.

Para configurar la implementación multinube, cree un entorno y agregue los recursos de Kubernetes asociados a espacios de nombres de clústeres de Kubernetes.

El enfoque de proveedor genérico basado en la cuenta de servicio existente funciona con clústeres de cualquier proveedor de nube, incluido Azure. La ventaja de usar la opción Azure Kubernetes Service en su lugar es que crea objetos ServiceAccount y RoleBinding (en lugar de reutilizar un objeto serviceAccount existente) para que el objeto RoleBinding recién creado pueda limitar las operaciones de ServiceAccount solamente al espacio de nombres elegido.

Cuando use el enfoque de proveedor genérico, asegúrese de que existe un objeto RoleBinding, que concede permisos en editClusterRole a la cuenta de servicio deseada. Debe conceder permisos a la cuenta de servicios adecuada para que Azure Pipelines pueda usar la cuenta de servicio para crear objetos en el espacio de nombres elegido.

Implementaciones paralelas en varias nubes

En el ejemplo siguiente, se muestra cómo realizar implementaciones paralelas en clústeres en varias nubes. En este ejemplo, hay implementaciones en los clústeres de AKS, GKE, EKS y OpenShift. Estos cuatro espacios de nombres están asociados a los recursos de Kubernetes en el entorno contoso.

trigger:
- main

jobs:
- deployment:
  displayName: Deploy to AKS
  pool:
    vmImage: ubuntu-latest
  environment: contoso.aksnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: aksnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to GKE
  pool:
    vmImage: ubuntu-latest
  environment: contoso.gkenamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: gkenamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to EKS
  pool:
    vmImage: ubuntu-latest
  environment: contoso.eksnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: eksnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to OpenShift
  pool:
    vmImage: ubuntu-latest
  environment: contoso.openshiftnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: openshiftnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to DigitalOcean
  pool:
    vmImage: ubuntu-latest
  environment: contoso.digitaloceannamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: digitaloceannamespace
            manifests: manifests/*