使用生成或发布管道中的 Kubernetes 清单任务,使用 Helm 图表将清单烘焙和部署到 Kubernetes 群集。
此版本的任务已弃用;使用 KubernetesManifest@1 利用 工作负载标识联合等最新功能。
使用生成或发布管道中的 Kubernetes 清单任务,使用 Helm 图表将清单烘焙和部署到 Kubernetes 群集。
语法
# Deploy to Kubernetes v0
# Use Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts.
- task: KubernetesManifest@0
  inputs:
    #action: 'deploy' # 'bake' | 'createSecret' | 'delete' | 'deploy' | 'patch' | 'promote' | 'scale' | 'reject'. Action. Default: deploy.
    #kubernetesServiceConnection: # string. Required when action != bake. Kubernetes service connection. 
    #namespace: # string. Namespace. 
    #strategy: 'none' # 'canary' | 'none'. Optional. Use when action = deploy || action = promote || action = reject. Strategy. Default: none.
    #trafficSplitMethod: 'pod' # 'pod' | 'smi'. Optional. Use when strategy = canary. Traffic split method. Default: pod.
    #percentage: '0' # string. Required when strategy = Canary && action = deploy. Percentage. Default: 0.
    #baselineAndCanaryReplicas: '1' # string. Required when strategy = Canary && action = deploy && trafficSplitMethod = SMI. Baseline and canary replicas. Default: 1.
    #manifests: # string. Required when action = deploy || action = promote || action = reject. Manifests. 
    #containers: # string. Optional. Use when action = deploy || action = promote || action = bake. Containers. 
    #imagePullSecrets: # string. Optional. Use when action = deploy || action = promote. ImagePullSecrets. 
    #renderType: 'helm' # 'helm' | 'kompose' | 'kustomize'. Optional. Use when action = bake. Render Engine. Default: helm.
    #dockerComposeFile: # string. Required when action = bake && renderType = kompose. Path to docker compose file. 
    #helmChart: # string. Required when action = bake && renderType = helm. Helm Chart. 
    #releaseName: # string. Optional. Use when action = bake && renderType = helm. Helm Release Name. 
    #overrideFiles: # string. Optional. Use when action = bake && renderType = helm. Override Files. 
    #overrides: # string. Optional. Use when action = bake && renderType = helm. Overrides. 
    #kustomizationPath: # string. Optional. Use when action = bake && renderType = kustomize. Kustomization Path. 
    #resourceToPatch: 'file' # 'file' | 'name'. Required when action = patch. Resource to patch. Default: file.
    #resourceFileToPatch: # string. Required when action = patch && resourceToPatch = file. File path. 
    #kind: # 'deployment' | 'replicaset' | 'statefulset'. Required when action = scale || resourceToPatch = name. Kind. 
    #name: # string. Required when action = scale || resourceToPatch = name. Name. 
    #replicas: # string. Required when action = scale. Replica count. 
    #mergeStrategy: 'strategic' # 'json' | 'merge' | 'strategic'. Required when action = patch. Merge Strategy. Default: strategic.
    #arguments: # string. Optional. Use when action = delete. Arguments. 
    #patch: # string. Required when action = patch. Patch. 
    #secretType: 'dockerRegistry' # 'dockerRegistry' | 'generic'. Required when action = createSecret. Type of secret. Default: dockerRegistry.
    #secretName: # string. Optional. Use when action = createSecret. Secret name. 
    #secretArguments: # string. Optional. Use when action = createSecret && secretType = generic. Arguments. 
    #dockerRegistryEndpoint: # string. Optional. Use when action = createSecret && secretType = dockerRegistry. Docker registry service connection. 
    #rolloutStatusTimeout: '0' # string. Optional. Use when action = deploy || action = patch || action = scale || action = promote. Timeout for rollout status. Default: 0.
输入
              action
               - 
              操作
              string。 允许的值:bake、createSecret(创建机密)、delete、deploy、patch、promote、scale、reject。 默认值:deploy。
指定要执行的作。
              namespace
               - 
              命名空间
              string。
使用 –namespace 标志指定命令的命名空间。 如果未提供命名空间,命令将在默认命名空间中运行。
              strategy
               - 
              策略
              string。 可选。 当 action = deploy || action = promote || action = reject时使用。 允许的值:canary、none。 默认值:none。
指定在 deploy作或 promote作之前 reject作中使用的部署策略。 目前,canary 是唯一可接受的部署策略。
              trafficSplitMethod
               - 
              流量拆分方法
              string。 可选。 当 strategy = canary时使用。 允许的值:pod、smi。 默认值:pod。
对于值 smi,流量拆分的百分比是在请求级别使用服务网格完成的。 服务网格必须由群集管理员设置。此任务处理 SMI TrafficSplit 对象的业务流程。
对于值 pod,在缺少服务网格的情况下,无法在请求级别拆分百分比。 相反,百分比输入用于计算基线和 Canary 的副本。 计算是稳定变体的输入清单中指定的副本的百分比。
              percentage
               - 
              百分比
              string。 
              strategy = Canary && action = deploy时是必需的。 默认值:0。
用于计算清单文件中包含的工作负荷的基线变体和 canary-variant 副本数的百分比。
对于指定的百分比输入,计算:
(百分比 × 副本数) / 100
如果结果不是整数,则会在创建基线和 Canary 变体时使用结果的数学底层。
例如,假设部署 hello-world 位于输入清单文件中,并且以下行位于任务输入中:
replicas: 4
strategy: canary
percentage: 25
在这种情况下,将创建部署 hello-world-baseline 和 hello-world-canary,每个副本都有一个副本。 基线变体是使用与稳定版本相同的映像和标记创建的,这是部署前的四个副本变体。 Canary 变体是使用与新部署的更改对应的映像和标记创建的。
              baselineAndCanaryReplicas
               - 
              基线和 canary 副本
              string。 
              strategy = Canary && action = deploy && trafficSplitMethod = SMI时是必需的。 默认值:1。
将 trafficSplitMethod 设置为 smi时,流量拆分百分比控制在服务网格平面中。 可以独立于流量拆分来控制 Canary 和基线变体的实际副本数。
例如,假设输入部署清单为稳定变体指定 30 个副本。 另外,假设你为任务指定了以下输入:
strategy: canary
trafficSplitMethod: smi
percentage: 20
baselineAndCanaryReplicas: 1
在这种情况下,稳定变体接收流量的 80%,而基线和 canary 变体分别接收指定 20%的一半。 基线和 Canary 变体不会分别接收三个副本。 相反,它们接收指定的副本数,这意味着每个副本都会收到一个副本。
              manifests
               - 
              清单
              string。 
              action = deploy || action = promote || action = reject时是必需的。
指定要用于部署的清单文件的路径。 每行表示单个路径。 文件匹配模式 是每行可接受的值。
              containers
               - 
              容器
              string。 可选。 当 action = deploy || action = promote || action = bake时使用。
指定要用于清单文件替换的图像的完全限定资源 URL。 URL contosodemo.azurecr.io/helloworld:test 是一个示例。
              imagePullSecrets
               - 
              ImagePullSecrets
              string。 可选。 当 action = deploy || action = promote时使用。
指定多行输入,其中每行都包含已在群集中设置的 Docker 注册表机密的名称。 每个机密名称在输入清单文件中找到的工作负荷的 imagePullSecrets 下添加。
              renderType
               - 
              呈现引擎
              string。 可选。 当 action = bake时使用。 允许的值:helm、kompose、kustomize。 默认值:helm。
指定用于生成清单文件的呈现类型。
              dockerComposeFile
               - 
              docker compose 文件 的路径
              string。 
              action = bake && renderType = kompose时是必需的。
指定 docker-compose 文件路径。
              helmChart
               - 
              Helm 图表
              string。 
              action = bake && renderType = helm时是必需的。
指定要烘焙的 Helm 图表路径。
              releaseName
               - 
              Helm 发布名称
              string。 可选。 当 action = bake && renderType = helm时使用。
指定要使用的 Helm 发行名称。
              overrideFiles
               - 
              重写文件
              string。 可选。 当 action = bake && renderType = helm时使用。
指定接受替代文件路径的多行输入。 当 Helm 图表中的清单文件烘焙时,将使用这些文件。
              overrides
               - 
              替代
              string。 可选。 当 action = bake && renderType = helm时使用。
指定要设置的重写值。
              kustomizationPath
               - 
              Kustomization 路径
              string。 可选。 当 action = bake && renderType = kustomize时使用。
指定一个参数,该参数必须是包含文件的目录的路径,或者指定与存储库根目录相关的 same 路径后缀的 git 存储库 URL。
              resourceToPatch
               - 
              要修补 的资源
              string。 
              action = patch时是必需的。 允许的值:file、name。 默认值:file。
指示以下修补程序方法之一:
- 清单文件标识要修补的对象。
 - 单个对象按种类和名称标识为修补程序目标。
 
可接受的值为 文件 和 名称。
              resourceFileToPatch
               - 
              文件路径
              string。 
              action = patch && resourceToPatch = file时是必需的。
指定用于修补程序的文件的路径。
              kind
               - 
              类
              string。 
              action = scale || resourceToPatch = name时是必需的。 允许的值:deployment、replicaset、statefulset。
指定 K8s 对象的类型,例如 deployment、replicaSet 等。
              name
               - 
              名称
              string。 
              action = scale || resourceToPatch = name时是必需的。
指定 K8s 对象的名称。
              replicas
               - 
              副本计数
              string。 
              action = scale时是必需的。
指定要缩放到的副本数。
              mergeStrategy
               - 
              合并策略
              string。 
              action = patch时是必需的。 允许的值:json、merge、strategic。 默认值:strategic。
指定要提供的修补程序的类型。
              arguments
               - 
              参数
              string。 可选。 当 action = delete时使用。
指定 kubectl delete 命令的参数。 例如:arguments: deployment hello-world foo-bar
              patch
               - 
              补丁
              string。 
              action = patch时是必需的。
指定修补程序的内容。
机密的 secretType -  类型
              string。 
              action = createSecret时是必需的。 允许的值:dockerRegistry、generic。 默认值:dockerRegistry。
创建或更新泛型或 docker imagepullsecret。 指定 dockerRegistry 以创建或更新所选注册表的 imagepullsecret。 
              imagePullSecret 是将包含容器注册表密码的机密传递给 Kubelet 的一种方法,因此它可以代表 Pod 拉取专用映像。
              secretName
               - 
              机密名称
              string。 可选。 当 action = createSecret时使用。
指定机密的名称。 可以在 Kubernetes YAML 配置文件中使用此机密名称。
              secretArguments
               - 
              参数
              string。 可选。 当 action = createSecret && secretType = generic时使用。
指定要在机密中插入的键和文本值。 例如, --from-literal=key1=value1--from-literal=key2="top secret"。
              dockerRegistryEndpoint
               - 
              Docker 注册表服务连接
              string。 可选。 当 action = createSecret && secretType = dockerRegistry时使用。
指定用于在群集中创建 Docker 注册表机密的指定服务连接的凭据。 然后,imagePullSecrets 字段下的清单文件可以引用此机密的名称。
              rolloutStatusTimeout
               - 
              推出状态 超时
              string。 可选。 当 action = deploy || action = patch || action = scale || action = promote时使用。 默认值:0。
指定在结束 watch on rollout 状态之前等待的时间长度(以秒为单位)。
任务控制选项
除任务输入之外,所有任务都具有控制选项。 有关详细信息,请参阅 控件选项和常见任务属性。
输出变量
此任务定义以下 输出变量,可以在下游步骤、作业和阶段中使用。
manifestsBundle
               指定通过烘焙作创建的清单捆绑包的位置。
注解
注释
有一个较新版本的任务可用,它使用 connectionType 属性以不同方式为 Kubernetes 群集提供附加支持。 有关详细信息,请参阅 KubernetesManifest@1 和 KubernetesManifest@1 服务连接备注
在生成或发布管道中使用 Kubernetes 清单任务来烘焙清单并将其部署到 Kubernetes 群集。
此任务支持以下各项:
项目替换:部署作将作为容器映像列表的输入,可以指定容器映像及其标记和摘要。 在应用程序到群集之前,同一输入将替换为非模板化清单文件。 此替换可确保群集节点提取正确的映像版本。
清单稳定性:检查已部署的 Kubernetes 对象的推出状态。 稳定性检查合并在一起,以确定任务状态是成功还是失败。
可跟踪性注释:将批注添加到已部署的 Kubernetes 对象,以叠加可跟踪性信息。 支持以下批注:
- azure-pipelines/org
 - azure-pipelines/项目
 - azure-pipelines/管道
 - azure-pipelines/pipelineId
 - azure-pipelines/execution
 - azure-pipelines/executionuri
 - azure-pipelines/jobName
 
机密处理:
createSecret作允许使用 Docker 注册表服务连接创建 Docker 注册表机密。 它还允许使用纯文本变量或机密变量创建通用机密。 在部署到群集之前,可以使用secrets输入以及deploy作来使用适当的imagePullSecrets值来扩充输入清单文件。烘焙清单:任务
bake作允许将模板烘焙到 Kubernetes 清单文件中。 该作使用 Helm、Compose 和 Kustomize 等工具。 通过烘焙,这些 Kubernetes 清单文件可用于部署到群集。部署策略:使用
canary作选择deploy策略会导致创建后缀为-baseline和-canary的工作负荷名称。 该任务支持两种流量拆分方法:服务网格接口:服务网格接口(SMI)抽象允许使用服务网格提供程序(如
Linkerd和Istio)进行配置。 Kubernetes 清单任务将 SMITrafficSplit对象映射到部署策略生命周期中的稳定、基线和 Canary 服务。基于服务网格并使用此任务的 Canary 部署更准确。 此准确性是由于服务网格提供程序如何启用基于粒度百分比的流量拆分。 服务网格使用注入 Pod 的服务注册表和 sidecar 容器。 此注入与应用程序容器一起进行,以实现精细的流量拆分。
没有服务网格的 Kubernetes:如果没有服务网格,可能无法在请求级别获得所需的确切百分比拆分。 但是,可以使用稳定变体旁边的基线和 Canary 变体来执行 Canary 部署。
服务将请求发送到所有三个工作负荷变体的 Pod,因为满足选择器标签约束。 Kubernetes 清单在创建基线和 Canary 变体时遵循这些请求。 此路由行为可实现仅将部分请求路由到 Canary 的预期效果。
通过使用发布管道中的 手动干预任务 或 YAML 管道中的 延迟任务 来比较基线和 Canary 工作负荷。 在使用任务的提升或拒绝作之前执行比较。
部署作
以下 YAML 代码是使用清单文件部署到 Kubernetes 命名空间的示例:
steps:
- task: KubernetesManifest@0
  displayName: Deploy
  inputs:
    kubernetesServiceConnection: someK8sSC1
    namespace: default
    manifests: |
      manifests/deployment.yml
      manifests/service.yml
    containers: |
      foo/demo:$(tagVariable1)
      bar/demo:$(tagVariable2)
    imagePullSecrets: |
      some-secret
      some-other-secret
在上面的示例中,任务尝试查找清单文件中图像 foo/demo 和 bar/demo 的匹配项。 对于找到的每个匹配项,tagVariable1 或 tagVariable2 的值将作为标记追加到映像名称中。 还可以在容器输入中为项目替换指定摘要。
注释
虽然可以使用与部署策略相关的 YAML 输入创作 deploy、promote和 reject作,但对手动干预任务的支持目前不适用于生成管道。
对于发布管道,建议按以下顺序使用与部署策略相关的作和输入:
- 使用 
strategy: canary和percentage: $(someValue)指定的部署作。 - 手动干预任务,以便可以暂停管道,并将基线变体与 Canary 变体进行比较。
 - 在恢复手动干预任务时运行的提升作;如果拒绝手动干预任务,则会运行拒绝作。
 
创建机密作
以下 YAML 代码演示如何使用 Docker 注册表服务连接创建 Docker 注册表机密:
steps:
- task: KubernetesManifest@0
  displayName: Create secret
  inputs: 
    action: createSecret
    secretType: dockerRegistry
    secretName: foobar
    dockerRegistryEndpoint: demoACR
    kubernetesServiceConnection: someK8sSC
    namespace: default
此 YAML 代码演示了创建泛型机密的示例:
steps:
- task: KubernetesManifest@0
  displayName: Create secret
  inputs: 
    action: createSecret
    secretType: generic
    secretName: some-secret
    secretArguments: --from-literal=key1=value1
    kubernetesServiceConnection: someK8sSC
    namespace: default
烘焙作
以下 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
注释
若要直接使用 Helm 来管理发布和回滚,请参阅 包并部署 Helm 图表任务。
Kustomize 示例
以下 YAML 代码是使用 Kustomize 生成的包含 kustomization.yaml 文件的烘焙清单文件的示例。
steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from kustomization path
  inputs:
    action: bake
    renderType: kustomize
    kustomizationPath: folderContainingKustomizationFile
- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: k8sSC1
    manifests: $(bake.manifestsBundle)
Kompose 示例
以下 YAML 代码是使用 Kompose 生成的清单文件(Docker Compose 的转换工具)生成的一个示例。
steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from Docker Compose
  inputs:
    action: bake
    renderType: kompose
    dockerComposeFile: docker-compose.yaml
- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: k8sSC1
    manifests: $(bake.manifestsBundle)
缩放操作
以下 YAML 代码显示了缩放对象的示例:
steps:
- task: KubernetesManifest@0
  displayName: Scale
  inputs: 
    action: scale
    kind: deployment
    name: bootcamp-demo
    replicas: 5
    kubernetesServiceConnection: someK8sSC
    namespace: default
修补作
以下 YAML 代码显示了对象修补的示例:
steps:
- task: KubernetesManifest@0
  displayName: Patch
  inputs: 
    action: patch
    kind: pod
    name: demo-5fbc4d6cd9-pgxn4
    mergeStrategy: strategic
    patch: '{"spec":{"containers":[{"name":"demo","image":"foobar/demo:2239"}]}}'
    kubernetesServiceConnection: someK8sSC
    namespace: default
删除操作
此 YAML 代码显示示例对象删除:
steps:
- task: KubernetesManifest@0
  displayName: Delete
  inputs:
    action: delete
    arguments: deployment expressapp
    kubernetesServiceConnection: someK8sSC
    namespace: default
故障排除
我的 Kubernetes 群集位于防火墙后面,我正在使用托管代理。 如何部署到此群集?
可以通过允许托管代理的 IP 地址,通过防火墙授予托管代理的访问权限。 有关更多详细信息,请参阅代理 IP 范围。
在 Canary 部署的情况下,对稳定和变体服务路由的请求是如何工作的?
Kubernetes 中 pod 和服务之间的标签选择器关系允许设置部署,以便单个服务将请求路由到稳定变体和 Canary 变体。 Kubernetes 清单任务将此用于 Canary 部署。
如果任务包括 action: deploy 和 strategy: canary的输入,则为输入清单文件中定义的每个工作负荷(部署、ReplicaSet、Pod、...)创建 -baseline 和 -canary 变体。 在此示例中,输入清单文件中有一个部署 sampleapp,在管道运行第 22 号完成后,群集中部署了名为 sampleapp 的此部署的稳定变体。 在后续运行(在本例中运行编号 23),具有 action: deploy 和 strategy: canary 的 Kubernetes 清单任务将导致根据输入清单文件创建 sampleapp-baseline 和 sampleapp-canary 部署,其副本数由 percentage 任务输入的乘积决定,其副本数取决于输入清单文件的最终稳定变体 sampleapp 所需的副本数。
不包括副本数,基线版本的配置与稳定变体相同,而 Canary 版本具有当前运行引入的新更改(在本例中,运行编号 23)。 如果在上述步骤之后在管道中设置了手动干预,它将允许有机会暂停管道,以便管道管理员可以评估基线和 Canary 版本的关键指标,并决定 Canary 更改是否安全且足以全面推出。
Kubernetes 清单任务的action: promote、strategy: canary 或 action: reject 和 strategy: canary 输入可以分别用于升级或拒绝 Canary 更改。 请注意,在此步骤结束时,只有输入清单文件中声明的工作负荷的稳定变体将保留在群集中,同时清理临时基线和 Canary 版本。