拓冰建站拓冰建站
首页 / 资讯中心 / 正文

KubeVela workflow 中的 step-group 步骤:用 subSteps 并行编排子步骤

云原生DevOps运维微服务【免费下载链接】kubevelaThe Modern Application Platform.项目地址https://gitcode.com/gh_mirrors/ku/kubevela点击查看免费下载KubeVela 的应用工作流workflow支持以step-group这一特殊内置步骤把任意多个普通工作流步骤包装为一组并行执行的子步骤subSteps是进行批量部署、并行调度与流程分组编排的核心手段。本文以仓库中的官方示例与定义文件为主线讲解step-group的 YAML 写法、参数约束、并行执行语义并结合源码与校验测试说明其底层实现与使用边界帮助你直接在Application中落地这一能力。一、step-group 是什么step-group是 KubeVela 内置builtin的一类workflow-step类型定义源码位置为 vela-templates/definitions/internal/workflowstep/step-group.cue其官方描述为A special step that you can declare subSteps in it, subSteps is an array containing any step type whose valid parameters do not include thestep-groupstep type itself. The sub steps were executed in parallel.即它本身不执行任何业务动作而是声明一个subSteps数组数组内可以放置任意类型的工作流步骤但不能嵌套step-group自身所有子步骤并行执行。从定义文件可以看到它归属于 Process Control流程控制类别并且是一个无参数步骤step-group: { type: workflow-step annotations: { category: Process Control } description: A special step that you can declare subSteps in it, ... } template: { // no parameters, the nop only to make the template not empty or its invalid nop: {} }对应的WorkflowStepDefinitionCRD 由 Helm Chart 生成位于 charts/vela-core/templates/defwithtemplate/step-group.yaml随 vela-core 安装后默认部署在系统定义命名空间中。因此你无需安装任何插件即可直接使用type: step-group。二、官方示例并行部署两个组件仓库在 docs/examples/workflow/step-group/example.yaml 给出了完整的可运行示例这也正是关联文档 references/docgen/def-doc/workflowstep/step-group.eg.md 中的核心内容apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: example namespace: default spec: components: - name: express-server type: webservice properties: image: crccheck/hello-world port: 8000 - name: express-server2 type: webservice properties: image: crccheck/hello-world port: 8000 workflow: steps: - name: step type: step-group subSteps: - name: apply-sub-step1 type: apply-component properties: component: express-server - name: apply-sub-step2 type: apply-component properties: component: express-server2这段配置的语义非常直观应用定义了两个webservice组件express-server与express-server2工作流中只有一个名为step的step-group步骤subSteps里包含两个apply-component子步骤分别将express-server、express-server2应用到集群。运行方式很简单把上述内容保存为 YAML 文件后使用 CLI 提交即可详见 docs/examples/workflow/step-group/README.md 的 How to start 一节vela up -f example.yaml三、参数说明与使用约束根据定义文件与官方 READMEstep-group的参数规则非常明确参数类型是否必填说明subSteps数组[]WorkflowStepBase是一个步骤数组可包含任意类型的步骤只要其有效参数中不包含step-group类型本身properties对象否当前不支持step-group目前不支持properties字段定义模板中用nop: {}占位避免模板为空导致定义无效3.1 为什么不能用 properties查看 step-group.cue 的 template 部分只有一个空壳占位template: { // no parameters, the nop only to make the template not empty or its invalid nop: {} }注释说明了原因CUE 模板不允许为空否则定义无效因此用一个nop字段占位但不对外暴露任何业务参数。这意味着在step-group步骤上填写properties不会产生任何实际效果官方 README 也明确写出 step-groupdoesnt supportpropertiesfor now.3.2 子步骤内的步骤类型subSteps数组元素与普通工作流步骤的写法一致每个子步骤包含name、type与可选的properties视具体步骤类型而定。仓库测试 pkg/appfile/parser_test.go 展示了子步骤中也可以读取 source 上下文例如把notification子步骤的 webhook 地址写成$(source.cfg.webhook)af: Appfile{WorkflowSteps: []wfTypesv1alpha1.WorkflowStep{{ WorkflowStepBase: wfTypesv1alpha1.WorkflowStepBase{Name: group, Type: step-group}, SubSteps: []wfTypesv1alpha1.WorkflowStepBase{ {Name: inner, Type: notification, Properties: raw({url:$(source.cfg.webhook)})}, }, }}}这印证了子步骤与普通步骤拥有相同的能力与执行行为这一点——包括表达式引用、source 读取等特性在子步骤中同样可用。3.3 不支持嵌套 step-group定义描述中明确限制了subSteps的元素类型其有效参数中不能包含step-group本身。也就是说step-group不允许在subSteps里再声明一个step-group避免无限递归与过深的流程结构。四、执行语义并行 DAGstep-group最关键的执行语义来自 docs/examples/workflow/step-group/README.md 的 Execute process 一节When executing thestep-groupstep, the subSteps in the step group are executed in dag mode. The step group will only complete when all subSteps have been executed to completion. SubStep has the same execution behavior as a normal step.可以归纳为三点并行执行进入step-group后其内部所有subSteps以 DAG 模式执行互相之间没有隐式先后顺序整体完成条件只有全部子步骤都执行完成step-group这个外层步骤才算完成工作流才会继续后续步骤行为一致子步骤与普通步骤执行行为相同同样支持暂停、失败重试、超时、依赖等待等由具体步骤类型决定的行为。4.1 源码中的佐证KubeVela 工作流引擎在状态管理上专门为子步骤保留了维度。在 pkg/workflow/operation/operation.go 中引擎会遍历step.SubStepsStatus对每个Phase为Running的子步骤进行状态汇总与推进for i, step : range steps { for j, sub : range step.SubStepsStatus { if sub.Phase ! workflowv1alpha1.WorkflowStepPhaseRunning { continue } ... } }在步骤终止/失败处理逻辑中pkg/workflow/operation/operation.go一旦工作流整体终止引擎也会同步把仍处于Running/Suspending的子步骤标记为Failed并写入StatusReasonTerminate原因——这说明子步骤的状态是被逐条跟踪并参与整体状态机演化的。另外工作流模式的对外展示同样把步骤与子步骤分开Mode: fmt.Sprintf(%s-%s, status.Mode.Steps, status.Mode.SubSteps),这段代码位于 pkg/workflow/workflow.go说明step-group会以steps-subSteps的组合模式在工作流状态中体现。五、内置步骤身份与合法性校验step-group是引擎识别的一等内置步骤。在 pkg/workflow/step/generator.go 中IsBuiltinWorkflowStepType明确把step-group列入内置类型列表func IsBuiltinWorkflowStepType(wfType string) bool { for _, _type : range []string{ wftypes.WorkflowStepTypeSuspend, wftypes.WorkflowStepTypeApplyComponent, wftypes.WorkflowStepTypeBuiltinApplyComponent, wftypes.WorkflowStepTypeStepGroup, } { if _type wfType { return true } } return false }对应的单元测试位于 pkg/workflow/step/generator_test.go直接断言了IsBuiltinWorkflowStepType(step-group) true。此外Admission Webhook 会对subSteps内的名称唯一性做校验。在 pkg/webhook/core.oam.dev/v1beta1/application/validating_handler_test.go 的两个拒绝用例中可以看到子步骤内出现重名两个都叫sub的suspend子步骤会被拒绝子步骤名称与同一工作流其他步骤重名子步骤叫group与外层步骤同名也会被拒绝。因此在实际书写subSteps时请确保子步骤名称在整个工作流范围内唯一否则应用会被准入校验拦截。六、典型使用场景结合并行语义与整体完成后工作流才继续的行为step-group适合以下场景批量并行部署如官方示例多个互不依赖的组件需要同时拉起用step-group打包成一批比逐个顺序写步骤更快并行数据收集/通知多个notification、request、export2secret等步骤并行执行最后统一等待结果阶段性汇合把一个阶段的多个并行任务包成一组组内全部完成后工作流再进入下一阶段天然形成扇出-汇合fan-out / join结构流程分组与可读性把逻辑上属于同一批的子步骤放在一个step-group内让工作流的steps层级更清晰。需要注意因为step-group不支持properties且不允许嵌套跨阶段依赖请使用普通步骤的dependsOn或deploy、apply-component等步骤来组织step-group只负责横向并行不负责纵向编排。七、小结step-group是 KubeVela 内置的流程控制类工作流步骤定义在 vela-templates/definitions/internal/workflowstep/step-group.cue随 vela-core 以WorkflowStepDefinition形式默认安装见 charts/vela-core/templates/defwithtemplate/step-group.yaml用法是声明subSteps数组内部放任意非step-group类型的步骤当前不支持properties也不支持嵌套step-group执行时所有子步骤以 DAG 模式并行运行全部完成后外层步骤才结束子步骤拥有与普通步骤一致的行为其状态会被引擎单独跟踪参考 pkg/workflow/operation/operation.go编写subSteps时保证步骤名称在工作流内全局唯一否则将被 Admission Webhook 拒绝。可运行示例与配套说明请直接参考 docs/examples/workflow/step-group/example.yaml 与 docs/examples/workflow/step-group/README.md用vela up -f example.yaml即可验证并行部署效果。赞分享云原生DevOps运维微服务【免费下载链接】kubevelaThe Modern Application Platform.项目地址https://gitcode.com/gh_mirrors/ku/kubevela点击查看免费下载相关推荐KubeVela Workflow 之 step-group内置并行子步骤组的使用与执行原理KubeVela Workflow 之 step group内置并行子步骤组的使用与执行原理 导读 step group 是 KubeVela Workflo云原生DevOps运维微服务iii Rust SDK 完全指南从注册、触发到可观测的分布式 Worker 接入实战iii Rust SDK 完全指南从注册、触发到可观测的分布式 Worker 接入实战 本篇技术指南以 iii 官方 Rust SDK iii sdk 代云原生DevOps运维微服务KubeVela Workflow list-config 步骤实战在编排中批量读取已有配置并驱动条件化资源部署KubeVela Workflow list config 步骤实战在编排中批量读取已有配置并驱动条件化资源部署 导读 list config 是 KubeV云原生DevOps运维微服务上一篇Python量化分析如何高效对接通达信本地数据Mootdx深度解析下一篇TradingAgents-CN三分钟打造你的AI金融分析大脑开启智能投资决策新时代创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门