當我們安裝好helm之后我們可以開始自定義chart,那么我們需要先創建出一個模板如下:
helm create myapp
之后我們可以一下目錄結構,目錄的作用我簡要介紹一下:
templates/ 目錄包括了模板文件。當Helm評估chart時,會通過模板渲染引擎將所有文件發送到templates/目錄中。 然后收集模板的結果並發送給Kubernetes。
- _helpers.tpl里面的內容是定義模板用的,所有模板都可以再這里定義,然后再任何yaml文件當中都可以調用這個文件下的模板
NOTES.txt: chart的"幫助文本"。這會在你的用戶執行helm install時展示給他們。deployment.yaml: 創建Kubernetes 工作負載的基本清單service.yaml: 為你的工作負載創建一個 service終端基本清單。_helpers.tpl: 放置可以通過chart復用的模板輔助對象
values.yaml 文件也導入到了模板。這個文件包含了chart的 默認值 。這些值會在用戶執行helm install 或 helm upgrade時被覆蓋。
Chart.yaml 文件包含了該chart的描述。你可以從模板中訪問它。charts/目錄 可以 包含其他的chart(稱之為 子chart)。 指南稍后我們會看到當涉及模板渲染時這些是如何工作的。
$tree myapp/ myapp/ ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml 3 directories, 10 files
現在展示一下我所創建的chart為例
$tree myapp/ myapp/ ├── charts ├── Chart.yaml ├── templates │ ├── configmap.yaml │ └── _helpers.tpl ├── test.yaml ├── values.yaml └── values.yaml.bak 2 directories, 7 files
其中我修改過的內容如下:
$cat values.yaml favorite: drink: coffee food: pizza pizzaToppings: - mushrooms - cheese - peppers - onions
$cat templates/configmap.yaml {{ $release := "ok" }} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap labels: {{- include "mychart.labels" . | indent 8 }} data: myvalue: "Hello World" {{- with .Values.favorite }} drink: {{ .drink }} food: {{ .food }} release: {{ $release }} {{- end }} {{- if eq .Values.favorite.drink "coffee" }} mug: true {{- end }} toppings: |- {{- range $.Values.pizzaToppings }} -{{ . | title | quote }} {{- end }} size: |- {{- range $index,$name := tuple "small" "medium" "large" }} {{ $index }}: {{ $name }} {{- end }}
$cat templates/_helpers.tpl {{/* Generate basic labels */}} {{- define "mychart.labels" }} generator: helm date: {{ now | htmlDate }} chart: {{ .Chart.Name }} version: {{ .Chart.Version }} {{- end }}
上述所需要的技術點:
設置自定義變量
{{ $release := "ok" }}
引用內部變量,其中.就是當前作用域的變量,Release.Name為helm install的名字
name: {{ .Release.Name }}-configmap
引用模板,其中{{-代表去除前面的空格-}}代表去除后面的空格,include代表引用模板,mychart.labels為引用模板的內容(內容再_helpers.tpl中),后面的.代表全局作用域,否則_helpers中的有些內容將獲取不到,管道符|代表把前面的內容賦予給管道符,然后縮進8個空格
{{- include "mychart.labels" . | indent 8 }}
with代表循環,循環的只為values.yam文件中的內容,注意,必須為大寫Values,{{.drink}}為所循環出來的下一級,也就是values.yaml下的favorite下的drink字段,其實也可以循環tuple等類型
{{- with .Values.favorite }}
drink: {{ .drink }}
food: {{ .food }}
release: {{ $release }}
{{- end }}
if判斷語句,eq代表等於(還有ge,lt,ne等),那么下面的意思是如果values.yaml文件中favorite下的drink內容為coffee,那么就添加一個mug:true字段
{{- if eq .Values.favorite.drink "coffee" }}
mug: true
{{- end }}
range也代表循環,$代表頂級作用域,意思是說不管再那個作用域,只要出現$都可以調用頂級的變量,那么循環的內容也再_helpers.tpl文件中,.代表循環出來的單個內容然后給title處理變成抬頭,再給quote函數處理,quote代表字符串化
toppings: |- {{- range $.Values.pizzaToppings }} -{{ . | title | quote }} {{- end }}
對於range也可以循環tuple等類型,如下,其中$index代表索引,$name代表循環tuple的具體內容
size: |- {{- range $index,$name := tuple "small" "medium" "large" }} {{ $index }}: {{ $name }} {{- end }}
對於_helpers.tpl內容解釋如下,{{/* */}}代表注釋,{{- define代表定義一個模板,后面跟着模板名字,其中.Chart代表調用Chart.yaml文件的內容
{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
generator: helm
date: {{ now | htmlDate }}
chart: {{ .Chart.Name }}
version: {{ .Chart.Version }}
{{- end }}
以上內容執行后如下:可以跟着文件對照一下結果
$helm install mytest ../myapp/ --dry-run --debug install.go:173: [debug] Original chart version: "" install.go:190: [debug] CHART PATH: /home/admin/myapp NAME: mytest LAST DEPLOYED: Thu Jun 10 19:08:17 2021 NAMESPACE: default STATUS: pending-install REVISION: 1 TEST SUITE: None USER-SUPPLIED VALUES: {} COMPUTED VALUES: favorite: drink: coffee food: pizza pizzaToppings: - mushrooms - cheese - peppers - onions HOOKS: MANIFEST: --- # Source: myapp/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mytest-configmap labels: generator: helm date: 2021-06-10 chart: myapp version: 0.1.0 data: myvalue: "Hello World" drink: coffee food: pizza release: ok mug: true toppings: |- -"Mushrooms" -"Cheese" -"Peppers" -"Onions" size: |- 0: small 1: medium 2: large
未完待續...................
