一、目录结构
templates/ 目录包括了模板文件。当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates/目录中。 然后收集模板的结果并发送给Kubernetes。
values.yaml 文件也导入到了模板。这个文件包含了chart的 默认值 。这些值会在用户执行helm install 或 helm upgrade时被覆盖。
Chart.yaml 文件包含了该chart的描述。你可以从模板中访问它。
charts/目录 可以 包含其他的chart(称之为chart)。
二、对象
我们创建一个名为 mychart/templates/configmap.yaml的文件
模板命令 {{ .Release.Name }} 将发布名称注入了模板。值作为一个命名空间对象传给了模板,用点(.)分隔每个命名空间的元素。
Release是一个Helm的内置对象,Release前面的点表示从作用域最顶层的命名空间开始。这样.Release.Name就可解读为“从顶层命名空间开始查找 Release对象,然后在其中找Name对象”。
对象可以通过模板引擎传递到模板中。
Values: Values对象是从values.yaml文件和用户提供的文件传进模板的。默认为空
Chart: Chart.yaml文件内容。 Chart.yaml里的所有数据在这里都可以可访问的。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 会打印出 mychart-0.1.0
例1:编辑mychart/values.yaml
刚才的模板mychart/templates/configmap.yaml
例2:
values文件也可以包含更多结构化的内容。我们可以在values.yaml文件中创建一个favorite项,然后添加一些key:
模板:
三、函数和管道
1.以下例子使用的values.yaml
2.Quote函数:可以通过调用模板指令中的quote函数把.Values对象中的字符串属性用引号引起来,然后放到模板中。
3.管道:模板语言其中一个强大功能是管道概念。管道符是按顺序完成一系列任务的方式。现在用管道符重写上述示例:
使用管道符可以将很多函数链接在一起:
Food大写并加上双引号,模板会生成以下内容:
4.default函数模板中频繁使用的一个函数是default这个函数允许你在模板中指定一个默认值,以防这个值被忽略。现在使用它修改上述示例:
模板会生成以下内容:
现在,从刚开始的values.yaml中移除设置,注释掉drink:
重新运行会生成如下内容:
在实际的chart中,所有的静态默认值应该设置在 values.yaml 文件中,且不应该重复使用 default 命令 (否则会出现冗余)。
Helm 包含了很多可以在模板中利用的模板函数,详情:https://helm.sh/zh/docs/chart_template_guide/function_list/
四、If/Else
控制结构是在按照条件在一个模板中包含一个块文本。即if/else块。基本的条件结构看起来像这样:
我们先在配置映射中添加一个简单的条件。如果饮品是coffee会添加另一个配置:
刚才的values.yaml例子
由于例子中注释了drink: coffee,输出中就不会包含mug: "true"标识。但如果将注释打开,输入就会是这样:
五、控制空格
查看条件时,我们需要快速了解一下模板中控制空白的方式,格式化之前的例子,使其更易于阅读:
初始情况下,看起来没问题。但是如果通过模板引擎运行时,我们将得到一个不幸的结果:空格导致生成了错误的YAML,mug的缩进是不对的
Mug缩进改好了,但是还有个问题,多出一行空行
{{- (包括添加的横杠和空格)表示向左删除空白, 而 -}}表示右边的空格应该被去掉。 一定注意空格就是换行
得到正确结果
六、控制变量范围
.是对当前作用域的引用。因此 .Values就是告诉模板在当前作用域查找Values对象。
with允许你为特定对象设定当前作用域(.)。比如,我们已经在使用.Values.favorite。 修改配置映射中的.的作用域指向.Values.favorite:
注意事项,在限定的作用域内,无法使用.访问父作用域的对象。错误示例如下:
这样会报错因为Release.Name不在.限定的作用域内。但是如果对调最后两行就是正常的, 因为在{{ end }}之后作用域被重置了。
七、循环
在Helm的模板语言中,在一个集合中迭代的方式是使用range操作符。开始之前,我们先在values.yaml文件添加一个披萨的配料列表:
修改模板把这个列表打印到配置映射中:
八、变量
在模板中,我们可以使用变量简化代码,并更好地使用with和range。
在之前的例子中,我们看到下面的代码会失败:
Release.Name 不在with块的限制范围内。解决作用域问题的一种方法是将对象分配给可以不考虑当前作用域而访问的变量。
Helm模板中,变量是对另一个对象的命名引用。遵循$name变量的格式且指定了一个特殊的赋值运算符::=。 我们可以使用针对Release.Name的变量重写上述内容。
注意在with块开始之前,赋值$relname := .Release.Name。 现在在with块中,$relname变量仍会执行版本名称。运行之后会生成以下内容:
变量在range循环中使用:
先是range,然后是变量,然后是赋值运算符,然后是列表。会将整型索引(从0开始)赋值给$index并将值赋值给$topping。 执行会生成:
对于数据结构有key和value,可以使用range获取key和value。比如,可以通过.Values.favorite进行循环:
之前的values.yaml
第一次迭代,$key会是drink且$val会是coffee,第二次迭代$key会是food且$val会是pizza。 运行之后会生成:
以上就是helm模板简单编写的内容,更多详情可前往官网查看https://helm.sh/