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.
Al usar el enfoque de proveedor genérico, asegúrese de que existe un RoleBinding, que concede permisos en la edit
ClusterRole
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/*