一、Chart模板:函數與管道
常用函數:
? quote:將值轉換為字符串,即加雙引號
? default:設置默認值,如果獲取的值為空則為默認值
? indent和nindent:縮進字符串
? toYaml:引用一塊YAML內容
? 其他函數:upper(轉換為大寫)、title(只首字母大寫)等
1.1 quote:將值轉換為字符串,即加雙引號
示例:nodeSelector標簽的值用了true正常使用會報錯,這是因為它是關鍵字,需要加引號才可以。
# values.yaml
nodeSelector:
gpu: true
# templates/deployment.yaml
…
nodeSelector:
disktype: {{ quote .Values.nodeSelector.gpu }}
輸出效果:
# templates/deployment.yaml
…
nodeSelector:
disktype: "true"
1.2 default:設置默認值,如果獲取的值為空則為默認值
示例:以防止忘記定義而導致模板文件缺少字段無法創建資源,這時可以為字段定義一個默認值。
image: {{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}
這里用到了管道符“|”,前面的值傳遞后函數驗證是否為空。
假如.Values.image.tag
這個變量值為空,輸出效果就如下:
image: nginx:latest
1.3 indent和nindent函數
indent和nindent函數都是縮進字符串,主要區別在于nindent會在縮進前多添加一個換行符。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ .Release.Name | indent 6 }}
app: {{ .Release.Name | nindent 6 }}
...
后面的數字6,標識往后縮進6個字符
示例效果:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web-ng
app: web-ng
...
1.4 toYaml:引用一塊YAML內容
示例:在values.yaml里寫結構化數據,引用內容塊
# values.yaml
resources:limits:cpu: 100mmemory: 128Mi
requests:cpu: 100mmemory: 128Mi
deployment.yaml引用values.yaml的變量值,并換行縮進10個字符
# templates/deployment.yaml
...
resources:
{{ toYaml .Values.resources | nindent 10 }}
deployment.yaml輸出的效果:
# templates/deployment.yaml
...
resources:limits:cpu: 100mmemory: 128Mirequests:cpu: 100mmemory: 128Mi
二、Chart模板:流程控制
Helm模板語言提供以下流程控制語句:
? if/else:條件判斷
? range:循環
? with:指定變量作用域
2.1 流程控制之if/else
# values.yaml
ingress:
enabled: false
# templates/ingress.yaml
{{ if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: web
spec:
rules:
- host: www.ctnrs.com
http:paths:- path: /pathType: Prefixbackend:service:name: webport:number: 80
{{ end }}
測試:helm install test --set ingress.enabled=true --dry-run mychart
,效果為:不填充if包裹的內容
2.2 流程控制之range
# cat values.yaml
test:
- 1
- 2
- 3
# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
test: |
{{- range .Values.test }}
{{ . }} # 引用當前元素
{{- end }}
輸出效果:
# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: web-ng
data:test: - 1- 2- 3
2.3 流程控制之with
with語句可以允許將當前范圍 . 設置為特定的對象,比如我們前面一直使用
的 .Values.nodeSelecotr,我們可以使用 with來將 . 范圍指向 .Values.nodeSelecotr
# cat values.yaml
...
nodeSelector:team: agpu: yes
# cat templates/deployment.yaml
...
{{- with .Values.nodeSelector }}
nodeSelector:
team: {{ .team }}
gpu: {{ .gpu }}
{{- end }}
填充后的效果:
# templates/deployment.yaml
...
nodeSelector:
team: a
gpu: yes
三、Chart模板:命名模板
命名模板類似于開發語言中的函數。指一段可以直接被另一段程序或代碼引用的程序或代碼。
在編寫chart時,可以將一些重復使用的內容寫在命名模板文件中供公共使用,這樣可減少重
復編寫程序段和簡化代碼結構。
命名模塊使用define定義,template或include引入,在templates目錄中默認下劃線開頭的
文件為公共模板(helpers.tpl)。
定義模板:
示例:資源名稱生成指令放到公共模板文件,作為所有資源名稱
# cat templates/_helpers.tpl 注意是在_helpers.tpl文件寫模板
{{- define "fullname" -}}
{{- .Chart.Name -}}-{{ .Release.Name }}
{{- end -}}
# cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "fullname" . }}
...
使用模板:
template指令是將一個模板包含在另一個模板中的方法。但是,template函
數不能用于Go模板管道。為了解決該問題,引入include指令。(平時我們用include就行)
示例:
1 定義:
# cat _helpers.tpl
{{- define "labels" -}}
app: {{ template "fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
{{- end -}}
2 使用:
# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "fullname" . }}
labels:
{{- include "labels" . | nindent 4 }}...