我在 Helm 图表中经常看到的一种模式(例如)是将布尔值设置为 default 到
true
,除非提供了一些覆盖值:
feature_enabled_in_k8s_resource: {{ default true .Values.foo_feature_enabled }}
即 - “如果 foo_feature_enabled
设置为 Helm 输入中的任何值(通过
--set
、
values.yaml
等),则将
feature_enabled_in_k8s_resource
设置为该值 - 否则(如果未设置),将
feature_enabled_in_k8s_resource
设置为
true
”
但是,我无法按照预期覆盖该值 - 在 false
中设置
values.yaml
值和/或传递
--set foo_feature_enabled=false
作为参数,仍然会导致模板保留值
true
。我怀疑这是因为
false
是一个“falsy”值,因此
default
将其解析为“需要替换”。传递字符串值(
"false"
中的
values.yaml
或
--set-string foo_feature_enabled=false
)确实会出现(从
helm template [...]
输出)将
feature_enabled_in_k8s_resource
设置为
"false"
- 但尚不清楚这是否会被正确解释由 Kubernetes 产生的实际应用程序(也就是说,它可能将非空字符串解释为“truthy”,使我们回到原来的默认行为)。即使这有效,它在某种程度上感觉很糟糕,这表明我错过了“正确的”解决方案。 (据推测,
实际修复将是 Helm 图表从不default
到
true
- 但这在处理我无法控制的图表时对我没有帮助!)
ne(不等于)的干净(尽管有点不清楚)解决方案
feature_enabled_in_k8s_resource: {{ ne .Values.foo_feature_enabled false }}
.Values.foo_feature_enabled
| 未指定 | |||
---|---|---|---|---|
feature_enabled_in_k8s_resource
|
default
结合使用的“真实性”的理解在这里是正确的:
default
将 0
、
false
、
nil
和空字符串全部视为“未设置”,并将它们替换为默认值。因此,如果您希望
.Values.something
具有布尔值,则
.Values.something | default true
将始终为
true
。最少代码的解决方案是在图表的
values.yaml
文件中指定一个值:
# values.yaml
# foo_feature_enabled enables the foo feature.
foo_feature_enabled: true
# templates/configmap.yaml
feature_enabled_in_k8s_resource: {{ .Values.foo_feature_enabled }}
现在 helm install --set foo_feature_enabled=false
选项将覆盖图表的
values.yaml
文件。但如果您没有该选项,则可以使用
values.yaml
中的默认值。如果这不是一个选项,那么您需要显式检查是否在
hasKey
块中使用
if
设置该值。所有其他简写都有相同的“真实性”检查。
# templates/configmap.yaml
feature_enabled_in_k8s_resource:
{{- if hasKey .Values "foo_feature_enabled" }} {{ .Values.foo_feature_enabled }}
{{- else }} true
{{- end }}
ternary
功能:
feature_enabled_in_k8s_resource: {{ hasKey .Values "foo_feature_enabled" | ternary .Values.foo_feature_enabled true }}
比使用ne
长,但一看就很清楚。
feature_enabled_in_k8s_resource: {{ .Values.foo_feature_enabled | default true }}
这将首先评估提供的值,如果未提供,将使用默认的真实值。请参考
在helm中使用管道。