Implantar para o Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Você pode usar o Azure Pipelines para fazer a implantação em Serviço de Kubernetes do Azure e em clusters do Kubernetes oferecidos por outros provedores de nuvem. O Azure Pipelines tem duas tarefas de trabalho com o Kubernetes:

  • Tarefa KubernetesManifest: faça o bake e implante manifestos em clusters do Kubernetes com Helm, Kompose ou Kustomize
  • Tarefa Kubectl: implante, configure e atualize um cluster do Kubernetes no Serviço de Contêiner do Azure executando comandos kubectl

Se você estiver usando Serviço de Kubernetes do Azure com qualquer tarefa, o tipo de conexão de serviço do Resource Manager do Azure será a melhor maneira de se conectar a um cluster privado ou um cluster que tenha contas locais desabilitadas.

Para obter mais rastreabilidade de implantação, use um recurso do Kubernetes em ambientes com uma tarefa do Kubernetes.

Para começar a usar o Azure Pipelines e o serviço de Kubernetes do Azure, confira Compilação e implantação em Serviço de Kubernetes do Azure com o Azure Pipelines. Para começar a usar o Azure Pipelines, o Kubernetes e a estratégia de implantação canário especificamente, confira Usar uma estratégia de implantação canário para implantações do Kubernetes com o Azure Pipelines.

Tarefa KubernetesManifest

A Tarefa KubernetesManifest verifica a estabilidade do objeto antes de marcar uma tarefa como falha/bem-sucedida. A tarefa também pode executar substituição de artefatos, adicionar anotações relacionadas à rastreabilidade de pipeline, simplificar a criação e fazer referência a imagePullSecrets, fornecer manifestos e auxiliar nas implantações de estratégia de implantação.

Observação

Embora o pipeline baseado em YAML dê suporte a gatilhos em um único repositório Git, se você precisar de um gatilho para um arquivo de manifesto armazenado em outro repositório Git, ou forem necessários gatilhos para Registro de Contêiner do Azure ou Docker Hub, você deverá usar um pipeline clássico em vez de um pipeline baseado em YAML.

Você pode usar a ação bake na tarefa de manifesto do Kubernetes para inserir modelos em arquivos de manifesto do Kubernetes. A ação permite que você use ferramentas como Helm, Kustomize e Kompose. A ação bake da tarefa de manifesto do Kubernetes fornece visibilidade da transformação entre modelos de entrada e os arquivos de manifesto final usados em implantações. Você pode consumir downstream de arquivos de manifesto com bake (em tarefas) como entradas para a ação de implantação da tarefa de manifesto do Kubernetes.

Você pode direcionar recursos do Kubernetes que fazem parte de ambientes com trabalhos de implantação. O uso de ambientes e implantação de recursos oferece acesso a uma melhor rastreabilidade de pipeline para que você possa diagnosticar problemas de implantação. Você também pode fazer a implantação em clusters do Kubernetes com trabalhos regulares sem os mesmos recursos de integridade.

O seguinte código YAML é um exemplo de arquivos de manifesto com bake de gráficos do 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

Tarefa Kubectl

Como alternativa à tarefa KubernetesManifest, você pode usar a tarefa Kubectl para implantar, configurar e atualizar um cluster do Kubernetes no Serviço de Contêiner do Azure executando comandos kubectl.

O seguinte exemplo mostra como uma conexão de serviço é usada para se referir ao cluster do Kubernetes.

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

tarefa Script

Você também pode usar kubectl com uma tarefa de script.

O seguinte exemplo usa um script para executar kubectl.

- script: |
    kubectl apply -f manifest.yml

Estratégias de implantação do Kubernetes

No momento, a tarefa de manifesto do Kubernetes dá suporte à estratégia de implantação canário. Use a estratégia de implantação canário para implantar parcialmente novas alterações de modo que as novas alterações coexistam com as implantações atuais antes de uma distribuição completa.

Para obter mais informações sobre implantações canários com pipelines, confira Usar uma estratégia de implantação canário para implantações do Kubernetes com o Azure Pipelines.

Implantações do Kubernetes multinuvem

O Kubernetes é executado da mesma maneira em todos os provedores de nuvem. O Azure Pipelines pode ser usado em implantações no AKS (Serviço de Kubernetes do Azure), no GKE (Mecanismo de Kubernetes do Google), no EKS (Amazon Elastic Kubernetes Service) ou em clusters de qualquer outro provedor de nuvem.

Para configurar a implantação de várias nuvens, crie um ambiente e adicione seus recursos do Kubernetes associados a namespaces de clusters do Kubernetes.

A abordagem de provedor genérico com base na conta de serviço existente funciona com clusters de qualquer provedor de nuvem, incluindo o Azure. O benefício de usar a opção Serviço de Kubernetes do Azure é que ela cria objetos ServiceAccount e RoleBinding (em vez de reutilizar uma ServiceAccount existente) para que o objeto RoleBinding recém-criado possa limitar as operações do ServiceAccount apenas ao namespace escolhido.

Ao usar a abordagem de provedor genérico, verifique se existe um RoleBinding que concede edit ClusterRole permissões na conta de serviço desejada. Você precisa conceder permissões para a conta de serviços correta de modo que a conta de serviço possa ser usada pelo Azure Pipelines a fim de criar objetos no namespace escolhido.

Implantações paralelas para várias nuvens

O seguinte exemplo mostra como fazer implantações paralelas em clusters em várias nuvens. Neste exemplo, há implantações nos clusters AKS, GKE, EKS e OpenShift. Esses quatro namespaces estão associados aos recursos do Kubernetes no ambiente 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/*