KubernetesManifest@1 - 部署到 Kubernetes v1 任务

使用 Kubernetes 清单文件部署到群集,甚至使用 Helm 图表烘焙要用于部署的清单文件。

语法

# Deploy to Kubernetes v1
# Use Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts.
- task: KubernetesManifest@1
  inputs:
    #action: 'deploy' # 'bake' | 'createSecret' | 'delete' | 'deploy' | 'patch' | 'promote' | 'scale' | 'reject'. Action. Default: deploy.
    #connectionType: 'kubernetesServiceConnection' # 'azureResourceManager' | 'kubernetesServiceConnection'. Required when action != bake. Service connection type. Default: kubernetesServiceConnection.
    #kubernetesServiceConnection: # string. Alias: kubernetesServiceEndpoint. Required when action != bake && connectionType = kubernetesServiceConnection. Kubernetes service connection. 
    #azureSubscriptionConnection: # string. Alias: azureSubscriptionEndpoint. Required when action != bake && connectionType = azureResourceManager. Azure subscription. 
    #azureResourceGroup: # string. Required when action != bake && connectionType = azureResourceManager. Resource group. 
    #kubernetesCluster: # string. Required when action != bake && connectionType = azureResourceManager. Kubernetes cluster. 
    #useClusterAdmin: false # boolean. Optional. Use when connectionType = azureResourceManager. Use cluster admin credentials. Default: false.
    #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. 允许的值: bakecreateSecret (创建机密) 、 deletedeploypatchpromotescalereject。 默认值:deploy

指定要执行的操作。


connectionType - 服务连接类型
string. 当 action != bake 时,需要此选项。 允许的值: azureResourceManager (Azure 资源管理器) 、 kubernetesServiceConnection (Kubernetes 服务连接) 。 默认值:kubernetesServiceConnection

选择 Kubernetes 服务连接类型。

  • kubernetesServiceConnection (Kubernetes 服务连接) - 允许提供 KubeConfig 文件、指定服务帐户或使用 Azure 订阅 选项导入 AKS 实例。 使用 Azure 订阅 选项导入 AKS 实例需要在服务连接配置时访问 Kubernetes 群集。
  • azureResourceManager (Azure 资源管理器) - 用于选择 AKS 实例。 在服务连接配置时不访问 Kubernetes 群集。

有关更多信息,请参见备注


kubernetesServiceConnection - Kubernetes 服务连接
输入别名: kubernetesServiceEndpointstring. 当 action != bake && connectionType = kubernetesServiceConnection 时,需要此选项。

指定 Kubernetes 服务连接


azureSubscriptionConnection - Azure 订阅
输入别名: azureSubscriptionEndpointstring. 当 action != bake && connectionType = azureResourceManager 时,需要此选项。

选择包含Azure 容器注册表的 Azure 资源管理器 订阅。注意:若要配置新服务连接,请从列表中选择 Azure 订阅,然后单击“授权”。 如果未列出订阅,或者想要使用现有的服务主体,可以使用“添加”或“管理”按钮设置 Azure 服务连接。


azureResourceGroup - 资源组
string. 当 action != bake && connectionType = azureResourceManager 时,需要此选项。

选择 Azure 资源组。


kubernetesCluster - Kubernetes 群集
string. 当 action != bake && connectionType = azureResourceManager 时,需要此选项。

选择 Azure 托管群集。


useClusterAdmin - 使用群集管理员凭据
boolean. 可选。 在 时 connectionType = azureResourceManager使用 。 默认值:false

使用群集管理员凭据,而不是默认的群集用户凭据。


namespace - 命名 空间
string.

使用 标志指定命令的 –namespace 命名空间。 如果未提供命名空间,则命令将在默认命名空间中运行。


strategy - 策略
string. 可选。 在 时 action = deploy || action = promote || action = reject使用 。 允许的值:canarynone。 默认值:none

指定在操作或操作之前promotereject的操作deploy中使用的部署策略。 目前, canary 是唯一可接受的部署策略。


trafficSplitMethod - 流量拆分方法
string. 可选。 在 时 strategy = canary使用 。 允许的值:podsmi。 默认值:pod

对于 值 smi,百分比流量拆分是使用服务网格在请求级别完成的。 服务网格必须由群集管理员设置。此任务处理 SMI TrafficSplit 对象的业务流程。

对于 值 pod,在没有服务网格的情况下,无法在请求级别进行百分比拆分。 相反,百分比输入用于计算基线和金丝雀的副本。 计算是在稳定变体的输入清单中指定的副本的百分比。


percentage - 百分比
string. 当 strategy = Canary && action = deploy 时,需要此选项。 默认值:0

用于计算清单文件中包含的工作负载的基线变体和金丝雀变体副本数的百分比。

对于指定的百分比输入,计算:

(百分比 × 副本数) / 100

如果结果不是整数,则创建基线和金丝雀变体时,将使用结果的数学下限。

例如,假设部署 hello-world 位于输入清单文件中,并且以下行位于任务输入中:

replicas: 4
strategy: canary
percentage: 25

在这种情况下,部署 hello-world-baselinehello-world-canary 是使用一个副本 (replica) 创建的。 使用与稳定版本相同的映像和标记创建基线变体,稳定版本是部署前的四副本 (replica) 变体。 金丝雀变体是使用与新部署的更改对应的映像和标记创建的。


baselineAndCanaryReplicas - 基线和金丝雀副本
string. 当 strategy = Canary && action = deploy && trafficSplitMethod = SMI 时,需要此选项。 默认值:1

设置为 时trafficSplitMethodsmi,流量拆分百分比在服务网格平面中受控制。 可以独立于流量拆分控制金丝雀和基线变体的实际副本数。

例如,假设输入部署清单为稳定变体指定 30 个副本。 此外,假设为任务指定以下输入:

strategy: canary
trafficSplitMethod: smi
percentage: 20
baselineAndCanaryReplicas: 1

在这种情况下,稳定变体接收 80% 的流量,而基线和金丝雀变体分别接收指定 20% 流量的一半。 基线和金丝雀变体各不接收三个副本。 它们接收指定数量的副本,这意味着它们分别接收一个副本 (replica) 。


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使用 。 允许的值:helmkomposekustomize。 默认值: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 - 自定义路径
string. 可选。 在 时 action = bake && renderType = kustomize使用 。

指定参数,该参数必须是包含该文件的目录的路径,或具有指定相对于存储库根的路径后缀 same 的 git 存储库 URL。


resourceToPatch - 要修补的资源
string. 当 action = patch 时,需要此选项。 允许的值:filename。 默认值:file

指示以下修补方法之一:

  • 清单文件标识要修补的对象。
  • 单个对象按种类和名称标识为修补程序目标。

可接受的值为 filename


resourceFileToPatch - 文件路径
string. 当 action = patch && resourceToPatch = file 时,需要此选项。

指定用于修补程序的文件的路径。


kind - 种类
string. 当 action = scale || resourceToPatch = name 时,需要此选项。 允许的值:deploymentreplicasetstatefulset

指定 K8s 对象的类型,例如 deploymentreplicaSet


name - 名字
string. 当 action = scale || resourceToPatch = name 时,需要此选项。

指定 K8s 对象的名称。


replicas - 副本计数
string. 当 action = scale 时,需要此选项。

指定要缩放到的副本数。


replicas - 副本计数
string. 当 action = scale 时,需要此选项。

指定 K8s 对象的名称。


mergeStrategy - 合并策略
string. 当 action = patch 时,需要此选项。 允许的值:jsonmergestrategic。 默认值:strategic

指定要提供的修补程序的类型。


arguments - 参数
string. 可选。 在 时 action = delete使用 。

指定命令的参数 kubectl delete 。 例如: arguments: deployment hello-world foo-bar


patch - 补丁
string. 当 action = patch 时,需要此选项。

指定修补程序的内容。


secretType - 机密类型
string. 当 action = createSecret 时,需要此选项。 允许的值:dockerRegistrygeneric。 默认值: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
烘焙操作创建的清单捆绑包的位置

注解

访问 AKS 时的 Kubernetes 服务连接注意事项

可以使用以下任一选项创建 Kubernetes 服务连接。

  • KubeConfig
  • 服务帐户
  • Azure 订阅

选择 Kubernetes 服务连接身份验证方法的屏幕截图。

选择 Azure 订阅 选项时,Azure DevOps 需要在服务连接配置时访问 Kubernetes。 无法创建服务连接的原因可能有多种,例如,你 创建了专用群集 ,或者该群集 禁用了本地帐户。 在这些情况下,Azure DevOps 无法在服务连接配置时连接到群集,你将看到停滞的 “加载命名空间” 屏幕。

选择 Kubernetes 服务连接身份验证对话框的屏幕截图,该对话框在加载命名空间时停滞不前。

从 Kubernetes 1.24 开始, 默认情况下不再创建生存期较长的令牌。 Kubernetes 建议不要使用生存期较长的令牌。 因此,使用使用 Azure 订阅 选项创建的 Kubernetes 服务连接的任务无法访问进行身份验证所需的永久令牌,并且无法访问 Kubernetes 群集。 这还会导致冻结“ 加载命名空间” 对话框。

使用 Azure 资源管理器 服务连接访问 AKS

对于 AKS 客户,Azure 资源管理器 服务连接类型提供了连接到专用群集或禁用本地帐户的群集的最佳方法。 此方法不依赖于创建服务连接时的群集连接。 对 AKS 的访问延迟到管道运行时,其优点如下:

  • 可以从自承载代理或规模集代理执行对 (专用) AKS 群集的访问,并视线到群集。
  • 为使用 Azure 资源管理器 服务连接的每个任务创建令牌。 这可确保使用短期令牌连接到 Kubernetes,这是 Kubernetes 建议
  • 即使禁用了本地帐户,也可以访问 AKS。

服务连接常见问题解答

我收到以下错误消息:找不到任何与服务帐户关联的机密。 发生了什么?

你正在使用带有 Azure 订阅选项的 Kubernetes 服务连接。 我们将更新此方法以创建生存期较长的令牌。 这预计将在 5 月中旬推出。 但是,根据 Kubernetes 指南,建议开始使用 Azure 服务连接类型,而不是使用生存期较长的令牌。

我使用的是 AKS,不想更改任何内容,是否可以继续将任务与 Kubernetes 服务连接配合使用?

我们将更新此方法以创建生存期较长的令牌。 这预计将在 5 月中旬推出。 但是,请注意,此方法违反 Kubernetes 指南

我使用的是 Kubernetes 任务和 Kubernetes 服务连接,而不是 AKS。 我应该担心吗?

任务将继续像以前一样工作。

是否会删除 Kubernetes 服务连接类型?

无论 Kubernetes 任务在何处运行,我们的 Kubernetes 任务都适用于任何 Kubernetes 群集。 Kubernetes 服务连接将继续存在。

我是 AKS 客户,一切正常,我应该采取行动吗?

无需更改任何内容。 如果在创建过程中使用 Kubernetes 服务连接并选择了 Azure 订阅,则应了解 有关使用长期令牌的 Kubernetes 指南

我正在创建 Kubernetes 环境,但无法选择使用服务连接

如果在环境创建期间无法访问 AKS,可以使用空环境并将输入设置为 connectionType Azure 资源管理器服务连接。

我已使用 Azure Active Directory RBAC 配置了 AKS,但管道不起作用。 这些更新会解决此问题吗?

启用 AAD RBAC 后访问 Kubernetes 与令牌创建无关。 为了防止出现交互式提示,我们将在将来的更新中支持 kubelogin

使用生成或发布管道中的 Kubernetes 清单任务来烘焙清单并将其部署到 Kubernetes 群集。

此任务支持以下各项:

  • 项目替换:部署操作将容器映像列表作为输入,你可以指定这些映像及其标记和摘要。 在应用程序到群集之前,相同的输入将替换为非模板化清单文件中。 此替换可确保群集节点拉取正确版本的映像。

  • 清单稳定性:检查已部署的 Kubernetes 对象的推出状态。 合并了稳定性检查,以确定任务状态是成功还是失败。

  • 可跟踪性注释:批注添加到已部署的 Kubernetes 对象,以叠加可跟踪性信息。 支持以下批注:

    • azure-pipelines/org
    • azure-pipelines/project
    • azure-pipelines/pipeline
    • 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) 抽象允许使用 和 IstioLinkerd服务网格提供程序进行配置。 Kubernetes 清单任务在部署策略的生命周期内将 SMI TrafficSplit 对象映射到稳定、基线和 Canary 服务。

      基于服务网格并使用此任务的 Canary 部署更准确。 此准确性取决于服务网格提供程序如何实现基于流量的精细百分比拆分。 服务网格使用注入到 Pod 中的服务注册表和挎斗容器。 此注入与应用程序容器一起发生,以实现精细的流量拆分。

    • 无服务网格的 Kubernetes:如果没有服务网格,可能无法在请求级别获得所需的确切百分比拆分。 但是,可以通过使用稳定变体旁边的基线和金丝雀变体来执行 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/demobar/demo 匹配项。 对于找到的每个匹配项,或 tagVariable2 的值tagVariable1将作为标记追加到映像名称中。 还可以在容器输入中指定用于项目替换的摘要。

注意

虽然可以使用与部署策略相关的 YAML 输入创作 deploypromotereject 操作,但生成管道目前不支持手动干预任务。

对于发布管道,建议按以下顺序使用与部署策略相关的操作和输入:

  1. 使用 strategy: canarypercentage: $(someValue)指定的部署操作。
  2. 手动干预任务,以便可以暂停管道并将基线变体与 Canary 变体进行比较。
  3. 在恢复手动干预任务时运行的提升操作,在拒绝手动干预任务时运行的拒绝操作。

创建机密操作

以下 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 生成的烘焙清单文件的示例,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 部署。

如果任务包含 和 strategy: canaryaction: deploy输入,则对于输入清单文件中定义的每个工作负载 (Deployment、ReplicaSet、Pod、...) ,-baseline则会创建部署的 和 -canary 变体。 在此示例中,输入清单文件中有一个部署 sampleapp ,在管道的运行编号 22 完成后,此名为 sampleapp 的部署的稳定变体将部署在群集中。 在后续运行 (在本例中运行编号 23) ,Kubernetes 清单任务使用 action: deploystrategy: canary 将导致创建 sampleapp-baseline 和 sampleapp-canary 部署,其副本数由任务输入的 percentage 乘积决定,其最终稳定变体 sampleapp 的值取决于输入清单文件。

不包括副本数,基线版本具有与稳定变体相同的配置,而 canary 版本具有当前运行 (引入的新更改,在这种情况下,运行编号 23) 。 如果在上述步骤之后在管道中设置手动干预,则可以看准机会暂停管道,使管道管理员可以评估基线和 Canary 版本的关键指标,并确定 Canary 更改是否安全且足以符合全面推出的条件。

action: promote Kubernetes 清单任务的 和 strategy: canaryaction: rejectstrategy: canary 输入可以分别用于提升或拒绝 Canary 更改。 请注意,在这两种情况下,当此步骤结束时,只有输入清单文件中声明的工作负载的稳定变体会保持部署在群集中,而临时基线和 Canary 版本将被清理掉。

要求

要求 说明
管道类型 YAML、经典版本、经典版本
运行平台 Agent、DeploymentGroup
需求
功能 此任务不满足作业中后续任务的任何要求。
命令限制 任意
可设置变量 任意
代理版本 所有支持的代理版本。
任务类别 部署