部署到 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 部署策略,请参阅 将 Canary 部署策略用于将 Kubernetes 部署与 Azure Pipelines 配合使用

KubernetesManifest 任务

KubernetesManifest 任务在将任务标记为成功或失败之前检查对象稳定性。 该任务还可以执行工件替换,添加与管道可跟踪性相关的注释,简化 imagePullSecrets 的创建和引用,烘焙清单,并帮助推出部署策略。

注意

基于 YAML 的管道支持单个 Git 存储库上的触发器。 如果需要为另一个 Git 存储库中存储的清单文件设置触发器,或者需要为 Azure 容器注册表或 Docker Hub 设置触发器,请使用经典管道,而不是基于 YAML 的管道。

可以使用 Kubernetes 清单任务中的烘焙操作将模板烘焙为 Kubernetes 清单文件。 该操作允许使用 HelmKustomizeKompose 等工具。 Kubernetes manifest文件生成任务的生成操作显示了从输入模板到在部署中使用的最终清单文件之间的转换。 可以在下游(在任务中)使用烘焙后的清单文件作为 Kubernetes 清单任务的部署操作的输入。

目标 Kubernetes 资源,这些资源是包含部署作业环境的一部分。 使用环境和资源部署可提高管道可跟踪性,帮助诊断部署问题。 还可以使用没有相同运行状况功能的常规作业部署到 Kubernetes 群集。

以下 YAML 代码演示如何从 Helm 图表生成清单文件

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

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

Kubectl 任务

作为 KubernetesManifest KubernetesManifest 任务的替代方法,请使用 Kubectl 任务通过运行 kubectl 命令在 Azure 容器服务中部署、配置和更新 Kubernetes 群集。

此示例演示服务连接如何引用 Kubernetes 群集。

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

脚本任务

kubectl脚本任务一起使用。

此示例使用脚本运行 kubectl

- script: |
    kubectl apply -f manifest.yml

Kubernetes 部署策略

Kubernetes 清单任务支持 Canary 部署策略。 使用 Canary 部署策略部分部署新更改,以便在全面推出之前,新更改与当前部署共存。

有关使用管道的金丝雀部署的详细信息,请参阅 在 Azure Pipelines 中使用金丝雀部署策略进行 Kubernetes 部署

多云 Kubernetes 部署

Kubernetes 在所有云提供商上的工作方式相同。 使用 Azure Pipelines 部署到 Azure Kubernetes 服务(AKS)、Google Kubernetes 引擎(GKE)、Amazon Elastic Kubernetes 服务(EKS)或来自其他云提供商的群集。

若要设置多云部署, 请创建一个环境 ,并添加与 Kubernetes 群集命名空间关联的 Kubernetes 资源。

基于现有服务帐户的通用提供程序方法适用于来自任何云提供商(包括 Azure)的群集。 使用 Azure Kubernetes 服务选项创建新的 ServiceAccountRoleBinding 对象。 这可确保 RoleBinding 对象将 ServiceAccount 的操作限制为所选命名空间。

使用通用提供程序方法时,请确保存在 RoleBinding ,以授予所需服务帐户在 editClusterRole 的权限。 向正确的服务帐户授予权限,以便 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@1
          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@1
          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@1
          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@1
          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@1
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: digitaloceannamespace
            manifests: manifests/*