【问题标题】:Argo template not able to read from output file locationArgo 模板无法从输出文件位置读取
【发布时间】:2021-09-02 18:09:22
【问题描述】:

一个outer-template 调用inner-template 两次,因为有两个步骤。内部模板是一个简单的容器,它向/command_output/result.txt 写入一些文本。工作流输出尝试通过以下方式读取它:

- name: previous_step_output
  valueFrom:
    path: /command_output/result.txt

出于某种原因,这似乎确实有效。根据文档,我还创建了 volumesvolumeMounts 错误是:

 Service Account Name:  argo
  Templates:
    Arguments:
    Inputs:
    Metadata:
    Name:  HelloWorld
    Outputs:
    Steps:
      [map[arguments:map[parameters:[map[name:message value:Hello World.....]]] name:init-step templateRef:map[name:outer-template template:HelloWorld]]]
Status:
  Conditions:
    Status:     True
    Type:       Completed
  Finished At:  2021-06-17T23:50:37Z
  Message:      runtime error: invalid memory address or nil pointer dereference
  Nodes:
    hello-css4z:

需要一些关于缺少什么的建议。附加inner-template、outer-template和request.yaml。

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: inner-template
  namespace: cali
  labels:
    workflows.argoproj.io/controller-instanceid: cali
spec:
  templates:
    - name: InnerJob
      metadata:
        annotations:
          sidecar.istio.io/inject: "false"
      inputs:
        parameters:
          - name: message
          - name: previous_step_output
            value: ""
      resource:
        action: create
        successCondition: status.succeeded > 0
        failureCondition: status.failed > 0
        manifest: |
          apiVersion: batch/v1
          kind: Job
          metadata:
            namespace: default
            generateName: hellojob-
            annotations:
              sidecar.istio.io/inject: "false"
          spec:
            template:
              metadata:
                annotations:
                  sidecar.istio.io/inject: "false"
              spec:
                volumes:
                  - emptyDir: {}
                    name: cali-mount
                containers:
                  - name: export-tenant
                    image: centos:7
                    command: [sh, -c]
                    args: ["echo 'some result' > /command_output/result.txt; cat /command_output/result.txt; sleep 5; echo done; exit 0"]
                    env:
                      - name: message
                        value: "{{inputs.parameters.message}}"
                      - name: previous_step_output
                        value: "{{inputs.parameters.previous_step_output}}"
                    volumeMounts:
                      - mountPath: /command_output
                        name: cali-mount
                restartPolicy: Never
      outputs:
        parameters:
          - name: job-name
            valueFrom:
              jsonPath: '{.metadata.name}'
          - name: job-obj
            valueFrom:
              jqFilter: '.'
          - name: previous_step_output
            valueFrom:
              path: /command_output/result.txt
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: outer-template
  namespace: cali
  labels:
    workflows.argoproj.io/controller-instanceid: cali
spec:
  entrypoint: HelloWorld
  templates:
    - name: HelloWorld
      inputs:
        parameters:
          - name: message
      steps:
        - - name: step-1
            templateRef:
              name: inner-template
              template: InnerJob
            arguments:
              parameters:
                - name: message
                  value: "{{inputs.parameters.message}}"
        - - name: step-2
            templateRef:
              name: inner-template
              template: InnerJob
            arguments:
              parameters:
                - name: message
                  value: "{{inputs.parameters.message}}"
                - name: previous_step_output
                  value: "{{steps.step-1.outputs.parameters.previous_step_output}}"

请求负载:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: hello-
  namespace: cali
  labels:
    workflows.argoproj.io/controller-instanceid: cali
spec:
  entrypoint: HelloWorld
  serviceAccountName: argo
  templates:
      - name: HelloWorld
        steps:
          - - name: init-step
              arguments:
                parameters:
                  - name: message
                    value: "Hello World....."
              templateRef:
                name: outer-template
                template: HelloWorld

【问题讨论】:

    标签: kubernetes argo-workflows argoproj


    【解决方案1】:

    据我所知,Argo Workflows resource templates 不支持读取文件作为输出参数。

    看起来,从job 资源到实例化工作流的唯一内置方法是通过job 资源本身的 JSON 表示。

    我建议将 Job 转换为工作流中的普通容器模板。然后您可以使用所有典型的通信方法(直接从标准输出读取、将文件读入输出参数、读取输出工件等)。

    【讨论】:

    • 它是一个工作的原因是因为我们需要为每个工作部署一堆其他必需的边车。不确定我们如何使用容器模板来做到这一点。如果容器将输出写入共享位置,是否可以从persistentVolumeClaim 读取?
    • @colossal 啊,这很公平。我认为添加边车非常简单,但我自己最近不需要这个功能。值得一试。 github.com/argoproj/argo-workflows/blob/master/examples/…
    • @colossal 关于 PVC 问题,我认为这应该是可能的,尽管我不确定 PVC 引用是如何在工作流中维护的。名称可能是随机的。 github.com/argoproj/argo-workflows/blob/master/examples/…
    • re: pvc,我用 pvs 试过,但结果还是一样的错误。 PVC 卷是在inner WorkflowTemplatespec.volumes 下定义的,但我将volumeMounts 保留在container 内,因为我不知道在哪里保留它,然后嵌套到container。顺便说一句,还尝试从 step-2 arguments.parameters 下的 PVC 读取,因为 PVC 是全局的,所以为什么在向步骤 2 提供输入时不能只读取。那没有给出任何错误,但也没有阅读内容:)
    • @colossal 而不是让InnerJob 尝试直接从 PVC 中获取文件,您可能需要添加一个后续步骤,即挂载 PV,然后将文件作为输出参数写入。
    猜你喜欢
    • 2021-12-17
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多