定義 chart
一個(gè) chart 包就是一個(gè)文件夾的集合舆绎,文件夾名稱就是 chart 包的名稱萄唇,比如創(chuàng)建一個(gè) mychart 的 chart 包:
$ helm create mychart
Creating mychart
$ tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ └── service.yaml
└── values.yaml
2 directories, 7 files
chart 包templates 目錄下面的文件:
- NOTES.txt:chart 的 “幫助文本”篙议。這會(huì)在用戶運(yùn)行 helm install 時(shí)顯示給用戶
- deployment.yaml:創(chuàng)建 Kubernetes deployment 的基本 manifest
- service.yaml:為 deployment 創(chuàng)建 service 的基本 manifest
- ingress.yaml: 創(chuàng)建 ingress 對(duì)象的資源清單文件
- _helpers.tpl:放置模板助手的地方炸宵,可以在整個(gè) chart 中重復(fù)使用
這里我們明白每一個(gè)文件是干嘛的就行函卒,然后把 templates 目錄下面所有文件全部刪除掉嚎于,這里我們自己來(lái)創(chuàng)建模板文件:
$ rm -rf mychart/templates/*.*
創(chuàng)建模板
這里我們來(lái)創(chuàng)建一個(gè)非常簡(jiǎn)單的模板 ConfigMap击孩,在 templates 目錄下面新建一個(gè)configmap.yaml文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
實(shí)際上現(xiàn)在我們就有一個(gè)可安裝的 chart 包了迫悠,通過(guò)helm install命令來(lái)進(jìn)行安裝:
$ helm install ./mychart/
NAME: ringed-lynx
LAST DEPLOYED: Fri Sep 7 22:59:22 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/ConfigMap
NAME DATA AGE
mychart-configmap 1 0s
在上面的輸出中,我們可以看到我們的 ConfigMap 資源對(duì)象已經(jīng)創(chuàng)建了巩梢。然后使用如下命令我們可以看到實(shí)際的模板被渲染過(guò)后的資源文件:
$ helm get manifest ringed-lynx
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
現(xiàn)在我們看到上面的 ConfigMap 文件是不是正是我們前面在模板文件中設(shè)計(jì)的创泄,現(xiàn)在我們刪除當(dāng)前的release:
$ helm delete ringed-lynx
release "ringed-lynx" deleted
添加一個(gè)簡(jiǎn)單的模板
我們可以看到上面我們定義的 ConfigMap 的名字是固定的,但往往這并不是一種很好的做法括蝠,我們可以通過(guò)插入 release 的名稱來(lái)生成資源的名稱鞠抑,比如這里 ConfigMap 的名稱我們希望是:ringed-lynx-configmap,這就需要用到 Chart 的模板定義方法了忌警。
Helm Chart 模板使用的是Go
語(yǔ)言模板編寫而成搁拙,并添加了Sprig
庫(kù)中的50多個(gè)附件模板函數(shù)以及一些其他特殊的函。
需要注意的是
kubernetes
資源對(duì)象的 labels 和 name 定義被限制 63個(gè)字符法绵,所以需要注意名稱的定義箕速。
現(xiàn)在我們來(lái)重新定義下上面的 configmap.yaml 文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
我們將名稱替換成了{{ .Release.Name }}-configmap
,其中包含在{{
和}}
之中的就是模板指令朋譬,{{ .Release.Name }}
將 release 的名稱注入到模板中來(lái)盐茎,這樣最終生成的 ConfigMap 名稱就是以 release 的名稱開頭的了。這里的 Release 模板對(duì)象屬于 Helm 內(nèi)置的一種對(duì)象徙赢,還有其他很多內(nèi)置的對(duì)象字柠,稍后我們將接觸到。
現(xiàn)在我們來(lái)重新安裝我們的 Chart 包狡赐,注意觀察 ConfigMap 資源對(duì)象的名稱:
$ helm install ./mychart
helm install ./mychart/
NAME: quoting-zebra
LAST DEPLOYED: Fri Sep 7 23:20:12 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/ConfigMap
NAME DATA AGE
quoting-zebra-configmap 1 0s
可以看到現(xiàn)在生成的名稱變成了quoting-zebra-configmap窑业,證明已經(jīng)生效了,當(dāng)然我們也可以使用命令helm get manifest quoting-zebra
查看最終生成的清單文件的樣子枕屉。
調(diào)試
Helm 提供了--dry-run --debug這個(gè)參數(shù)常柄,在執(zhí)行helm install的時(shí)候帶上這兩個(gè)參數(shù)就可以把對(duì)應(yīng)的 values 值和生成的最終的資源清單文件打印出來(lái),而不會(huì)真正的去部署一個(gè)release實(shí)例搀擂,比如我們來(lái)調(diào)試上面創(chuàng)建的 chart 包:
$ helm install . --dry-run --debug ./mychart
[debug] Created tunnel using local port: '35286'
[debug] SERVER: "127.0.0.1:35286"
[debug] Original chart version: ""
[debug] CHART PATH: /root/course/kubeadm/helm/mychart
NAME: wrapping-bunny
REVISION: 1
RELEASED: Fri Sep 7 23:23:09 2018
CHART: mychart-0.1.0
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
...
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: wrapping-bunny-configmap
data:
myvalue: "Hello World"
現(xiàn)在我們使用--dry-run就可以很容易地測(cè)試代碼了拐纱,不需要每次都去安裝一個(gè) release 實(shí)例了,但是要注意的是這不能確保 Kubernetes 本身就一定會(huì)接受生成的模板哥倔,在調(diào)試完成后秸架,還是需要去安裝一個(gè)實(shí)際的 release 實(shí)例來(lái)進(jìn)行驗(yàn)證的。
內(nèi)置對(duì)象
剛剛我們使用{{.Release.Name}}
將 release 的名稱插入到模板中咆蒿。這里的 Release 就是 Helm 的內(nèi)置對(duì)象东抹,下面是一些常用的內(nèi)置對(duì)象蚂子,在需要的時(shí)候直接使用就可以:
-
Release:這個(gè)對(duì)象描述了 release 本身。它里面有幾個(gè)對(duì)象:
- Release.Name:release 名稱
- Release.Time:release 的時(shí)間
- Release.Namespace:release 的 namespace(如果清單未覆蓋)
- Release.Service:release 服務(wù)的名稱(始終是 Tiller)缭黔。
- Release.Revision:此 release 的修訂版本號(hào)食茎,從1開始累加。
- Release.IsUpgrade:如果當(dāng)前操作是升級(jí)或回滾馏谨,則將其設(shè)置為 true别渔。
- Release.IsInstall:如果當(dāng)前操作是安裝,則設(shè)置為 true惧互。
Values:從
values.yaml
文件和用戶提供的文件傳入模板的值哎媚。默認(rèn)情況下,Values 是空的喊儡。Chart:
Chart.yaml
文件的內(nèi)容拨与。所有的 Chart 對(duì)象都將從該文件中獲取。chart 指南中Charts Guide列出了可用字段艾猜,可以前往查看买喧。-
Files:這提供對(duì) chart 中所有非特殊文件的訪問(wèn)。雖然無(wú)法使用它來(lái)訪問(wèn)模板匆赃,但可以使用它來(lái)訪問(wèn) chart 中的其他文件淤毛。請(qǐng)參閱 "訪問(wèn)文件" 部分。
- Files.Get 是一個(gè)按名稱獲取文件的函數(shù)(.Files.Get config.ini)
- Files.GetBytes 是將文件內(nèi)容作為字節(jié)數(shù)組而不是字符串獲取的函數(shù)算柳。這對(duì)于像圖片這樣的東西很有用钱床。
-
Capabilities:這提供了關(guān)于 Kubernetes 集群支持的功能的信息。
- Capabilities.APIVersions 是一組版本信息埠居。
- Capabilities.APIVersions.Has $version 指示是否在群集上啟用版本(batch/v1)。
- Capabilities.KubeVersion 提供了查找 Kubernetes 版本的方法事期。它具有以下值:Major滥壕,Minor,GitVersion兽泣,GitCommit绎橘,GitTreeState,BuildDate唠倦,GoVersion称鳞,Compiler,和 Platform稠鼻。
- Capabilities.TillerVersion 提供了查找 Tiller 版本的方法冈止。它具有以下值:SemVer,GitCommit候齿,和 GitTreeState熙暴。
Template:包含有關(guān)正在執(zhí)行的當(dāng)前模板的信息
Name:到當(dāng)前模板的文件路徑(例如 mychart/templates/mytemplate.yaml)
BasePath:當(dāng)前 chart 模板目錄的路徑(例如 mychart/templates)闺属。
上面這些值可用于任何頂級(jí)模板,要注意內(nèi)置值始終以大寫字母開頭周霉。這也符合Go
的命名約定掂器。當(dāng)你創(chuàng)建自己的名字時(shí),你可以自由地使用適合你的團(tuán)隊(duì)的慣例俱箱。
values 文件
上面的內(nèi)置對(duì)象中有一個(gè)對(duì)象就是 Values国瓮,該對(duì)象提供對(duì)傳入 chart 的值的訪問(wèn),Values 對(duì)象的值有4個(gè)來(lái)源:
chart 包中的 values.yaml 文件
父 chart 包的 values.yaml 文件
通過(guò) helm install 或者 helm upgrade 的-f或者--values參數(shù)傳入的自定義的 yaml 文件(上節(jié)課我們已經(jīng)學(xué)習(xí)過(guò))
通過(guò)--set 參數(shù)傳入的值
chart 的 values.yaml 提供的值可以被用戶提供的 values 文件覆蓋狞谱,而該文件同樣可以被--set提供的參數(shù)所覆蓋乃摹。
這里我們來(lái)重新編輯 mychart/values.yaml 文件,將默認(rèn)的值全部清空芋簿,添加一個(gè)新的數(shù)據(jù):(values.yaml)
course: k8s
然后我們?cè)谏厦娴?templates/configmap.yaml 模板文件中就可以使用這個(gè)值了:(configmap.yaml)
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
course: {{ .Values.course }}
可以看到最后一行我們是通過(guò){{ .Values.course }}來(lái)獲取 course 的值的∠啃福現(xiàn)在我們用 debug 模式來(lái)查看下我們的模板會(huì)被如何渲染:
$ helm install --dry-run --debug ./mychart
helm install --dry-run --debug .
[debug] Created tunnel using local port: '33509'
[debug] SERVER: "127.0.0.1:33509"
[debug] Original chart version: ""
[debug] CHART PATH: /root/course/kubeadm/helm/mychart
NAME: nasal-anaconda
REVISION: 1
RELEASED: Sun Sep 9 17:37:52 2018
CHART: mychart-0.1.0
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
course: k8s
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nasal-anaconda-configmap
data:
myvalue: "Hello World"
course: k8s
我們可以看到 ConfigMap 中 course 的值被渲染成了 k8s,這是因?yàn)樵谀J(rèn)的 values.yaml 文件中該參數(shù)值為 k8s与斤,同樣的我們可以通過(guò)--set參數(shù)來(lái)輕松的覆蓋 course 的值:
$ helm install --dry-run --debug --set course=python ./mychart
[debug] Created tunnel using local port: '44571'
......
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: named-scorpion-configmap
data:
myvalue: "Hello World"
course: python
由于--set 比默認(rèn) values.yaml 文件具有更高的優(yōu)先級(jí)肪康,所以我們的模板生成為 course: python。
values 文件也可以包含更多結(jié)構(gòu)化內(nèi)容撩穿,例如磷支,我們?cè)?values.yaml 文件中可以創(chuàng)建 course 部分,然后在其中添加幾個(gè)鍵:
course:
k8s: devops
python: django
現(xiàn)在我們稍微修改模板:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
k8s: {{ .Values.course.k8s }}
python: {{ .Values.course.python }}
同樣可以使用 debug 模式查看渲染結(jié)果:
$ helm install --dry-run --debug ./mychart
[debug] Created tunnel using local port: '33801'
......
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: exhaling-turtle-configmap
data:
myvalue: "Hello World"
k8s: devops
python: django
可以看到模板中的參數(shù)已經(jīng)被 values.yaml 文件中的值給替換掉了食寡。雖然以這種方式構(gòu)建數(shù)據(jù)是可以的雾狈,但我們還是建議保持 value 樹淺一些,平一些抵皱,這樣維護(hù)起來(lái)要簡(jiǎn)單一點(diǎn)善榛。
到這里,我們已經(jīng)看到了幾個(gè)內(nèi)置對(duì)象的使用方法呻畸,并用它們將信息注入到了模板之中移盆。