是否可以使用Helm来部署Argo工作流程?当我执行
helm install
时,出现如下错误
错误:升级失败:解析错误 (workflows/templates/my_dag.yaml:47):函数“workflow”未定义
yaml 本身具有 Argo 和 Helm 插值,带有
{{..}}
。我明白为什么会失败。有办法解决这个问题吗?
我已经看过this,但它看起来不像我想做的事情,因为它改变了语法。
这是可能的。我所在的团队定期部署 Helm 模板化的 WorkflowTemplates。
有两种方法可以解决 Helm/Argo 模板标签冲突问题。 (如您所知,问题在于 Helm 的 Go 模板语言和 Argo 的模板语言都使用
{{}}
来表示模板化区域。)
第一种方法是小心地嵌套标签。例如,如果我想使用
{{steps.hello-world.result}}
作为 Argo 模板,我可以将其写为 {{`{{steps.hello-world.result}}`}}
。外部的 {{
告诉 Helm 开始解释模板化代码。反引号告诉 Helm 按字面意思解释反引号分隔的内容。最后,内部 {{
作为工作流的纯文本部分安装在集群中,并最终被 Argo 解释为模板。
这是参数示例的修改版本,已修改为使用 Helm 进行部署。
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: arguments-parameters-
spec:
entrypoint: whalesay
arguments:
parameters:
- name: message
value: hello world
templates:
- name: whalesay
inputs:
parameters:
- name: message
container:
image: docker/whalesay:latest
command: [cowsay]
args: ["{{`{{inputs.parameters.message}}`}}"]
您链接的博客文章中描述了第二种解决方法。这种方法确实改变了语法。第一种方法使用了一种看起来很有趣的语法,但从技术上讲它仍然只是 Helm 和 Argo 的默认语法。
如果
{{`{{yikes}}`}}
解决方法无法解决您的错误消息,请发布整个工作流程(或经过编辑/简化的版本),我很乐意查看。
相关:
以上适用于 Argo-in-Helm (Jinja2-in-Go) 模板。如果您需要某些东西在 Argo (somethingelse-in-Jinja2) 模板,其中某些东西也使用
{{
,请查看此答案:如何在 argo 工作流程中转义“{{”和“}}”
选项 1 失败,可以使用其他解决方法
{{ "{{inputs.parameters.message}}"|quote}}
我刚刚遇到这个问题并尝试了 crenshaw-dev 的解决方案,但没有成功。 Helm 会多次抛出以下消息:
unable to parse YAML: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{"tasks.data-formatting.outputs.parameters.employee-username-enc":interface {}(nil)}
我解决这个问题的方法是用双引号将转义的 Argo 语句括起来,如下所示:
# ...
arguments:
parameters:
- name: first-name
value: "{{ `{{tasks.data-formatting.outputs.parameters.employee-username-enc}}` }}"
之后
希望有帮助!
您还可以将所有 Argo 工作流程模板放在除
/templates
之外的单独目录中,例如raw-files
并使用以下模板将它们包含在您的 helm 部署中:
{{ range $path, $_ := .Files.Glob "raw-files/*" }}
---
{{ $.Files.Get $path }}
{{ end }}
通过这种方法,您仍然可以使用
argo lint
检查工作流程模板并使用 IDE 的 JSON 模式集成。