部署到 Kubernetes
Azure DevOps Services | Azure DevOps Server 2022
可以使用 Azure Pipelines 部署到 Azure Kubernetes 服务,以及其他云提供商提供的 Kubernetes 群集。 Azure Pipelines 有两个可与 Kubernetes 配合使用的任务:
- KubernetesManifest 任务:使用 Helm、Kompose 或 Kustomize 烘焙清单并将其部署到 Kubernetes 群集
- Kubectl 任务:运行 kubectl 命令来部署、配置或更新 Azure 容器服务中的 Kubernetes 群集
如果你将 Azure Kubernetes 服务与上述任一任务配合使用,则最好使用 Azure 资源管理器服务连接类型连接到专用群集或禁用了本地帐户的群集。
为了提高部署可跟踪性,请通过某个 Kubernetes 任务在环境中使用 Kubernetes 资源。
若要开始使用 Azure Pipelines 和 Azure Kubernetes 服务,请参阅使用 Azure Pipelines 生成和部署到 Azure Kubernetes 服务。 若要开始使用 Azure Pipelines、Kubernetes 和具体的 Canary 部署策略,请参阅通过 Azure Pipelines 对 Kubernetes 部署使用 Canary 部署策略。
KubernetesManifest 任务
KubernetesManifest 任务在将任务标记为成功/失败之前检查对象稳定性。 该任务还可以执行工件替换,添加与管道可跟踪性相关的注释,简化 imagePullSecrets 的创建和引用,烘焙清单,并帮助推出部署策略。
注意
虽然基于 YAML 的管道支持对单个 Git 存储库使用触发器,但如果你需要对存储在另一个 Git 存储库中的清单文件使用触发器,或者如果 Azure 容器注册表或 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 容器服务中部署、配置和更新 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 部署策略。
多云 Kubernetes 部署
Kubernetes 在所有云提供商平台上以相同的方式运行。 可以使用 Azure Pipelines 部署到 Azure Kubernetes 服务 (AKS)、Google Kubernetes Engine (GKE)、Amazon Elastic Kubernetes 服务 (EKS),或任何其他云提供商提供的群集。
若要设置多云部署,请创建一个环境,然后添加与 Kubernetes 群集的命名空间关联的 Kubernetes 资源。
基于现有服务帐户的常规提供程序方法适用于任何云提供商(包括 Azure)提供的群集。 改用 Azure Kubernetes 服务选项的优势在于,它创建新的 ServiceAccount 和 RoleBinding 对象(而不是重用现有的 ServiceAccount),以便新建的 RoleBinding 对象将 ServiceAccount 的操作限制为仅限所选命名空间。
使用通用提供程序方法时,请确保存在 RoleBinding,该角色授予所需服务帐户的权限edit
ClusterRole
。 需要向正确的服务帐户授予权限,以便 Azure Pipelines 可以使用该服务帐户在所选命名空间中创建对象。
并行部署到多个云
以下示例演示如何并行部署到多个云中的群集。 在此示例中,部署目标包括 AKS、GKE、EKS 和 OpenShift 群集。 这四个命名空间与 contoso
环境中的 Kubernetes 资源相关联。
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/*