部署到 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 清单文件。 该操作允许使用 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 容器服务中部署、配置和更新 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 服务选项的优势在于,它创建新的 ServiceAccountRoleBinding 对象(而不是重用现有的 ServiceAccount),以便新建的 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@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/*