• HELM FLOW CONTROL practical operation


    以下操作,均原取自官网,由个人进行实操。

    官网地址:Helm | 流控制模板中流结构的快速概述https://helm.sh/zh/docs/chart_template_guide/control_structures/

    操作前准备:

            1. 有一台云服务器(已配置成为master结点),确保集群所有pod正常运行。

            2. 已安装下载HELM

            3. 已创建了一个chart, 并且删除templates文件夹下的所有。

            4. 已在values.yaml文件中插入:

    1. favorite:
    2. drink: coffee
    3. food: pizza

            5. 在templates下新建configmap.yaml文件,下面的操作均只针对该文件。

    条件控制语句 及空格问题

    第一个configmap.yaml,认识条件语句if/else

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. drink: {{ .Values.favorite.drink | default "tea" | quote }}
    8. food: {{ .Values.favorite.food | upper | quote }}
    9. {{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }}

    操作:

    (下面都使用类似的命令,仅改变chart名:chart+顺序)

    1. [root@k8s-master testchart]# vim mychart/templates/configmap.yaml
    2. [root@k8s-master testchart]# helm install chart1  ./mychart --dry-run --debug
    3. ...
    4. ...
    5. # Source: mychart/templates/configmap.yaml
    6. apiVersion: v1
    7. kind: ConfigMap
    8. metadata:
    9. name: chart1-configmap
    10. data:
    11. myvalue: "Hello World"
    12. drink: "coffee"
    13. food: "PIZZA"
    14. mug: "true"

    结果:

    第二个configmap.yaml,错误的空格

    与第一个的不同在于换了行,而且在mug前打多了两位缩进。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. drink: {{ .Values.favorite.drink | default "tea" | quote }}
    8. food: {{ .Values.favorite.food | upper | quote }}
    9. {{ if eq .Values.favorite.drink "coffee" }}
    10. mug: "true"
    11. {{ 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格式错误,变成如下效果,运行命令时是没有显示出来的:

    1. # Source: mychart/templates/configmap.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: chart2-configmap
    6. data:
    7. myvalue: "Hello World"
    8. drink: "coffee"
    9. food: "PIZZA"
    10. mug: "true"


    第三个configmap.yaml,多出的空白

    与第二个的不同在于在mug前打缩进,是正常的,与food平行的。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. drink: {{ .Values.favorite.drink | default "tea" | quote }}
    8. food: {{ .Values.favorite.food | upper | quote }}
    9. {{ if eq .Values.favorite.drink "coffee" }}
    10. mug: "true"
    11. {{ end }}

    因为YAML文件在helm模板引擎运行时会把{{}}移除后留下空白,在单独一行只有{{}}的情况下,就会形成一行空白。 

    运行结果:

    第四个configmap,杠掉空白

    与第三个的不同在于在if控制语句中,左{{后加了“-”一个横杠,它会去掉空白,相当于回退一格。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. drink: {{ .Values.favorite.drink | default "tea" | quote }}
    8. food: {{ .Values.favorite.food | upper | quote }}
    9. {{- if eq .Values.favorite.drink "coffee" }}
    10. mug: "true"
    11. {{- end }}

    这里还可以使用indent控制缩进,比直接在前面打空格控制缩进要清晰一些。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. drink: {{ .Values.favorite.drink | default "tea" | quote }}
    8. food: {{ .Values.favorite.food | upper | quote }}
    9. {{- if eq .Values.favorite.drink "coffee" }}
    10. {{ indent 2 "mug: true" }}
    11. {{- end }}

    运行结果:

    第五个configmap, 杠多变杠精

    与第四个的不同在于在if控制语句中,右{{也后加了“-”一个横杠,那么导致右边也回退了一位。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. drink: {{ .Values.favorite.drink | default "tea" | quote }}
    8. food: {{ .Values.favorite.food | upper | quote }}
    9. {{- if eq .Values.favorite.drink "coffee" -}}
    10. mug: "true"
    11. {{- 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的语法:

    1. # Source: mychart/templates/configmap.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: chart5-configmap
    6. data:
    7. myvalue: "Hello World"
    8. drink: "coffee"
    9. food: "PIZZA"mug: "true"

    with下作用域

    第六个configmap, with控制局部作用域

    与第五个configmap相比,去掉了if条件语句,加是了with语句,并在drink和food部分的.Values.favorite提取出来。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. {{- with .Values.favorite }}
    8. drink: {{ .drink | default "tea" | quote }}
    9. food: {{ .food | upper | quote }}
    10. {{- end }}

    运行结果:

    第七个configmap, with控制区域无法访问顶层父作用域的对象

    与第六个configmap的区别是加了release。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. {{- with .Values.favorite }}
    8. drink: {{ .drink | default "tea" | quote }}
    9. food: {{ .food | upper | quote }}
    10. release: {{ .Release.Name }}
    11. {{- 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语句之外。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. {{- with .Values.favorite }}
    8. drink: {{ .drink | default "tea" | quote }}
    9. food: {{ .food | upper | quote }}
    10. {{- end }}
    11. release: {{ .Release.Name }}

     运行结果:

    第九个configmap, with控制区域内$访问父作用域的对象

    与第八个configmap的区别是release前,加“$”作为访问前缀。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. {{- with .Values.favorite }}
    8. drink: {{ .drink | default "tea" | quote }}
    9. food: {{ .food | upper | quote }}
    10. release: {{ $.Release.Name }}
    11. {{- end }}

    $会映射到根作用域,相当于原始的“.”,运行结果:

    range操作循环

    这里先需改动一下values.yaml,以至于能看到循环效果:
    加上属性

    1. pizzaToppings:
    2. - mushrooms
    3. - cheese
    4. - peppers
    5. - onions

    第十个configmap,range循环

    (注:|-标识在YAML中是指多行字符串)

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. {{- with .Values.favorite }}
    8. drink: {{ .drink | default "tea" | quote }}
    9. food: {{ .food | upper | quote }}
    10. {{- end }}
    11. toppings: |-
    12. {{- range .Values.pizzaToppings }}
    13. - {{ . | title | quote }}
    14. {{- end }}

    运行结果:

    第十一个configmap,运用“$”让with和range在一起

    与第十个相比,把toppings属性放入with语句范围内,运用“$”引用Values对象

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. myvalue: "Hello World"
    7. {{- with .Values.favorite }}
    8. drink: {{ .drink | default "tea" | quote }}
    9. food: {{ .food | upper | quote }}
    10. toppings: |-
    11. {{- range $.Values.pizzaToppings }}
    12. - {{ . | title | quote }}
    13. {{- end }}
    14. {{- end }}

    运行结果:

  • 相关阅读:
    BUUCTF 秘密文件 1
    ChatGLM-6B的私有化部署
    Linux:keepalived 双热备份(基础备份web)
    最流行的视频创作者 第 317 场周赛 第二题
    工程压缩与解压缩
    mysql基本命令
    【每日一题Day38】LC809情感丰富的文字 | 双指针 模拟
    VR数字工厂,为企业工厂打造竞争新优势
    项目范围管理
    select条目对象
  • 原文地址:https://blog.csdn.net/lxd_max/article/details/127745246