Partilhar via


Despachar no Kubernetes

Serviços de DevOps do Azure | Azure DevOps Server 2022

Utilize o Azure Pipelines para implantar no Serviço Kubernetes do Azure e clusters Kubernetes oferecidos por outros provedores de nuvem. O Azure Pipelines tem duas tarefas para trabalhar com o Kubernetes:

  • Tarefa Kubernetes Manifest: preparar e implantar manifestos em clusters Kubernetes com Helm, Kompose ou Kustomize
  • Tarefa Kubectl: implantar, configurar e atualizar um cluster Kubernetes no Serviço de Contêiner do Azure executando comandos kubectl

Se você usar o Serviço Kubernetes do Azure com qualquer uma das tarefas, o tipo de conexão de serviço do Azure Resource Manager é a melhor maneira de se conectar a um cluster privado ou a um cluster com contas locais desabilitadas.

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

Para começar a usar o Azure Pipelines e o Serviço Kubernetes do Azure, consulte Criar e implantar no Serviço 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ária, consulte Usar uma estratégia de implantação canária 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 bem-sucedida ou falhada. A tarefa pode também realizar a substituição de artefatos, adicionar anotações relacionadas à rastreabilidade do pipeline, simplificar a criação e a referência de imagePullSecrets, preparar manifestos e auxiliar na implementação de estratégias de implantação.

Nota

O suporte de pipeline baseado em YAML é acionado por um único repositório Git. Se você precisar de um gatilho para um arquivo de manifesto armazenado em outro repositório Git, ou se forem necessários gatilhos para o Registro de Contêiner do Azure ou o Hub do Docker, use um pipeline clássico em vez de um pipeline baseado em YAML.

Você pode usar a ação de preparação na tarefa de manifesto do Kubernetes para compilar 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 mostra a transformação entre os modelos de entrada e os arquivos de manifesto finais usados em implantações. Você pode utilizar ficheiros de manifesto preparados a jusante (em tarefas) como entradas para a ação de implementação da tarefa de manifesto do Kubernetes.

Direcione recursos do Kubernetes que fazem parte de ambientes com trabalhos de implantação. O uso de ambientes e implantações de recursos melhora a rastreabilidade do pipeline, ajudando a diagnosticar problemas de implantação. Você também pode implantar trabalhos regulares em clusters do Kubernetes sem as mesmas funcionalidades de verificação de integridade.

O código YAML a seguir mostra como gerar ficheiros de manifesto a partir de chartes Helm.

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

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

Tarefa Kubectl

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

Este exemplo mostra como uma conexão de serviço se refere ao cluster Kubernetes.

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

Tarefa de script

Use kubectl com uma tarefa de script.

Este exemplo usa um script para executar kubectl.

- script: |
    kubectl apply -f manifest.yml

Estratégias de implementação do Kubernetes

A tarefa de manifesto do Kubernetes suporta a estratégia de implantação canária. Use a estratégia de implantação canária para implantar parcialmente novas alterações para que as novas alterações coexistam com as implantações atuais antes de uma implantação completa.

Para obter mais informações sobre implantações canárias com pipelines, consulte Usar uma estratégia de implantação canária para implantações de Kubernetes com o Azure Pipelines.

Implantações do Kubernetes multicloud

O Kubernetes funciona da mesma forma em todos os provedores de nuvem. Use o Azure Pipelines para implantar no Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) ou clusters de outros provedores de nuvem.

Para configurar a implantação multicloud, crie um ambiente e adicione recursos do Kubernetes associados a namespaces de clusters Kubernetes.

A abordagem de provedor genérico, baseada em uma conta de serviço existente, funciona com clusters de qualquer provedor de nuvem, incluindo o Azure. O uso da opção Serviço Kubernetes do Azure cria novos objetos ServiceAccount e RoleBinding . Isso garante que o objeto RoleBinding limite as operações de ServiceAccount ao namespace escolhido.

Ao usar a abordagem de provedor genérico, verifique se existe um RoleBinding que conceda permissões na editClusterRole conta de serviço desejada. Conceda permissões à conta de serviço correta para que o Azure Pipelines possa usá-la para criar objetos no namespace escolhido.

Implantações paralelas em várias nuvens

O exemplo a seguir mostra como fazer implantações paralelas para clusters em várias nuvens. Neste exemplo, há implantações para os clusters AKS, GKE, EKS e OpenShift. Esses quatro namespaces estão associados aos contoso recursos do Kubernetes no ambiente.

trigger:
- main

jobs:
- deployment:
  displayName: Deploy to AKS
  pool:
    vmImage: ubuntu-latest
  environment: contoso.aksnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@1
          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@1
          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@1
          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@1
          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@1
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: digitaloceannamespace
            manifests: manifests/*