用于检测 values.yaml

问题描述

我将尝试重现一个 helm 模板函数一个非常奇怪的行为(或者可能是我的误解),它基本上检测 values.yaml 文件中节点的存在。其实没那么简单,但这是最简单的方法来说明问题:

我使用的是 v2.16.1 helm 版本,但它在较新的 3.3 上被复制。 按照以下步骤操作:

  1. 创建示例图表
helm create myChart
  1. 函数附加到 myChart 助手
cat << EOF >> myChart/templates/_helpers.tpl

{{- define "myChart.hasNodeA" -}}
    {{- \$found := false -}}
    {{- if .Values.A -}}
        {{- \$found := true -}}
    {{- end -}}
    {{- print \$found -}}
{{- end -}}
EOF

(注意美元转义,这只是为了方便您使用 cat/EOF 附加函数

  1. 在部署中附加呈现的条件:
cat << EOF >> myChart/templates/deployment.yaml
{{- if eq (include "myChart.hasNodeA" .) "true" }}
  hasNodeA: "yes"
{{- end }}
{{- if eq (include "myChart.hasNodeA" .) "false" }}
  hasNodeA: "no"
{{- end }}
EOF
  1. 在没有和有节点的情况下进行渲染:
helm template myChart | grep hasNodeA

这里显示“no”,虽然它“正确”,但这是因为函数总是返回“false”

添加节点:

cat << EOF >> myChart/values.yaml
A:
  whatever: 555
EOF

你会看到问题:

helm template myChart | grep hasNodeA

这个节目再次“不”。

问题是函数条件正在满足,事实上,如果你测试这个(编辑_helpers.tpl文件将打印输出移到中间):

{{- define "myChart.hasNodeA" -}}
    {{- $found := false -}}
    {{- if .Values.A -}}
        {{- $found := true -}}
        {{- print $found -}}
    {{- end -}}
{{- end -}}

你会看到条件真的通过了

$> helm template myChart | grep hasNodeA
hasNodeA: "yes"

显然这不适用于负面情况。 这里奇怪的是,在条件中配置的变量在最后打印时似乎被忽略了。

对这种行为有什么想法吗? 谢谢你

解决方法

在 Helm 中,使用运算符 := 在其上下文中创建一个新变量。在本例中,您正在创建一个新的 $found 变量。在 Helm v3 中,您可以使用 = 运算符解决此问题。

如果您使用的是 Helm v2,那么这将使用大量 if 来解决。

BR