我试图理解 helm 模板并发现这样的语法:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
所以我认为每件事都必须以
{{-
开头,但后来我发现了其他没有该语法的语法:
- name: {{ .Chart.Name }}
所以我的问题是这两种语法有什么区别?破折号有什么作用?什么时候需要?
Helm 模板语法基于 Go 编程语言的text/template 包。
大括号
{{
和 }}
是进入和退出模板逻辑的左括号和右括号。
Helm 文档位于 https://helm.sh/docs/chart_template_guide/control_structures/ 讨论了为什么在示例中需要这种语法。
YAML 赋予空白意义,因此管理空白变得非常重要。 [...] 模板声明的花括号语法
可以用特殊字符修改,以告诉模板引擎压缩空格。{{
(添加破折号和空格)表示应该向左切掉空格,而{{-
表示应该消耗右边的空格。当心!换行符是空格!-}}
所以答案是这样的。
{{
语法和{{-
语法的区别是{{- something }}
会导致左边的空格被删除。如果没有这个,将包含任何额外的空间,这可能会导致 YAML 格式不正确。
请参阅 Helm 文档,其中详细介绍了此语法的工作原理并删除了额外的空格。
你会经常看到破折号出现在控制结构中,因为没有这个额外的空间会添加到你的 YAML 文件中,这可能会导致创建无效的语法。所以,例如,
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
使得属性
apiVersion
被输出(在YAML文件中)而不在属性前后添加空行。
Go 模板文档说
执行源为
的模板时
"{{23 -}} < {{- 45}}"
生成的输出将是
"23<45"
这表明破折号语法导致空格被删除。
下面我将解释如何开始尝试 helm 语法 使用一个简单的一次性项目。
下面的命令我创建一个临时目录
testhelm
并进入它,然后运行create helm mytest
创建一个helm应用程序。
接下来,我创建一个示例 helm YAML 文件。这是您要将要测试的内容放入其中的文件。下面我使用了文件
mytest/templates/my.yaml
,但是可以创建任何文件。
Helm 显然获取模板目录中的所有文件并解析/处理它们以创建 YAML 输出(用于创建 Kubernetes YAML 文件以配置 K8S 应用程序)。
在我们的案例中,我们只是利用
helm
命令创建一个测试台供我们使用。
如果您使用的是基于 UNIX 的系统,您应该能够复制并粘贴下面的整个代码示例以创建 testbed 以开始试验。
mkdir testhelm
cd testhelm
helm create mytest
cat <<EOF > mytest/templates/my.yaml
expression1: "{{ 23 }} < {{ 45 }}"
expression2: "{{ 23 -}} < {{- 45 }}"
aTest0: ArgWithNoSpace
aTest1: Arg with spaces on left and right
aTest2: " spaces-on-left-and-right "
aTest3: {{ " spaces-on-left-and-right " }}
aTest4: {{ " spaces-on-left-and-right " | trim | quote }}
aTest5: Some
{{- "Thing Funky is" -}} goingOn
{{- " here"}}
drink2: {{ .Values.drink2 | default "coffee" | quote }}
aTest6: Some {{ "Thing Funky is" }} goingOn {{ " here"}}
EOF
然后运行
helm template
命令,如下所示,并研究您获得的输出。
helm template myproj ./mychart | less
. . . output trimmed . . .
# Source: mychart/templates/my.yaml
expression1: "23 < 45"
expression2: "23<45"
aTest0: ArgWithNoSpace
aTest1: Arg with spaces on left and right
aTest2: " spaces-on-left-and-right "
aTest3: spaces-on-left-and-right
aTest4: "spaces-on-left-and-right"
aTest5: SomeThing Funky isgoingOn here
drink2: "coffee"
aTest6: Some Thing Funky is goingOn here
前两个名称/值对
expression1
和 expression2
显示使用和不使用破折号语法的区别。
还要注意
aTest5
的语法,它导致多行合并为一行输出。
使用这种方法以一口大小的块消化 Helm 语法,因此当您需要修复某些东西时,您可以理解您所看到的内容。