共用方式為


部署至 Kubernetes

Azure DevOps Services |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 服務,請參閱 使用 Azure Pipelines 建置和部署至 Azure Kubernetes Service。 若要開始設定 Azure Pipelines、Kubernetes 和 Canary 部署策略,請參閱 針對 Kubernetes 部署搭配 Azure Pipelines 使用 Canary 部署策略

KubernetesManifest 工作

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

注意

雖然 YAML 型管線支援單一 Git 存放庫的觸發機制,但如果您需要針對儲存在其他 Git 存放庫中的清單檔案進行觸發,或需要在 Azure Container Registry 或 Docker Hub 上觸發,您應該使用傳統管線,而不是 YAML 型管線。

您可以在 Kubernetes 指令清單任務 中使用製作動作,將範本製作成 Kubernetes 指令清單檔案。 動作可讓您使用工具,例如 HelmKustomizeKompose。 Kubernetes 指令清單任務的打包操作讓您能查看從輸入範本到部署中使用的最終清單檔案的轉換過程。 您可以在工作流程中使用下游處理過的清單檔案,作為 Kubernetes 清單工作中部署動作的輸入。

您可以將部署作業目標設定為屬於環境的 Kubernetes 資源。 使用環境和資源部署可讓您存取更佳的管線可追蹤性,以便診斷部署問題。 您也可以使用一般的 作業 部署至 Kubernetes 叢集,但不具備相同的健康檢查功能。

下列 YAML 程式碼是從 Helm Chart 生成配置文件的範例

steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from Helm chart
  inputs:
    action: bake
    helmChart: charts/sample
    overrides: 'image.repository:nginx'

- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: someK8sSC
    namespace: default
    manifests: $(bake.manifestsBundle)
    containers: |
      nginx: 1.7.9

Kubectl 工作

作為 KubernetesManifest 工作的替代方案,您可以使用 Kubectl 工作,藉由執行 kubectl 命令,在 Azure 容器服務中部署、設定及更新 Kubernetes 叢集。

下列範例示範如何使用服務聯機來參考 Kubernetes 叢集。

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

腳本任務

您也可以使用kubectl搭配腳本任務

下列範例會使用腳本來執行 kubectl

- script: |
    kubectl apply -f manifest.yml

Kubernetes 部署策略

Kubernetes 清單工作目前支援金絲雀部署策略。 使用金絲雀部署策略來部分部署新的變更,讓新變更與當前的部署共存,然後再全面推出。

如需有關在 Azure Pipelines 中使用管線進行 Kubernetes 部署的 Canary 部署策略的詳細資訊,請參閱 使用 Kubernetes 部署搭配 Azure Pipelines 的 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 物件(而不是重複使用現有的 ServiceAccount),讓新建立的 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@0
          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@0
          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@0
          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@0
          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@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: digitaloceannamespace
            manifests: manifests/*