Helm Charts - 如何对未定义的对象属性值使用“default”?

gui*_*ice 10 kubernetes-helm

使用 Helm,我的印象是,default如果未定义变量,则可能是后备方案。但是,Helm 似乎无法获取子对象哈希中的值:

  type: {{ default "NodePort" .Values.fpm.service.type }}
Run Code Online (Sandbox Code Playgroud)

如果未定义.Values.fpm.service或,则应使用 9000。service.type

但是,尝试对此进行模板化会引发 nil 指针错误:

 <.Values.fpm.service.type>: nil pointer evaluating interface {}.type
Run Code Online (Sandbox Code Playgroud)

有没有办法简单地执行这种级别的变量测试?或者我是否要接受 if/else 测试?

这样做的目的是在文件中选择性地定义.fpm.service(and [..].type) values.yaml

(我正在构建一个 Helm 库图表来处理主图表的可选定义)

Raf*_*zko 9

根据Helm 官方文档(使用默认函数),语法是不同的,你应该这样使用它:

type: {{ .Values.fpm.service.type | default "NodePort" | quote }}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案根本没有回答问题。 (4认同)
  • 但事实并非如此。问题不在于默认。问题在于 Helm 试图进入一个不存在的对象:检查“fpm.service.type”,而不是在“fpm.service”不存在时停止。 (2认同)
  • 有一个选项可以用括号将其括起来,例如: type: {{ ((.Values.fpm).service).type | 默认“节点端口” | 引用 }} (2认同)

gui*_*ice 6

看起来确实没有什么好方法来阻止 Helm 尝试潜入不存在的物体。我将 if 条件移至单行,并且它有效:

  type: {{ if .Values.fpm.service -}} {{ .default "NodePort" .Values.fpm.service.type | quote }} {{- else -}} "NodePort" {{- end }}
Run Code Online (Sandbox Code Playgroud)

这样,我fpm.service在尝试检查之前先检查是否存在.type。无论是否定义 和 ,.service它都有效。.service.type