部署至 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 指令清單檔案。 動作可讓您使用工具,例如 Helm、Kustomize 和 Kompose。 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 選項的優點是,它會建立新的 ServiceAccount 和 RoleBinding 物件(而不是重複使用現有的 ServiceAccount),讓新建立的 RoleBinding 物件只能將 ServiceAccount 的作業限制為所選命名空間。
當您使用泛型提供者方法時,請確定 RoleBinding 存在,這會授與所需服務帳戶的許可權edit
ClusterRole
。 您必須將許可權授與正確的服務帳戶,讓 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/*