Helm 通過模板創建 Kubernetes 能夠理解的 YAML 格式的資源配置文件,我們將通過例子來學習如何使用模板。
以 templates/secrets.yaml
爲例:
從結構看,文件的內容非常像 Secret 配置,只是大部分屬性值變成了{{
xxx }}
。這些 {{
xxx }}
實際上是模板的語法。Helm 採用了 Go 語言的模板來編寫 chart。Go 模板非常強大,支持變量、對象、函數、流控制等功能。下面我們通過解析 templates/secrets.yaml
快速學習模板。
① {{
template "mysql.fullname" . }}
定義 Secret 的 name
。
關鍵字 template
的作用是引用一個子模板 mysql.fullname
。這個子模板是在 templates/_helpers.tpl
文件中定義的。
這個定義還是很複雜的,因爲它用到了模板語言中的對象、函數、流控制等概念。現在看不懂沒關係,這裏我們學習的重點是:如果存在一些信息多個模板都會用到,則可在 templates/_helpers.tpl
中將其定義爲子模板,然後通過 templates
函數引用。
這裏 mysql.fullname
是由
release 與 chart 二者名字拼接組成。
根據 chart 的最佳實踐,所有資源的名稱都應該保持一致,對於我們這個 chart,無論 Secret 還是 Deployment、PersistentVolumeClaim、Service,它們的名字都是子模板 mysql.fullname
的值。
② Chart
和 Release
是
Helm 預定義的對象,每個對象都有自己的屬性,可以在模板中使用。如果使用下面命令安裝 chart:
helm install stable/mysql -n my
那麼:{{ .Chart.Name }}
的值爲 mysql
。{{ .Chart.Version }}
的值爲 0.3.0
。{{ .Release.Name }}
的值爲 my
。{{ .Release.Service }}
始終取值爲 Tiller
。{{ template "mysql.fullname"
. }}
計算結果爲 my-mysql
。
③ 這裏指定 mysql-root-password
的值,不過使用了 if-else
的流控制,其邏輯爲:
如果 .Values.mysqlRootPassword
有值,則對其進行
base64 編碼;否則隨機生成一個 10 位的字符串並編碼。
Values
也是預定義的對象,代表的是 values.yaml
文件。而 .Values.mysqlRootPassword
則是 values.yaml
中定義的 mysqlRootPassword
參數:
因爲 mysqlRootPassword
被註釋掉了,沒有賦值,所以邏輯判斷會走 else
,即隨機生成密碼。
randAlphaNum
、b64enc
、quote
都是
Go 模板語言支持的函數,函數之間可以通過管道 |
連接。{{
randAlphaNum 10 | b64enc | quote }}
的作用是首先隨機產生一個長度爲 10 的字符串,然後將其 base64 編碼,最後兩邊加上雙引號。
templates/secrets.yaml
這個例子展示了
chart 模板主要的功能,我們最大的收穫應該是:模板將 chart 參數化了,通過 values.yaml
可以靈活定製應用。
無論多複雜的應用,用戶都可以用 Go 模板語言編寫出 chart。無非是使用到更多的函數、對象和流控制。對於初學者,我的建議是儘量參考官方的 chart。根據二八定律,這些 chart 已經覆蓋了絕大部分情況,而且採用了最佳實踐。如何遇到不懂的函數、對象和其他語法,可參考官網文檔 https://docs.helm.sh
有了上面 chart 結構和模板的知識後,下節我們將重新實踐一次 MySQL chart,相信會有更多收穫。
書籍:
1.《每天5分鐘玩轉Kubernetes》
https://item.jd.com/26225745440.html
2.《每天5分鐘玩轉Docker容器技術》
https://item.jd.com/16936307278.html
3.《每天5分鐘玩轉OpenStack》
https://item.jd.com/12086376.html