如何在 Helm 中使用 Argo 工作流程模板?

问题描述 投票:0回答:4

是否可以使用Helm来部署Argo工作流程?当我执行

helm install

时,出现如下错误

错误:升级失败:解析错误 (workflows/templates/my_dag.yaml:47):函数“workflow”未定义

yaml 本身具有 Argo 和 Helm 插值,带有

{{..}}
。我明白为什么会失败。有办法解决这个问题吗?

我已经看过this,但它看起来不像我想做的事情,因为它改变了语法。

kubernetes-helm argo-workflows argoproj
4个回答
10
投票

这是可能的。我所在的团队定期部署 Helm 模板化的 WorkflowTemplates。

有两种方法可以解决 Helm/Argo 模板标签冲突问题。 (如您所知,问题在于 Helm 的 Go 模板语言和 Argo 的模板语言都使用

{{}}
来表示模板化区域。)

选项 1:

第一种方法是小心地嵌套标签。例如,如果我想使用

{{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}}`}}"]

选项2:

您链接的博客文章中描述了第二种解决方法。这种方法确实改变了语法。第一种方法使用了一种看起来很有趣的语法,但从技术上讲它仍然只是 Helm 和 Argo 的默认语法。

如果

{{`{{yikes}}`}}
解决方法无法解决您的错误消息,请发布整个工作流程(或经过编辑/简化的版本),我很乐意查看。

相关:

以上适用于 Argo-in-Helm (Jinja2-in-Go) 模板。如果您需要某些东西在 Argo (somethingelse-in-Jinja2) 模板,其中某些东西也使用

{{
,请查看此答案:如何在 argo 工作流程中转义“{{”和“}}”


0
投票

选项 1 失败,可以使用其他解决方法

{{ "{{inputs.parameters.message}}"|quote}}

0
投票

我刚刚遇到这个问题并尝试了 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}}` }}"

之后

希望有帮助!


0
投票

您还可以将所有 Argo 工作流程模板放在除

/templates
之外的单独目录中,例如
raw-files
并使用以下模板将它们包含在您的 helm 部署中:

{{ range $path, $_ :=  .Files.Glob  "raw-files/*" }}
---
{{ $.Files.Get $path }}
{{ end }}

通过这种方法,您仍然可以使用

argo lint
检查工作流程模板并使用 IDE 的 JSON 模式集成

© www.soinside.com 2019 - 2024. All rights reserved.