參考網址: https://docs.helm.sh/chart_template_guide/#the-chart-template-developer-s-guide
helm 模板
helm模板語法嵌套在{{和}}之間,有三個常見的
.Values.*
從value.yaml文件中讀取
.Release.*
從運行Release的元數據讀取
.Template.*
.Chart.*
從Chart.yaml文件中讀取
.Files.*
.Capabilities.*
可以通過命令
helm install --debug --dry-run ./mychart
獲取helm渲染后的k8s可執行的yaml文件(只渲染不運行)。
.Values.*的值可以來自以下
+ values.yaml文件
+ 如果是子chart,值來自父chart的values.yaml
+ 通過helm install -f標志的文件
+ 來自–set中的配置
順序查找,下面找到的覆蓋上面找到的值。
模板函數和管道
quote是最常用的模板函數,它能把ABC轉化為“ABC”。它帶一個參數
{{ quote .Values.favorite.drink }}
| 管道,類似linux下的管道。
{{ quote .Values.favorite.drink }} 與 {{ .Values.favorite.drink | quote }} 效果一樣。
default 模板函數
制定默認值
drink: {{ .Values.favorite.drink | default “tea” | quote }}
如果在values中無法找到favorite.drink,則配置為“tea”。
indent 模板函數
對左空出空格
例如
data: myvalue: "Hello World" {{ include "mychart_app" . | indent 2 }}
會使渲染后的取值於左邊空出兩個空格,以符合yaml語法。
模板流程控制
模板中控制流程語句可以控制值的生成
常用的有
+ if/else 條件控制
+ with 范圍控制
+ range 循環控制
此外,模板中還可以定義變量
values.yaml
favorite: drink: coffee food: pizza
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" {{- range $key, $val := .Values.favorite }} {{ $key }}: {{ $val | quote }} {{- end}}
定義了key和key和val兩個變量,並且賦值。渲染后
apiVersion: v1 kind: ConfigMap metadata: name: eager-rabbit-configmap data: myvalue: "Hello World" drink: "coffee" food: "pizza"
命名模板使用
一般在template文件夾下的_helpers.tpl中定義命名模板。
通過define 函數定義命名模板
template使用命名模板
例如,在_helpers.tpl中定義命名模板
{{/* Generate basic labels */}} {{- define "my_labels" }} labels: generator: helm date: {{ now | htmlDate }} chart: {{ .Chart.Name }} version: {{ .Chart.Version }} {{- end }}
第一行為描述命名模板{{/* Generate basic labels */}}。
使用命名模板
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap {{- template "my_labels" . }}
渲染后為
apiVersion: v1 kind: ConfigMap metadata: name: plinking-anaco-configmap labels: generator: helm date: 2016-11-02 chart: mychart version: 0.1.0
在模板中使用文件
基本使用
例如,在chart的根目錄下有三個文件
config1.toml:
message = Hello from config 1
config2.toml:
message = This is config 2
config3.toml:
message = Goodbye from config 3
在模板文件中使用
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: {{- $files := .Files }} {{- range tuple "config1.toml" "config2.toml" "config3.toml" }} {{ . }}: |- {{ $files.Get . }} {{- end }}
files變量賦值為.Files對象,通過files變量賦值為.Files對象,通過files.Get 獲取文件內容。
apiVersion: v1 kind: ConfigMap metadata: name: quieting-giraf-configmap data: config1.toml: |- message = Hello from config 1 config2.toml: |- message = This is config 2 config3.toml: |- message = Goodbye from config 3
上面的用法對於單行文件在configmap中使用有效,但是對於文件內容較多,則使用另一種方法(不過文件內容不能超過1M,因為整個chart包傳入tiller限制存儲為1M)。
apiVersion: v1 kind: ConfigMap metadata: name: conf data: {{ (.Files.Glob "foo/*").AsConfig | indent 2 }} --- apiVersion: v1 kind: Secret metadata: name: very-secret type: Opaque data: {{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}
上面模板文件中查找chart根目錄下foo目錄的所有文件配置為configmap的內容。bar目錄下所有文件配置為sectet的內容。
子chart和全局values
子chart是父chart依賴的chart,父chart在根目錄的requirements.yaml中聲明依賴的子chart,並且在charts目錄中存放子chart。
1. 子chart不能訪問父chart的values
2. 父chart可以覆蓋子chart的values
3. helm中可以定義global values被所有charts使用
4. 父chart和子chart可以共享模板函數,定義在任何地方的自定義模板函數可以被所有的chart使用。
global values聲明與使用
mychart/values.yaml
favorite: drink: coffee food: pizza mysubchart: dessert: ice cream global: salad: caesar
在global下定義即可
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: salad: {{ .Values.global.salad }}