官方文檔:https://helm.sh/docs/chart_template_guide/function_list/
_helpers.tpl
在chart中以 “下划線” 開頭的文件,稱為”子模版”。
例如在 _helper.tpl 中定義子模塊,格式:{{- define "模版名字" -}} 模版內容 {{- end -}}
{{- define "nginx.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}
# 若 .Values.nameOverride 為空,則默認值為 .Chart.Name
引用模板,格式:{{ include "模版名字" 作用域}}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "nginx.fullname" . }}
內置對象
Build-in Objects: https://helm.sh/docs/chart_template_guide/builtin_objects/
Chart 預定義對象可直接在各模板中使用。
Release: 代表Release對象,屬性包含:Release.Name、Release.Namespace、Release.Revision等
Values: 表示 values.yaml 文件數據
Chart: 表示 Chart.yaml 數據
Files: 用於訪問 chart 中非標准文件
Capabilities: 用於獲取 k8s 集群的一些信息
- Capabilities.KubeVersion.Major:K8s的主版本
Template: 表示當前被執行的模板
- Name:表示模板名,如:mychart/templates/mytemplate.yaml
- BasePath:表示路徑,如:mychart/templates
變量
默認情況點( . ), 代表全局作用域,用於引用全局對象。
helm 全局作用域中有兩個重要的全局對象:Values 和 Release
# Values
# 這里引用了全局作用域下的Values對象中的key屬性。
{{ .Values.key }}
Values代表的就是values.yaml定義的參數,通過.Values可以引用任意參數。
例子:
{{ .Values.replicaCount }}
# 引用嵌套對象例子,跟引用json嵌套對象類似
{{ .Values.image.repository }}
# Release
其代表一次應用發布,下面是Release對象包含的屬性字段:
Release.Name - release的名字,一般通過Chart.yaml定義,或者通過helm命令在安裝應用的時候指定。
Release.Time - release安裝時間
Release.Namespace - k8s名字空間
Release.Revision - release版本號,是一個遞增值,每次更新都會加一
Release.IsUpgrade - true代表,當前release是一次更新.
Release.IsInstall - true代表,當前release是一次安裝
Release.Service: - The service that is rendering the present template. On Helm, this is always Helm.
自定義模版變量。
# 變量名以$開始命名, 賦值運算符是 := (冒號+等號)
{{- $relname := .Release.Name -}}
引用自定義變量:
#不需要 . 引用
{{ $relname }}
include
include 是一個函數,所以他的輸出結果是可以傳給其他函數的
# 例子1:
env:
{{- include "xiaomage" . }}
# 結果:
env:
- name: name
value: xiaomage
- name: age
value: secret
- name: favourite
value: "Cloud Native DevSecOps"
- name: wechat
value: majinghe11
# 例子2:
env:
{{- include "xiaomage" . | indent 8}}
# 結果:
env:
- name: name
value: xiaomage
- name: age
value: secret
- name: favourite
value: "Cloud Native DevSecOps"
- name: wechat
value: majinghe11
with
with 關鍵字可以控制變量的作用域,主要就是用來修改 . 作用域的,默認 . 代表全局作用域,with 語句可以修改 . 的含義
# 例子:
# .Values.favorite 是一個 object 類型
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }} # 相當於.Values.favorite.drink
food: {{ .food | upper | quote }}
{{- end }}
toYaml 轉 yaml
將數據轉為yaml格式
spec:
strategy:
{{ toYaml .Values.strategy | indent 4 }}
------------------------------------------------------------------
values.yaml數據:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
------------------------------------------------------------------
渲染效果:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
Values 對象
values 對象的值有四個來源
- chart 包中的 values.yaml 文件
- 父 chart 包的 values.yaml 文件
- 使用 helm install 或者 helm upgrade 的 -f 或者 --values 參數傳入的自定義的 yaml 文件
- 通過 --set 參數傳入的值
cat global.yaml
course: k8s
cat mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
course: {{ .Values.course }}
helm install --name mychart --dry-run --debug -f global.yaml ./mychart/
helm install --name mychart --dry-run --debug --set course="k8s" ./mychart/
# 運行部分結果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
course: k8s
# 編輯 mychart/values.yaml,在最后加入
course:
k8s: klvchen
python: lily
cat mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
k8s: {{ quote .Values.course.k8s }} # quote 叫雙引號
python: {{ .Values.course.python }}
helm install --name mychart --dry-run --debug ./mychart/
# 運行結果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
k8s: "klvchen"
python: lily
管道
k8s: {{ quote .Values.course.k8s }} # 加雙引號
k8s: {{ .Values.course.k8s | upper | quote }} # 大寫字符串加雙引號
k8s: {{ .Values.course.k8s | repeat 3 | quote }} # 加雙引號和重復3次字符串
if/else 條件
if/else 塊是用於在模板中有條件地包含文本塊的方法,條件塊的基本結構
{{ if PIPELINE }}
# Do something
{{ else if OTHER PIPELINE }}
# Do something else
{{ else }}
# Default case
{{ end }}
# 判斷條件,如果值為以下幾種情況,管道的結果為 false:
1. 一個布爾類型的假
2. 一個數字零
3. 一個空的字符串
4. 一個 nil(空或null)
5. 一個空的集合(map, slice, tuple, dict, array)
除了上面的這些情況外,其他所有的條件都為真。
# 例子
cat mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: {{ .Values.hello | default "Hello World" | quote }}
k8s: {{ .Values.course.k8s | upper | quote | repeat 3 }}
python: {{ .Values.course.python | repeat 3 | quote }}
{{ if eq .Values.course.python "django" }}web: true{{ end }}
helm install --name mychart --dry-run --debug ./mychart/
運行部分結果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
k8s: "KLVCHEN""KLVCHEN""KLVCHEN"
python: "djangodjangodjango"
web: true
# 空格控制
{{- if eq .Values.course.python "django" }}
web: true
{{- end }}
With 關鍵字
with 關鍵字可以控制變量的作用域
{{ .Release.xxx }} 其中的.就是表示對當前范圍的引用,.Values就是告訴模板在當前范圍中查找Values對象的值。
with 語句可以允許將當前范圍 . 設置為特定的對象,比如我們前面一直使用的 .Values.course,我們可以
使用 with 來將范圍指向 .Values.course:(templates/configmap.yaml)
with主要就是用來修改 . 作用域的,默認 . 代表全局作用域,with語句可以修改.的含義.
語法:
{{ with 引用的對象 }}
這里可以使用 . (點), 直接引用with指定的對象
{{ end }}
例子:
#.Values.favorite是一個object類型
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }} #相當於.Values.favorite.drink
food: {{ .food | upper | quote }}
{{- end }}
range 關鍵字
range主要用於循環遍歷數組類型。
語法1:
# 遍歷map類型,用於遍歷鍵值對象
# 變量key代表對象的屬性名,val代表屬性值
{{- range key,val := 鍵值對象 }}
{{ $key }}: {{ $val | quote }}
{{- end}}
語法2:
{{- range 數組 }}
{{ . | title | quote }} # . (點),引用數組元素值。
{{- end }}
例子:
# values.yaml定義
# map類型
favorite:
drink: coffee
food: pizza
# 數組類型
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
# map類型遍歷例子:
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end}}
# 數組類型遍歷例子:
{{- range .Values.pizzaToppings}}
{{ . | quote }}
{{- end}}
