Argo Workflows:WorkflowTemplate中templateDefaults失效及替代方案咨询
问题
我尝试在Argo Workflows的WorkflowTemplate里用templateDefaults特性,给多个script模板共享通用镜像和环境变量,配置如下:
apiVersion: argoproj.io/v1alpha1 kind: WorkflowTemplate spec: templateDefaults: script: image: someimage:v1.2.3 templates: - name: foo script: name: 'foo' ... - name: bar script: name: 'bar' ...
但在其他工作流引用这个模板时,templateDefaults直接被忽略了,还报脚本镜像未定义的错,有没有替代的实现方式?
替代方案
1. 基础模板继承
先定义一个带通用配置的基础script模板,其他模板用inheritFrom字段继承它的配置:
apiVersion: argoproj.io/v1alpha1 kind: WorkflowTemplate spec: templates: # 基础模板,存放通用镜像和环境变量 - name: base-script script: image: someimage:v1.2.3 env: - name: COMMON_VAR1 value: "value1" - name: COMMON_VAR2 value: "value2" command: [python] source: | # 空脚本,仅提供基础配置 pass # foo脚本继承基础配置 - name: foo inheritFrom: [base-script] script: name: 'foo' source: | # foo的实际业务逻辑 print("Running foo script") # bar脚本继承基础配置 - name: bar inheritFrom: [base-script] script: name: 'bar' source: | # bar的实际业务逻辑 print("Running bar script")
这种方式会自动合并基础模板的配置,子模板还能按需覆盖不需要的字段,在工作流引用时完全正常生效。
2. 模板参数+默认值
在WorkflowTemplate里定义参数,给镜像和环境变量设置默认值,每个script模板直接引用这些参数:
apiVersion: argoproj.io/v1alpha1 kind: WorkflowTemplate spec: arguments: parameters: - name: script-image value: "someimage:v1.2.3" - name: common-var1 value: "value1" - name: common-var2 value: "value2" templates: - name: foo script: name: 'foo' image: "{{workflow.parameters.script-image}}" env: - name: COMMON_VAR1 value: "{{workflow.parameters.common-var1}}" - name: COMMON_VAR2 value: "{{workflow.parameters.common-var2}}" source: | print("Running foo script") - name: bar script: name: 'bar' image: "{{workflow.parameters.script-image}}" env: - name: COMMON_VAR1 value: "{{workflow.parameters.common-var1}}" - name: COMMON_VAR2 value: "{{workflow.parameters.common-var2}}" source: | print("Running bar script")
要是引用时需要修改默认值,直接在工作流里传入对应参数即可,灵活性更高。
3. 集群级全局模板(ClusterWorkflowTemplate)
如果要在整个集群范围内共享通用配置,可以创建ClusterWorkflowTemplate,把基础配置放进去,各个WorkflowTemplate再引用它:
# 集群级基础模板 apiVersion: argoproj.io/v1alpha1 kind: ClusterWorkflowTemplate metadata: name: cluster-base-script spec: templates: - name: base-script script: image: someimage:v1.2.3 env: - name: COMMON_VAR1 value: "value1"
然后在WorkflowTemplate里引用:
apiVersion: argoproj.io/v1alpha1 kind: WorkflowTemplate spec: templates: - name: foo inheritFrom: ["cluster-workflow-template/cluster-base-script/base-script"] script: name: 'foo' source: | print("Running foo script")
这种方式适合跨命名空间共享通用配置。
内容的提问来源于stack exchange,提问作者rupello
相关产品推荐
相关产品推荐

