共用方式為


部署至 Kubernetes

Azure DevOps 服務 |Azure DevOps Server |Azure DevOps Server 2022

使用 Azure Pipelines 部署至其他雲端提供者所提供的 Azure Kubernetes Service 和 Kubernetes 叢集。 Azure Pipelines 有兩項任務可搭配 Kubernetes 使用:

  • KubernetesManifest 任務:使用 Helm、Kompose 或 Kustomize 將清單製作並部署至 Kubernetes 叢集
  • Kubectl 工作:執行 kubectl 命令,在 Azure Container Service 中部署、設定及更新 Kubernetes 叢集

如果您使用 Azure Kubernetes Service 搭配任一工作,Azure Resource Manager 服務連線類型是連線到私人叢集或停用本機帳戶的叢集的最佳方式。

如需新增的部署可追蹤性,請使用環境中的Kubernetes 資源以及 Kubernetes 工作。

若要開始使用 Azure Pipelines 和 Azure Kubernetes Service,請參閱 使用 Azure Pipelines 建置和部署至 Azure Kubernetes Service。 若要開始使用 Azure Pipelines、Kubernetes 和 Canary 部署策略,請參閱 搭配 Azure Pipelines 使用 Kubernetes 部署的 Canary 部署策略

KubernetesManifest 工作

KubernetesManifest 工作會先檢查物件穩定性,再將工作標示為成功或失敗。 工作也可以執行工件替代、新增管線追蹤相關註解、簡化 imagePullSecrets 的建立和參考、生成清單,以及協助部署策略實施。

注意

以 YAML 為基礎的運行流程支援在單一 Git 儲存庫上觸發事件。 如果您需要在另一個 Git 存放庫中儲存的清單檔案的觸發條件,或在 Azure 容器註冊表或 Docker Hub 需要觸發條件,請改用傳統管線而非基於 YAML 的管線。

您可以在 Kubernetes 指令清單任務 中使用製作動作,將範本製作成 Kubernetes 指令清單檔案。 動作可讓您使用工具,例如 HelmKustomizeKompose。 Kubernetes 指令清單任務的建置操作會顯示輸入範本與用於部署的最終指令清單檔案之間的轉換。 您可以在工作流程中使用下游處理過的清單檔案,作為 Kubernetes 清單工作中部署動作的輸入。

部署作業作為環境一部分的 Kubernetes 資源作為目標。 使用環境和資源部署可改善管線可追蹤性,協助您診斷部署問題。 您也可以使用一般的 作業 部署至 Kubernetes 叢集,但不具備相同的健康檢查功能。

下列 YAML 程式碼示範如何從 Helm chart 生成 manifest 檔案

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

Kubectl 工作

作為 KubernetesManifest 任務 的替代方案,可以使用 Kubectl 任務 執行 kubectl 命令,以在 Azure Container Service 中部署、配置和更新 Kubernetes 叢集。

此範例示範服務連線如何參考 Kubernetes 叢集。

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

腳本任務

請將kubectl腳本工作搭配使用。

這個範例會使用腳本來執行 kubectl

- script: |
    kubectl apply -f manifest.yml

Kubernetes 部署策略

Kubernetes 宣告檔案任務 支援金絲雀部署策略。 使用金絲雀部署策略來部分引入新的變更,讓新的變更與現有的部署共存,然後再完全推出。

如需使用 Azure Pipelines 進行 Kubernetes 部署的 Canary 部署策略的詳細資訊,請參閱 搭配 Azure Pipelines 使用 Kubernetes 部署的 Canary 部署策略

多雲 Kubernetes 部署

Kubernetes 在所有雲端提供者上的運作方式都相同。 使用 Azure Pipelines 部署至 Azure Kubernetes Service (AKS)、Google Kubernetes Engine (GKE)、Amazon Elastic Kubernetes Service (EKS),或來自其他雲端提供者的叢集。

若要設定多重雲端部署, 請建立環境 ,並新增與 Kubernetes 叢集命名空間相關聯的 Kubernetes 資源。

一般提供者方法會根據現有的服務帳戶,與任何雲端提供者的叢集搭配使用,包括 Azure。 使用 Azure Kubernetes Service 選項會建立新的 ServiceAccountRoleBinding 物件。 這可確保 RoleBinding 物件會將 ServiceAccount 的作業限制為所選的命名空間。

使用泛型提供者方法時,請確保已建立 RoleBinding,授予editClusterRole所需服務帳戶的許可權。 將許可權授與正確的服務帳戶,讓 Azure Pipelines 可用來在所選的命名空間中建立物件。

對多個雲端的平行部署

下列範例示範如何對多個雲端中的叢集執行平行部署。 在此範例中,有 AKS、GKE、EKS 和 OpenShift 叢集的部署。 這四個命名空間會與環境中的 Kubernetes 資源 contoso 相關聯。

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/*