Prostředí – Prostředek Kubernetes

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Zobrazení prostředků Kubernetes zobrazuje stav objektů v rámci oboru názvů mapovaného na prostředek. Zobrazení prostředků také překrývá sledovatelnost kanálu, abyste mohli trasovat zpět z objektu Kubernetes do kanálu a pak zpátky k potvrzení.

Prostředky Kubernetes použijte k cílení clusterů Kubernetes v prostředí pro nasazení. Kanály můžete použít k nasazení do služby Azure Kubernetes Service (AKS) a clusterů od jakéhokoli jiného poskytovatele cloudu.

Prostředky Kubernetes můžete používat s veřejnými nebo privátními clustery. Další informace o tom, jak prostředky fungují, najdete v YAML a zabezpečení pomocí prostředků.

Přehled

Podívejte se na následující výhody používání zobrazení prostředků Kubernetes v prostředích:

  • Sledovatelnost kanálu – Úloha manifestu Kubernetes, která se používá pro nasazení, přidává další poznámky k zobrazení sledovatelnosti kanálu v zobrazeních prostředků. Sledovatelnost kanálu pomáhá identifikovat původní organizaci, projekt a kanál Azure DevOps zodpovědné za aktualizace provedené v objektu v rámci oboru názvů.

    Pipeline traceability

  • Diagnostika stavu prostředků – Stav úlohy může být užitečný pro rychlé ladění chyb nebo regresí zavedených novým nasazením. Například pro nekonfigurované imagePullSecrets , což vede k chybám ImagePullBackOff, vám informace o stavu podu můžou pomoct identifikovat původní příčinu problému.

    ImagePullBackOff

  • Kontrola aplikace – Kontrola aplikace funguje nasazením všech žádostí o přijetí změn z úložiště Git do dynamického prostředku Kubernetes v rámci prostředí. Revidujícím se dozvíte, jak tyto změny vypadají a fungují s dalšími závislými službami, než se sloučí do cílové větve a nasadí do produkčního prostředí.

Použití služby Azure Kubernetes Service

ServiceAccount se vytvoří ve zvoleném clusteru a oboru názvů při použití služby Azure Kubernetes Service (AKS). V případě clusteru s podporou RBAC Kubernetes se vytvoří také RoleBinding, který omezí rozsah vytvořeného účtu služby na zvolený obor názvů. Pro cluster s podporou RBAC Kubernetes má vytvořený účet ServiceAccount oprávnění pro celý cluster (napříč obory názvů).

Přidání prostředku AKS Kubernetes

  1. Na stránce podrobností o prostředí vyberte Přidat prostředek a zvolte Kubernetes.

  2. V rozevíracím seznamu zprostředkovatele vyberte Službu Azure Kubernetes Service .

  3. Zvolte předplatné Azure, cluster a obor názvů (nový nebo existující).

  4. Vyberte Ověřit a vytvořit prostředek Kubernetes.

  5. Ověřte, že se pro vaše prostředí zobrazí cluster. Pokud jste ještě nenasadili kód do clusteru, zobrazí se text Nikdy nasazený.

    Add a Kubernetes cluster.

Použít existující účet služby

Azure Kubernetes Service mapuje prostředek Kubernetes ve vašem prostředí na obor názvů.

Další informace o nastavení připojení služby Kubernetes mimo prostředí najdete v části Připojení ke službě Kubernetes v části Připojení ke službě.

Tip

Pomocí obecného poskytovatele (existujícího účtu služby) namapujte prostředek Kubernetes na obor názvů z clusteru mimo AKS.

Přidání prostředku Kubernetes jiného typu než AKS

  1. Na stránce podrobností o prostředí vyberte Přidat prostředek a zvolte Kubernetes.

  2. Pro svého poskytovatele vyberte obecného poskytovatele (existující účet služby).

  3. Přidejte název clusteru a hodnoty oboru názvů.

  4. Přidejte adresu URL serveru. Adresu URL můžete získat pomocí následujícího příkazu:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. Získání tajného objektu

    Kubernetes 1.22 nebo novější

    Nahraďte service-account-name názvem svého účtu.

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

    Pokud nic nezískáte, přečtěte si téma Ruční vytvoření dlouhodobého tokenu rozhraní API pro ServiceAccount.

    Kubernetes 1.22 a níže:

    1. Vyhledání názvu tajného kódu účtu služby
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. Nahradit <service-account-secret-name> hodnotou v předchozím příkazu v tomto příkazu
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. Získejte tajný objekt pomocí výstupu předchozího kroku.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. Zkopírujte a vložte tajný objekt načtený ve formuláři JSON do pole Tajný kód.

  8. Vyberte Ověřit a vytvořit prostředek Kubernetes.

Odkazování na prostředky Kubernetes v kanálu

Pokud používáte Azure Kubernetes Service a vytváříte kanál YAML, nejjednodušší způsob, jak kanál nakonfigurovat, je použít šablonu. Připojení do úložiště a vyberte jednu z následujících dvou možností služby Kubernetes Service:

Šablony umožňují nastavit aplikaci Review App, aniž byste museli psát kód YAML od začátku nebo ručně vytvářet explicitní vazby rolí.

Kubernetes template options.

Nastavení aplikace Pro kontrolu

V následujícím příkladu se první úloha nasazení spustí pro větve, které nejsou pr, a provádí nasazení proti běžnému prostředku Kubernetes v prostředích. Druhá úloha se spouští jenom pro větve pr a nasazuje se proti kontrole prostředků aplikace (oborů názvů uvnitř clusteru Kubernetes) vygenerovaných na vyžádání. Prostředky se v zobrazení výpisu prostředků prostředí označí popiskem Revize. Definujte proměnné, které se mají použít v kanálu. Pokud použijete šablonu Deploy to Azure Kubernetes Services, tyto proměnné se pro vás definují.

# 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"

Pokud chcete tuto úlohu použít v existujícím kanálu, musí být připojení služby, které zálohuje běžný prostředek prostředí Kubernetes, změněno na Použití přihlašovacích údajů správce clusteru. V opačném případě je nutné vytvořit vazby rolí pro příslušný účet služby do oboru názvů Zkontrolovat aplikaci.

Další kroky