Sdílet prostřednictvím


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í 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ů.

    Sledovatelnost kanálu

  • 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ý.

    Přidejte cluster Kubernetes.

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řipojte se k úložišti 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í.

Možnosti šablony Kubernetes

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