如何最好地说明舵图中需要一个值?

Chi*_*lax 14 kubernetes-helm

我现在这样做:

value: {{ required "A valid .Values.foo entry required!" .Values.foo }}
Run Code Online (Sandbox Code Playgroud)

但是在我看来,为模板中的所有必需值提供相同的消息很麻烦,而且会使模板混乱。

有没有更好的方法可以在模板之外定义它,或者在模板本身内定义更简洁的方法?

pij*_*olu 31

使用所需函数将清单顶部所需的值定义为变量。

例如deployment.yaml

{{- $name := .Values.name | required ".Values.name is required." -}}

---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: {{ $name }}
 ....
Run Code Online (Sandbox Code Playgroud)


Rya*_*son 9

你可以利用range和事实来做一些事情,这null将使所需的检查失败。因此,在您的 values.yaml 中,您可以将此部分用于所需的环境变量:

reqEnv:
 - name: "VAR1"
   value: null
 - name: "VAR2"
   value: null
Run Code Online (Sandbox Code Playgroud)

然后在部署的 env 部分中,您将拥有:

{{- range .Values.reqEnv }}
          {{ .name }}: {{ required "A value must be entered for all reqEnv entries" .value }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)

然后用户会得到一个错误,除非他们reqEnv在他们的值文件或参数中设置了该部分的所有必需值。不幸的是,这样做你失去的是缺少哪个 var 的细节。这可能就是官方掌舵图似乎更喜欢以 required您已经使用的方式使用的原因。


小智 6

我偶然发现了同样的问题,并找到了一个我想添加的解决方案required.yaml:对我来说最有效的是在文件夹内创建一个template文件夹并将所有必需的值放入其中,如下所示:

{{- $_ := required "value_1 is a required value" .Values.value_1}}
{{- $_ := required "value_2 is a required value" .Values.value_2}}
Run Code Online (Sandbox Code Playgroud)

效果很好,优点是可以将所有必需的值集中在一处,并且每个值都有自定义错误消息。

希望这可以帮助。

  • 简单的技巧也允许对所需值有全局视图 (2认同)

edb*_*ead 4

您可以使用带有--strict标志的helm lint来检查未定义的值

$ helm lint --strict . 
==> Linting .
[INFO] Chart.yaml: icon is recommended
[ERROR] templates/: render error in "mychart/templates/service.yaml": template: mychart/templates/service.yaml:10:19: executing "mychart/templates/service.yaml" at <.Values.foo>: map has no entry for key "foo"

Error: 1 chart(s) linted, 1 chart(s) failed
Run Code Online (Sandbox Code Playgroud)