使用 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.
#resourceType: 'Microsoft.ContainerService/managedClusters' # string. Optional. Use when action = deploy. Resource type. Default: Microsoft.ContainerService/managedClusters.
# 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
。 允许的值:bake
、createSecret
(创建机密)、delete
、deploy
、patch
、promote
、scale
、reject
。 默认值:deploy
。
指定要执行的操作。
connectionType
-
服务连接类型
string
。
action != bake
时是必需的。 允许的值: azureResourceManager
(Azure Resource Manager)、 kubernetesServiceConnection
(Kubernetes Service Connection)。 默认值:kubernetesServiceConnection
。
选择 Kubernetes 服务连接类型。
-
kubernetesServiceConnection
(Kubernetes 服务连接) - 允许您提供 KubeConfig 文件、指定服务帐户或使用 Azure 订阅 选项导入 AKS 实例。 使用 Azure 订阅 选项导入 AKS 实例需要在服务连接配置时访问 Kubernetes 群集。 -
azureResourceManager
(Azure 资源管理器) - 用于选择 AKS 实例。 在服务连接配置时无法访问 Kubernetes 群集。
有关详细信息,请参阅 备注。
kubernetesServiceConnection
-
Kubernetes 服务连接
输入别名: kubernetesServiceEndpoint
.
string
。
action != bake && connectionType = kubernetesServiceConnection
时是必需的。
azureSubscriptionConnection
-
Azure 订阅
输入别名: azureSubscriptionEndpoint
.
string
。
action != bake && connectionType = azureResourceManager
时是必需的。
选择包含 Azure Container Registry 的 Azure Resource Manager 订阅。注意:要配置新的服务连接,请从列表中选择 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
时使用。 允许的值: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
时是必需的。
指定要缩放到的副本数。
replicas
-
副本计数
string
。
action = scale
时是必需的。
指定 K8s 对象的名称。
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
状态之前等待的时间长度(以秒为单位)。
resourceType
-
资源类型
string
。 可选。 当 action = deploy
时使用。 默认值:Microsoft.ContainerService/managedClusters
。
资源的类型(队列、托管集群)。
任务控制选项
除任务输入之外,所有任务都具有控制选项。 有关详细信息,请参阅 控件选项和常见任务属性。
输出变量
此任务定义以下 输出变量,可以在下游步骤、作业和阶段中使用。
manifestsBundle
由 bake作创建的清单捆绑包的位置
注解
访问 AKS 时的 Kubernetes 服务连接注意事项
可以使用以下任一选项创建 Kubernetes 服务连接。
- KubeConfig 实例
- 服务帐户
- Azure 订阅
选择 Azure 订阅 选项时,需要在服务连接配置时访问 Kubernetes。 创建服务连接的原因可能有多种,例如,创建专用群集 或者群集 本地帐户已禁用。 在这些情况下,Azure DevOps 无法在服务连接配置时连接到群集,你将看到 加载命名空间 屏幕停滞。
从 Kubernetes 1.24 开始,长期令牌在默认情况下 不再创建。 Kubernetes 建议不要使用生存期较长的令牌。 因此,使用通过 Azure 订阅创建的 Kubernetes 服务连接的任务 选项无权访问身份验证所需的永久令牌,并且无法访问 Kubernetes 群集。 这还会导致冻结 加载命名空间 对话框。
使用 Azure 资源管理器服务连接访问 AKS
对于 AKS 客户,Azure 资源管理器服务连接类型提供了连接到专用群集或禁用本地帐户的群集的最佳方法。 此方法不依赖于创建服务连接时的群集连接。 对 AKS 的访问将延迟到管道运行时,这具有以下优势:
- 可以从自承载或规模集代理执行对 AKS 群集的访问,并可以看到群集。
- 为每个使用 Azure 资源管理器服务连接的任务创建令牌。 这可确保使用生存期较短的令牌连接到 Kubernetes,这是 Kubernetes 建议。
- 即使禁用本地帐户,也可以访问 AKS。
服务连接常见问题解答
我收到以下错误消息:找不到与服务帐户关联的任何机密。 发生了什么?
将 Kubernetes 服务连接与 Azure 订阅选项配合使用。 我们正在更新此方法以创建长期令牌。 这预计将在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/项目
- 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 版本。