環境 - Kubernetes 資源

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

Kubernetes 資源檢視提供對應至資源之命名空間內物件狀態的一目了然。 此檢視也會重迭管線可追蹤性,讓您可以將 Kubernetes 物件追蹤回管線,然後再回到認可。

使用 Kubernetes 資源,在 環境中 以 Kubernetes 叢集為目標進行部署。 使用管線部署至任何其他雲端提供者Azure Kubernetes Service (AKS) 和叢集。

您可以搭配公用或私人叢集使用 Kubernetes 資源。 若要深入瞭解資源的運作方式,請參閱 YAML 中的資源資源的安全性

概觀

請參閱在環境中使用 Kubernetes 資源檢視的下列優點:

  • 管線可追蹤性 - 用於部署的 Kubernetes 資訊清單工作會新增更多批註,以顯示資源檢視中的管線可追蹤性。 管線可追蹤性有助於識別原始的 Azure DevOps 組織、專案和管線,負責更新命名空間內的物件。

    管線可追蹤性

  • 診斷資源健康情況 - 工作負載狀態有助於快速偵錯新部署可能引進的錯誤或回歸。 例如,針對導致 ImagePullBackOff 錯誤的未設定 imagePullSecrets ,Pod 狀態資訊可協助您找出問題的根本原因。

    ImagePullBackOff

  • 檢閱應用程式 - 檢 閱應用程式的運作方式是將 Git 存放庫中的每個提取要求部署到環境中的動態 Kubernetes 資源。 檢閱者可以在合併到目標分支並部署到生產環境之前,先查看這些變更的外觀,並與其他相依服務搭配使用。

使用 Azure Kubernetes Service

當您使用 AKS Azure Kubernetes Service () 時,會在您選擇的叢集和命名空間中建立ServiceAccount。 針對已啟用 Kubernetes RBAC的叢集, RoleBinding 也會建立,以將已建立的服務帳戶範圍限制為所選的命名空間。 針對 Kubernetes RBAC 停用的叢集,建立的 ServiceAccount 具有跨命名空間) 的全叢集許可權 (。

新增 AKS Kubernetes 資源

  1. 在 [環境詳細資料] 頁面中,選取 [ 新增資源 ],然後選擇 [Kubernetes]。

  2. 在 [提供者] 下拉式清單中選取 [Azure Kubernetes Service]。

  3. 選擇 azure 訂用帳戶、叢集和命名空間 (新的/現有) 。

  4. 選取 [驗證並建立 ] 以建立 Kubernetes 資源。

  5. 確認您看到您環境的叢集。 如果您尚未將程式碼部署至叢集,您會看到「永不部署」文字。

    新增 Kubernetes 叢集。

使用現有的服務帳戶

Azure Kubernetes Service會將環境內的 Kubernetes 資源對應至命名空間。

如需在環境外部設定 Kubernetes 服務連線的詳細資訊,請參閱服務連線中的Kubernetes 服務連線一節。

提示

使用泛型提供者 (現有的服務帳戶) ,將 Kubernetes 資源對應至非 AKS 叢集的命名空間。

新增非 AKS Kubernetes 資源

  1. 在 [環境詳細資料] 頁面中,選取 [ 新增資源 ],然後選擇 [Kubernetes]。

  2. 選取 [一般提供者 (您提供者的現有服務帳戶)

  3. 新增叢集名稱和命名空間值。

  4. 新增伺服器 URL。 您可以使用下列命令來取得 URL:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. 若要取得秘密物件。

    Kubernetes 1.22+

    以您的帳戶名稱取代 service-account-name

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

    如果您未取得任何專案,請參閱 手動建立 ServiceAccount 的長期 API 權杖

    Kubernetes 1.22 和以下版本:

    1. 尋找服務帳戶秘密名稱
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. 將 取代 <service-account-secret-name> 為此命令中上一個命令中的值
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. 使用上一個步驟的輸出取得秘密物件。

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. 將 JSON 格式擷取的 Secret 物件複製並貼到 [秘密] 欄位中。

  8. 選取 [驗證並建立 ] 以建立 Kubernetes 資源。

參考管線中的 Kubernetes 資源

如果您使用Azure Kubernetes Service並建置 YAML 管線,設定管線最簡單的方式就是使用範本。 連線到您的存放庫,然後選取下列兩個 Kubernetes Service 選項之一:

範本可讓您設定審核應用程式,而不需要從頭開始撰寫 YAML 程式碼,或手動建立明確的角色系結。

Kubernetes 範本選項。

設定檢閱應用程式

在下列範例中,會針對非 PR 分支執行第一個部署作業,並在環境中針對一般 Kubernetes 資源執行部署。 第二個作業只會針對 PR 分支執行,並針對 Kubernetes 叢集內的檢閱應用程式資源 (命名空間部署,) 視需要產生。 資源會在環境的資源清單檢視中加上「檢閱」標籤。 定義管線中使用的變數。 如果您使用 部署至 Azure Kubernetes Services 範本,這些變數會為您定義。

# 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: $(envName).$(resourceName)
    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: $(envName).$(resourceName)
    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"

若要在 現有的 管線中使用此作業,必須修改備份一般 Kubernetes 環境資源的服務連線,以「使用叢集管理員認證」。 否則,必須針對基礎服務帳戶建立角色系結至檢閱應用程式命名空間。

後續步驟