Helm チャートで動的な数のボリュームと volumeMounts を持つ機能をセットアップしようとしています。私の deployment.yaml の外観は次のとおりです。
volumeMounts:
{{- if .Values.deployment.hostPath }} {{ $dict := split ":" .Values.deployment.hostPath }} {{ range $idx, $val := $dict }} {{ $mnt := split "," $val }}
- mountPath: {{ $mnt._1 }}
name: {{ $mnt._0 }}
{{ end }}
{{ end }}
volumes:
{{- if .Values.deployment.hostPath }} {{ $dict := split ":" .Values.deployment.hostPath }} {{ range $idx, $val := $dict }} {{ $mnt := split "," $val }}
- name: {{ $mnt._0 }}
hostPath:
path: {{ $mnt._2 }}
{{- if $mnt._3 }}
type: {{ $mnt._3 }}
{{ end }}
{{ end }}
{{ end }}
values.yaml には、次のようなものがあります。
Deployment:
hostPath: test-host-path,/path/on/pod,/path/on/node,Directory
私がやっていることは、hostPath に定義されているものがあるかどうかを確認することです。ある場合は、「:」で項目を分割して辞書を作成します。この最初の例では、区切り文字 : がないため、値の文字列は 1 つしかありません。次に、ループする範囲を実行し (「:」で区切られた値のセットが複数ある場合)、値のセットをコンマで分割します。
したがって、この最初の例では、helm install を使用して問題なく動作します。
values.yaml --> hostPath: test-host-path,/path/on/pod,/path/on/node,Directory
volumeMounts:
- mountPath: /path/on/pod
name: test-host-path
volumes:
- name: test-host-path
hostPath:
path: /path/on/node
type: Directory
type フィールドはオプションなので、定義されているかどうかを確認するブロックがあり、定義されていない場合は yaml でレンダリングされません。したがって、最後のコンマの後に値がない場合の次の例でも機能します。
values.yaml --> hostPath: test-host-path,/path/on/pod,/path/on/node,
volumeMounts:
- mountPath: /path/on/pod
name: test-host-path
volumes:
- name: test-host-path
hostPath:
path: /path/on/node
しかし、「:」で区切られた 2 番目のデータ セットを追加しようとすると、helm のインストールで失敗します。
Deployment:
hostPath: test-host-path,/path/on/pod,/path/on/node,Directory:test-host-path-two,/path/on/pod/two,/path/on/node/two,Directory
Error: YAML parse error on chart/templates/deployment.yaml: error converting YAML to JSON: yaml: line 152: found a tab character that violates indentation
helm.go:94: [debug] error converting YAML to JSON: yaml: line 152: found a tab character that violates indentation
もちろん、タブについて言及していますが、問題が何であるかはよくわかりません。この同じコード (dict、range、split) を使用して configmap に複数のエントリを設定したので、うまくいくと思います。しかし、明らかにここで何かが欠けています。どんな助けでも大歓迎です。