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文件中插入:

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 }}

运行结果:

猜你喜欢

转载自blog.csdn.net/lxd_max/article/details/127745246
今日推荐