部署至 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 指令清單檔案。 動作可讓您使用 Helm、Kustomize 和 Kompose 等工具。 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 選項的優點是,它會建立新的 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/*