【问题标题】:Argo Workflow error when using envFrom field使用 envFrom 字段时出现 Argo Workflow 错误
【发布时间】:2021-05-13 11:23:48
【问题描述】:

工作流程:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: my-workflow-
spec:
  entrypoint: main
  arguments:
    parameters:
      - name: configmap
        value: my-configmap
      - name: secret
        value: my-secret
  templates:
    - name: main
      steps:
        - - name: main
            templateRef:
              name: my-template
              template: main
            arguments:
              parameters:
                - name: configmap
                  value: "{{workflow.parameters.configmap}}"
                - name: secret
                  value: "{{workflow.parameters.secret}}"

模板:

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: my-template
spec:
  entrypoint: main
  templates:
    - name: main
      inputs:
        parameters:
          - name: configmap
        parameters:
          - name: secret
      container:
        image: my-image:1.2.3
        envFrom:
          - configMapRef:
            name: "{{inputs.parameters.configmap}}"
          - secretRef:
            name: "{{inputs.parameters.secret}}"

当通过 Argo UI 部署时,我在启动 pod 时收到来自 Kubernetes 的以下错误:

spec.containers[1].envFrom: Invalid value: \"\": must specify one of: `configMapRef` or `secretRef`

支持使用envFrom,并记录在 Argo 文档中:https://argoproj.github.io/argo-workflows/fields/。为什么 Kubernetes 在这里抱怨?

【问题讨论】:

  • 我认为可能存在两个问题,1. 缩进,2. 解析值,您可以尝试硬编码 configMapRef 和 secretRef 的名称,如果可行,则问题出在解析上,否则尝试更改缩进,envFrom 绝对支持,它最后的值导致问题。
  • @SaikatChakrabortty 谢谢。我尝试对 configMapRef 和 secretRef 名称进行硬编码,但我得到了同样的错误。我还通过yamllint 运行了 YAML 来验证语法。
  • 在您的WorkflowTemplate 对象中,envFrom 下:nameconfigMapRefsecretRef 下,而不是同一级别。 yamllint 不会抛出任何错误,因为这仍然是有效的 yaml,但这对 Kubernetes 无效。

标签: kubernetes argo-workflows


【解决方案1】:

正如 cmets 中所述,您的清单存在一些问题。它们是有效的 YAML,但 YAML 不会反序列化为有效的 Argo 自定义资源。

  1. 在工作流中,您复制了parameters 中的parameters 键。
  2. 在 WorkflowTemplate 中,您已将 configMapRefsecretRef 名称放置在与键相同的级别。 configMapRefsecretRef 是对象,因此 name 键应该嵌套在每个对象之下。

这些是更正后的清单:

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: my-template
spec:
  entrypoint: main
  templates:
    - name: main
      inputs:
        parameters:
          - name: configmap
          - name: secret
      container:
        image: my-image:1.2.3
        envFrom:
          - configMapRef:
              name: "{{inputs.parameters.configmap}}"
          - secretRef:
              name: "{{inputs.parameters.secret}}"

---

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: my-workflow-
spec:
  entrypoint: main
  arguments:
    parameters:
      - name: configmap
        value: my-configmap
      - name: secret
        value: my-secret
  templates:
    - name: main
      steps:
        - - name: main
            templateRef:
              name: my-template
              template: main
            arguments:
              parameters:
                - name: configmap
                  value: "{{workflow.parameters.configmap}}"
                - name: secret
                  value: "{{workflow.parameters.secret}}"

Argo Workflows 支持IDE-based validation,这应该可以帮助您找到/避免这些问题。

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2020-11-27
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多