Helm:范围函数没有按预期保持输入值的顺序?

Helm: the range function is not keeping the input values in order as expected?

我知道,词典是按顺序处理的。但是,出于某些流程目的,我需要按某种顺序 运行 特定流程。 (由于原生 k8s 不会按顺序支持 cronjobs,所以我在单个 pod 的入口点执行它)。 下面是我的values.yaml

batches:
  evaluate_events:
    ev-cron-3:
      populate_data:
        event-name: "Populate  Data process"
        business-process: "Generic"
        rule-type: "Identification"
      auth_export:
        event-name: "Auth Export Ruleset"
        business-process: "Generic"
        rule-type: "Constraint Satisfaction"
      new_document_attached:
        event-name: "New Document Attached"
        business-process: "Generic"
        rule-type: "Constraint Satisfaction"

我的代码 inv k8s yaml:

{{- range $event, $data := $.Values.batches }}
{{- range $key, $cron := $data }
{{- range $jobname, $inputs := $cron }}
            - '{{ $event }} {{- range $args, $val := $inputs }} --{{ $args }} "{{ $val }}" {{- end }}'
{{- end }}
{{- end }}
{{- end }}

预期输出:与 values.yaml

中的顺序相同
- 'evaluate_events --business-process "Generic" --event-name "Populate  Data process" --rule-type "Identification"'
- 'evaluate_events --business-process "Generic" --event-name "Auth Export Ruleset" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "New Document Attached" --rule-type "Constraint Satisfaction"'

实际输出:不符合 values.yaml

的顺序
- 'evaluate_events --business-process "Generic" --event-name "Auth Export Ruleset" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "New Document Attached" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "Populate  Data process" --rule-type "Identification"'

需要,有没有人处理过这种情况?以及如何实现?

您正在 values.yaml 中使用 YAML 地图对象。这由成对的键和值组成,但不一定按任何顺序排列。您可能需要一个 YAML 列表:

- arg: event-name
  value: Populate  Data process
- arg: business-process
  value: Generic
- arg: rule-type
  value: Identification

然后您可以使用 range:

遍历列表(不是地图)
- '{{ $event }}
{{- range $inputs }} --{{ .arg }} "{{ .value }}"{{- end -}}
'

出于这个原因,Kubernetes 中的几个地方都有带有 name 字段的列表,您也可以考虑在您的价值结构中使用这种方法。如果您控制应用程序本身,您可能还会发现将这些设置作为环境变量而不是 command-line 参数传递会更容易,因为如您所示构造命令字符串在语法上可能有点棘手。