Ambiente – Recurso do Kubernetes

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

A visualização de recursos do Kubernetes mostra o status dos objetos dentro do namespace que são mapeados para o recurso. A visualização de recursos também sobrepõe a rastreabilidade do pipeline para que você possa rastrear de um objeto Kubernetes para o pipeline e, em seguida, de volta para a confirmação.

Use os recursos do Kubernetes para direcionar clusters do Kubernetes em um ambiente para implantação. Use pipelines para implantar no Serviço Kubernetes do Azure (AKS) e clusters de qualquer outro provedor de nuvem.

Você pode usar recursos do Kubernetes com clusters públicos ou privados. Para saber mais sobre como os recursos funcionam, consulte Recursos em YAML e Segurança com recursos.

Descrição geral

Veja as seguintes vantagens de usar visualizações de recursos do Kubernetes em ambientes:

  • Rastreabilidade de pipeline - A tarefa de manifesto do Kubernetes, usada para implantações, adiciona mais anotações para mostrar a rastreabilidade do pipeline em exibições de recursos. A rastreabilidade do pipeline ajuda a identificar a organização, o projeto e o pipeline do Azure DevOps de origem responsáveis pelas atualizações feitas em um objeto dentro do namespace.

    Pipeline traceability

  • Diagnosticar a integridade do recurso - O status da carga de trabalho pode ser útil para depurar rapidamente erros ou regressões que foram introduzidos por uma nova implantação. Por exemplo, para imagePullSecrets não configurados resultando em erros ImagePullBackOff, as informações de status do pod podem ajudá-lo a identificar a causa raiz do problema.

    ImagePullBackOff

  • Aplicativo de revisão - O aplicativo de revisão funciona implantando cada solicitação pull do seu repositório Git em um recurso dinâmico do Kubernetes no ambiente. Os revisores podem ver a aparência dessas alterações e trabalhar com outros serviços dependentes antes de serem mescladas na ramificação de destino e implantadas na produção.

Usar o Serviço Kubernetes do Azure

Uma ServiceAccount é criada no cluster e namespace escolhidos quando você usa o Serviço Kubernetes do Azure (AKS). Para um cluster habilitado para Kubernetes RBAC, RoleBinding também é criado para limitar o escopo da conta de serviço criada ao namespace escolhido. Para um cluster desabilitado para RBAC do Kubernetes, a ServiceAccount criada tem privilégios em todo o cluster (entre namespaces).

Adicionar um recurso do Kubernetes AKS

  1. Na página de detalhes do ambiente, selecione Adicionar recurso e escolha Kubernetes.

  2. Selecione Serviço Kubernetes do Azure na lista suspensa Provedor.

  3. Escolha a assinatura, o cluster e o namespace do Azure (novo/existente).

  4. Selecione Validar e criar para criar o recurso Kubernetes.

  5. Verifique se você vê um cluster para seu ambiente. Você verá o texto "Nunca implantado" se ainda não tiver implantado o código no cluster.

    Add a Kubernetes cluster.

Utilizar uma conta de serviço existente

O Serviço Kubernetes do Azure mapeia um recurso Kubernetes em seu ambiente para um namespace.

Para obter mais informações sobre como configurar uma conexão de serviço Kubernetes fora de um ambiente, consulte a seção Conexão de serviço Kubernetes em Conexões de serviço.

Gorjeta

Use o provedor genérico (conta de serviço existente) para mapear um recurso do Kubernetes para um namespace de um cluster não-AKS.

Adicionar um recurso Kubernetes não AKS

  1. Na página de detalhes do ambiente, selecione Adicionar recurso e escolha Kubernetes.

  2. Selecione Provedor genérico (conta de serviço existente) para seu provedor.

  3. Adicione o nome do cluster e os valores do namespace.

  4. Adicione o URL do servidor. Você pode obter a URL com o seguinte comando:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. Para obter o objeto secreto.

    Kubernetes 1,22+

    Substitua service-account-name pelo nome da sua conta.

    kubectl get secret -n <namespace>  -o jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name==\"service-account-name\")]}'
    

    Se você não receber nada, consulte Criar manualmente um token de API de longa duração para uma ServiceAccount.

    Kubernetes 1.22 e abaixo:

    1. Localizar o nome secreto da conta de serviço
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. substituir <service-account-secret-name> pelo valor no comando anterior neste comando
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. Obtenha o objeto secreto usando a saída da etapa anterior.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. Copie e cole o objeto Secret buscado no formulário JSON no campo Secret.

  8. Selecione Validar e criar para criar o recurso Kubernetes.

Referenciar seus recursos do Kubernetes em um pipeline

Se você estiver usando o Serviço Kubernetes do Azure e criando um pipeline YAML, a maneira mais fácil de configurar seu pipeline é usar um modelo. Conecte-se ao repositório e selecione uma das duas opções de Serviço Kubernetes a seguir:

Os modelos permitem que você configure o Review App sem precisar escrever código YAML do zero ou criar manualmente associações de função explícitas.

Kubernetes template options.

Configurar a aplicação Rever

No exemplo a seguir, o primeiro trabalho de implantação é executado para ramificações que não são de RP e faz implantações em um recurso Kubernetes regular em ambientes. O segundo trabalho é executado apenas para ramificações de RP e implantado em recursos do Aplicativo de Revisão (namespaces dentro do cluster Kubernetes) gerados sob demanda. Os recursos são rotulados com "Revisão" na exibição de listagem de recursos do ambiente. Defina variáveis a serem usadas no pipeline. Se você usar o modelo Implantar nos Serviços Kubernetes do Azure, essas variáveis serão definidas para você.

# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service
trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '12345' # Docker service connection identifier
  envName: 'myEnv' # name of your environment
  imageRepository: 'name-of-image-repository' # name of image repository
  containerRegistry: 'mycontainer.azurecr.io' # path to container registry
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'my-app-secret' # image pull secret

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Name of the new namespace being created to deploy the PR changes.
  k8sNamespaceForPR: 'review-app-$(System.PullRequest.PullRequestId)'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    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)

    - upload: manifests
      artifact: manifests

- stage: Production
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Production
    condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
    displayName: Production
    pool:
      vmImage: $(vmImageName)
    environment: 
      name: $(envName).$(resourceName)
      resourceType: Kubernetes 
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

  - deployment: DeployPullRequest
    displayName: Deploy Pull request
    condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/pull/'))
    pool:
      vmImage: $(vmImageName)

    environment: 
      name: $(envName).$(resourceName)
      resourceType: Kubernetes
    strategy:
      runOnce:
        deploy:
          steps:
          - reviewApp: default

          - task: Kubernetes@1
            displayName: 'Create a new namespace for the pull request'
            inputs:
              command: apply
              useConfigurationFile: true
              inline: '{ "kind": "Namespace", "apiVersion": "v1", "metadata": { "name": "$(k8sNamespaceForPR)" }}'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespaceForPR)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to the new namespace in the Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespaceForPR)
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

          - task: Kubernetes@1
            name: get
            displayName: 'Get services in the new namespace'
            continueOnError: true
            inputs:
              command: get
              namespace: $(k8sNamespaceForPR)
              arguments: svc
              outputFormat: jsonpath='http://{.items[0].status.loadBalancer.ingress[0].ip}:{.items[0].spec.ports[0].port}'

          # Getting the IP of the deployed service and writing it to a variable for posting comment
          - script: |
              url="$(get.KubectlOutput)"
              message="Your review app has been deployed"
              if [ ! -z "$url" -a "$url" != "http://:" ]
              then
                message="${message} and is available at $url.<br><br>[Learn More](https://aka.ms/testwithreviewapps) about how to test and provide feedback for the app."
              fi
              echo "##vso[task.setvariable variable=GITHUB_COMMENT]$message"

Para usar esse trabalho em um pipeline existente , a conexão de serviço que dá suporte ao recurso de ambiente Kubernetes regular deve ser modificada para "Usar credenciais de administrador de cluster". Caso contrário, as associações de função devem ser criadas para a conta de serviço subjacente ao namespace Review App.

Próximos passos