部署至 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 部署策略,請參閱 搭配 Azure Pipelines 使用 Kubernetes 部署的 Canary 部署策略。

KubernetesManifest 工作

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

注意

雖然 YAML 型管線支援單一 Git 存放庫上的觸發程式,但如果您需要儲存在另一個 Git 存放庫中的指令清單檔案觸發程式,或 Azure Container Registry 或 Docker Hub 需要觸發程式,您應該使用傳統管線,而不是 YAML 型管線。

您可以使用 Kubernetes 指令清單工作中的製作動作,將範本製作成 Kubernetes 指令清單檔案。 動作可讓您使用 HelmKustomizeKompose 等工具。 Kubernetes 指令清單工作的製作動作可讓您查看輸入範本與部署中使用的結束指令清單檔案之間的轉換。 您可以取用下游的已製作指令清單檔案(工作中)作為 Kubernetes 指令清單工作的部署動作的輸入。

您可以使用部署作業,以屬於環境一部分的 Kubernetes 資源為目標。 使用環境和資源部署可讓您存取更佳的管線可追蹤性,以便診斷部署問題。 您也可以使用一般 作業 部署至 Kubernetes 叢集,而不需要相同的健康情況功能。

下列 YAML 程式代碼是從 Helm 圖表製作指令清單檔案的範例

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 KubernetesManifest 工作,您可以使用 Kubectl 工作 ,藉由執行 kubectl 命令,在 Azure Container Service 中部署、設定及更新 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 指令清單工作目前支援 Canary 部署策略。 使用 Canary 部署策略來部分部署新的變更,讓新的變更與目前的部署共存,再進行完整推出。

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

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