文章目錄
- 1. 定義 chart
- 2. 建立模闆
- 3. 添加一個簡單的模闆
- 4. 調試
- 5. 内置對象
1. 定義 chart
Helm 的 github 上面有一個比較完整的文檔,一個 chart 包就是一個檔案夾的集合,檔案夾名稱就是 chart 包的名稱,比如建立一個
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
templates 目錄下面的檔案:
-
:chart 的 “幫助文本”。這會在使用者運作NOTES.txt
時顯示給使用者。helm install
-
:建立deployment.yaml
的基本Kubernetes deployment
manifest
-
:為service.yaml
建立deployment
的基本service
manifest
-
: 建立ingress.yaml
對象的資源清單檔案ingress
-
:放置模闆助手的地方,可以在整個 chart 中重複使用_helpers.tpl
然後我們把 templates 目錄下面所有檔案全部删除掉,這裡我們自己來建立模闆檔案:
$ rm -rf mychart/templates/*.*
2. 建立模闆
這裡我們來建立一個非常簡單的模闆 ConfigMap,在 templates 目錄下面建立一個
configmap.yaml
檔案:
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
實際上現在我們就有一個可安裝的 chart 包了,通過
helm install
指令來進行安裝:
$ 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
資源對象已經建立了。然後使用如下指令我們可以看到實際的模闆被渲染過後的資源檔案:
$ helm get manifest ringed-lynx
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
現在我們看到上面的
ConfigMap
檔案是不是正是我們前面在模闆檔案中設計的,現在我們删除目前的
release
:
$ helm delete ringed-lynx
release "ringed-lynx" deleted
3. 添加一個簡單的模闆
我們可以看到上面我們定義的 ConfigMap 的名字是固定的,但往往這并不是一種很好的做法,我們可以通過插入 release 的名稱來生成資源的名稱,比如這裡 ConfigMap 的名稱我們希望是:
ringed-lynx-configmap
,這就需要用到 Chart 的模闆定義方法了。
Helm Chart 模闆使用的是Go語言模闆編寫而成,并添加了Sprig庫中的50多個附件模闆函數以及一些其他特殊的函。
需要注意的是kubernetes資源對象的 和
labels
定義被限制 63個字元,是以需要注意名稱的定義。
name
現在我們來重新定義下上面的
configmap.yaml
檔案:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
我們将名稱替換成了
{{ .Release.Name }}-configmap
,其中包含在{{和}}之中的就是模闆指令,
{{ .Release.Name }}
将
release
的名稱注入到模闆中來,這樣最終生成的 ConfigMap 名稱就是以
release
的名稱開頭的了。這裡的 Release 模闆對象屬于 Helm 内置的一種對象,還有其他很多内置的對象,稍後我們将接觸到。
現在我們來重新安裝我們的 Chart 包,注意觀察
ConfigMap
資源對象的名稱:
$ 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
可以看到現在生成的名稱變成了
quoting-zebra-configmap
,證明已經生效了,當然我們也可以使用指令
helm get manifest quoting-zebra
檢視最終生成的清單檔案的樣子。
4. 調試
我們用模闆來生成資源檔案的清單,但是如果我們想要調試就非常不友善了,不可能我們每次都去部署一個
release
執行個體來校驗模闆是否正确,所幸的時 Helm 為我們提供了
--dry-run --debug
這個可選參數,在執行
helm install
的時候帶上這兩個參數就可以把對應的
values
值和生成的最終的資源清單檔案列印出來,而不會真正的去部署一個release執行個體,比如我們來調試上面建立的 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"
現在我們使用
--dry-run
就可以很容易地測試代碼了,不需要每次都去安裝一個
release
執行個體了,但是要注意的是這不能確定 Kubernetes 本身就一定會接受生成的模闆,在調試完成後,還是需要去安裝一個實際的 release 執行個體來進行驗證的。
5. 内置對象
剛剛我們使用
{{.Release.Name}}
将 release 的名稱插入到模闆中。這裡的 Release 就是 Helm 的内置對象,下面是一些常用的内置對象,在需要的時候直接使用就可以:
Release
:這個對象描述了 release 本身。它裡面有幾個對象:
-
:release 名稱Release.Name
-
:release 的時間Release.Time
-
:release 的Release.Namespace
(如果清單未覆寫)namespace
-
:release 服務的名稱(始終是 Tiller)。Release.Service
-
:此Release.Revision
的修訂版本号,從1開始累加。release
-
:如果目前操作是更新或復原,則将其設定為Release.IsUpgrade
。true
-
:如果目前操作是安裝,則設定為Release.IsInstall
。true
Values
:從
values.yaml
檔案和使用者提供的檔案傳入模闆的值。預設情況下,Values 是空的。
Chart
:
Chart.yaml
檔案的内容。所有的 Chart 對象都将從該檔案中擷取。
Files
:這提供對 chart 中所有非特殊檔案的通路。雖然無法使用它來通路模闆,但可以使用它來通路 chart 中的其他檔案。請參閱 “通路檔案” 部分。
-
是一個按名稱擷取檔案的函數(Files.Get
).Files.Get config.ini
-
是将檔案内容作為位元組數組而不是字元串擷取的函數。這對于像圖檔這樣的東西很有用。Files.GetBytes
Capabilities
:這提供了關于 Kubernetes 叢集支援的功能的資訊。
-
是一組版本資訊。Capabilities.APIVersions
-
提供了查找 Kubernetes版本的方法。它具有以下值:Capabilities.KubeVersion
,Major
,Minor
,GitVersion
,GitCommit
,GitTreeState
,BuildDate
,GoVersion
,和Compiler
。Platform
-
提供了查找Capabilities.TillerVersion
版本的方法。它具有以下值:Tiller
,SemVer
,和GitCommit
GitTreeState
。
Capabilities.APIVersions.Has $version
訓示叢集上是否有可用的版本(例如batch/v1)或資源(例如)。apps/v1/Deployment
并且Capabilities.KubeVersion
Capabilities.KubeVersion.Version
是 Kubernetes 版本。
Capabilities.KubeVersion.Major
是 Kubernetes 的主要版本。
Capabilities.KubeVersion.Minor
是 Kubernetes 次要版本。
是包含 Helm 版本詳細資訊的對象,它是相同的輸出hCapabilities.HelmVersion
elm version
Capabilities.HelmVersion.Version
是 semver 格式的目前 Helm 版本。
Capabilities.HelmVersion.GitCommit
是 Helm git sha1。
Capabilities.HelmVersion.GitTreeState
是 Helm git 樹的狀态。
是使用的 Go 編譯器的版本。Capabilities.HelmVersion.GoVersion
Template
:包含有關正在執行的目前模闆的資訊
-
: 目前模闆的命名空間檔案路徑(例如Template.Name
)mychart/templates/mytemplate.yaml
-
: 目前圖表的模闆目錄的命名空間路徑(例如Template.BasePath
)mychart/templates
上面這些值可用于任何頂級模闆,要注意内置值始終以大寫字母開頭。這也符合Go的命名約定。當你建立自己的名字時,你可以自由地使用适合你的團隊的慣例。