以下操作,均原取自官网,由个人进行实操。
官网地址:Helm | 流控制模板中流结构的快速概述https://helm.sh/zh/docs/chart_template_guide/control_structures/
操作前准备:
1. 有一台云服务器(已配置成为master结点),确保集群所有pod正常运行。
2. 已安装下载HELM。
3. 已创建了一个chart, 并且删除templates文件夹下的所有。
4. 已在values.yaml文件中插入:
favorite:
drink: coffee
food: pizza
5. 在templates下新建configmap.yaml文件,下面的操作均只针对该文件。
条件控制语句 及空格问题
第一个configmap.yaml,认识条件语句if/else
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {
{ .Values.favorite.drink | default "tea" | quote }}
food: {
{ .Values.favorite.food | upper | quote }}
{
{ if eq .Values.favorite.drink "coffee" }}mug: "true"{
{ end }}
操作:
(下面都使用类似的命令,仅改变chart名:chart+顺序)
[root@k8s-master testchart]# vim mychart/templates/configmap.yaml
[root@k8s-master testchart]# helm install chart1 ./mychart --dry-run --debug
...
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart1-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
mug: "true"
结果:
第二个configmap.yaml,错误的空格
与第一个的不同在于换了行,而且在mug前打多了两位缩进。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {
{ .Values.favorite.drink | default "tea" | quote }}
food: {
{ .Values.favorite.food | upper | quote }}
{
{ if eq .Values.favorite.drink "coffee" }}
mug: "true"
{
{ end }}
得到错误:
Error: INSTALLATION FAILED: YAML parse error on mychart/templates/configmap.yaml: error converting YAML to JSON: yaml: line 9: did not find expected key
原因即多打出了空格,而报错,导致yaml格式错误,变成如下效果,运行命令时是没有显示出来的:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart2-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
mug: "true"
第三个configmap.yaml,多出的空白
与第二个的不同在于在mug前打缩进,是正常的,与food平行的。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {
{ .Values.favorite.drink | default "tea" | quote }}
food: {
{ .Values.favorite.food | upper | quote }}
{
{ if eq .Values.favorite.drink "coffee" }}
mug: "true"
{
{ end }}
因为YAML文件在helm模板引擎运行时会把{ {}}移除后留下空白,在单独一行只有{ {}}的情况下,就会形成一行空白。
运行结果:
第四个configmap,杠掉空白
与第三个的不同在于在if控制语句中,左{ {后加了“-”一个横杠,它会去掉空白,相当于回退一格。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {
{ .Values.favorite.drink | default "tea" | quote }}
food: {
{ .Values.favorite.food | upper | quote }}
{
{- if eq .Values.favorite.drink "coffee" }}
mug: "true"
{
{- end }}
这里还可以使用indent控制缩进,比直接在前面打空格控制缩进要清晰一些。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {
{ .Values.favorite.drink | default "tea" | quote }}
food: {
{ .Values.favorite.food | upper | quote }}
{
{- if eq .Values.favorite.drink "coffee" }}
{
{ indent 2 "mug: true" }}
{
{- end }}
运行结果:
第五个configmap, 杠多变杠精
与第四个的不同在于在if控制语句中,右{ {也后加了“-”一个横杠,那么导致右边也回退了一位。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {
{ .Values.favorite.drink | default "tea" | quote }}
food: {
{ .Values.favorite.food | upper | quote }}
{
{- if eq .Values.favorite.drink "coffee" -}}
mug: "true"
{
{- end -}}
运行就会报错,Error: INSTALLATION FAILED: YAML parse error on mychart/templates/configmap.yaml: error converting YAML to JSON: yaml: line 7: did not find expected key
因为会形成food: "PIZZA"mug:"true"违背yaml的语法:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart5-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"mug: "true"
with下作用域
第六个configmap, with控制局部作用域
与第五个configmap相比,去掉了if条件语句,加是了with语句,并在drink和food部分的.Values.favorite提取出来。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{
{- with .Values.favorite }}
drink: {
{ .drink | default "tea" | quote }}
food: {
{ .food | upper | quote }}
{
{- end }}
运行结果:
第七个configmap, with控制区域无法访问顶层父作用域的对象
与第六个configmap的区别是加了release。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{
{- with .Values.favorite }}
drink: {
{ .drink | default "tea" | quote }}
food: {
{ .food | upper | quote }}
release: {
{ .Release.Name }}
{
{- end }}
运行结果:
报错,Error: INSTALLATION FAILED: template: mychart/templates/configmap.yaml:10:22: executing "mychart/templates/configmap.yaml" at <.Release.Name>: nil pointer evaluating interface {}.Name。
第八个configmap, with控制区域外正常访问父作用域的对象
与第七个configmap的区别是把release部分移到with语句之外。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{
{- with .Values.favorite }}
drink: {
{ .drink | default "tea" | quote }}
food: {
{ .food | upper | quote }}
{
{- end }}
release: {
{ .Release.Name }}
运行结果:
第九个configmap, with控制区域内$访问父作用域的对象
与第八个configmap的区别是release前,加“$”作为访问前缀。
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{
{- with .Values.favorite }}
drink: {
{ .drink | default "tea" | quote }}
food: {
{ .food | upper | quote }}
release: {
{ $.Release.Name }}
{
{- end }}
$会映射到根作用域,相当于原始的“.”,运行结果:
range操作循环
这里先需改动一下values.yaml,以至于能看到循环效果:
加上属性
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
第十个configmap,range循环
(注:|-
标识在YAML中是指多行字符串)
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{
{- with .Values.favorite }}
drink: {
{ .drink | default "tea" | quote }}
food: {
{ .food | upper | quote }}
{
{- end }}
toppings: |-
{
{- range .Values.pizzaToppings }}
- {
{ . | title | quote }}
{
{- end }}
运行结果:
第十一个configmap,运用“$”让with和range在一起
与第十个相比,把toppings属性放入with语句范围内,运用“$”引用Values对象
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{
{- with .Values.favorite }}
drink: {
{ .drink | default "tea" | quote }}
food: {
{ .food | upper | quote }}
toppings: |-
{
{- range $.Values.pizzaToppings }}
- {
{ . | title | quote }}
{
{- end }}
{
{- end }}
运行结果: