web-dev-qa-db-ja.com

欠落しているネストされたキーを評価しようとすると、ヘルムチャートが「nilポインター評価インターフェイス{}」で失敗する

Helm 3ライブラリチャートを書いていて、デフォルト値でYAMLを作成したいと考えています。ただし、存在しないnestedキーにデフォルト値を設定しようとすると、Helmは次のエラーメッセージで失敗します。

nil pointer evaluating interface {}

私のKubernetesオブジェクトに次のスニペットがあるとします。

{{- if eq (.Values.deployment.scale.type | default "static") "static" }}
  replicas: {{ default "3" .Values.deployment.scale.replicas }}
{{- end }}

.Values.deployment.scaleが定義されている場合、テンプレートは正常にレンダリングされ、.Values.deployment.scale.replicasが定義されていなくても、replicasの値は3になります。

ただし、親キーの1つが定義されていない場合、Helmは上記のエラーメッセージで失敗します。たとえば、values.yamlが次の場合:

# values.yaml
deployment:
  not_scale: {}

レンダリングは失敗します:nil pointer evaluating interface {}.scale

親キーが定義されていない場合でも、ネストされたキーのデフォルト値を設定するにはどうすればよいですか?

1
mittelmania

この問題を解決するには、階層を段階的に評価し、default dictを使用して、キーが存在しない場合に空のマップを割り当てます。それは両方とも機能し、よりよく見えます。

例:

{{ $deployment := default dict .Values.deployment }}
{{ $scale      := default dict $deployment.scale }}
{{- if eq ($scale.type | default "static") "static" }}
  replicas: {{ default "3" $scale.replicas }}
{{- end }}
0
mittelmania

その場合のデフォルトを設定できるとは思いません。 scaleフィールドが存在するかどうかを事前にチェックする必要があります。そのためには、 hasKey function from sprig を使用できます。

{{- if hasKey .Values.deployment "scale" }}
{{- if eq (.Values.deployment.scale.type | default "static") "static" }}
replicas: {{ default "3" .Values.deployment.scale.replicas }}
{{- end }}
{{- else }}
replicas: 3
{{- end }}
1