天天看點

Helm chart 内置函數

文章目錄

  • ​​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 目錄下面的檔案:

  • ​NOTES.txt​

    ​​:chart 的 “幫助文本”。這會在使用者運作​

    ​helm install​

    ​ 時顯示給使用者。
  • ​deployment.yaml​

    ​​:建立​

    ​Kubernetes deployment​

    ​​ 的基本​

    ​manifest​

  • ​service.yaml​

    ​​:為​

    ​deployment​

    ​​ 建立​

    ​service​

    ​​ 的基本​

    ​manifest​

  • ​ingress.yaml​

    ​​: 建立​

    ​ingress​

    ​ 對象的資源清單檔案
  • ​_helpers.tpl​

    ​:放置模闆助手的地方,可以在整個 chart 中重複使用

然後我們把 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​

​​ 和 ​

​name​

​ 定義被限制 63個字元,是以需要注意名稱的定義。

現在我們來重新定義下上面的 ​

​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.Name​

    ​:release 名稱
  • ​Release.Time​

    ​:release 的時間
  • ​Release.Namespace​

    ​​:release 的​

    ​namespace​

    ​(如果清單未覆寫)
  • ​Release.Service​

    ​:release 服務的名稱(始終是 Tiller)。
  • ​Release.Revision​

    ​​:此​

    ​release​

    ​ 的修訂版本号,從1開始累加。
  • ​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​

    ​ 是一組版本資訊。
  • ​Capabilities.KubeVersion​

    ​​ 提供了查找 Kubernetes版本的方法。它具有以下值:​

    ​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 次要版本。

    ​​

    ​Capabilities.HelmVersion​

    ​​是包含 Helm 版本詳細資訊的對象,它是相同的輸出h​

    ​elm version​

    ​​

    ​Capabilities.HelmVersion.Version​

    ​是 semver 格式的目前 Helm 版本。

    ​Capabilities.HelmVersion.GitCommit​

    ​是 Helm git sha1。

    ​Capabilities.HelmVersion.GitTreeState​

    ​是 Helm git 樹的狀态。

    ​Capabilities.HelmVersion.GoVersion​

    ​是使用的 Go 編譯器的版本。

​Template​

​:包含有關正在執行的目前模闆的資訊

  • ​Template.Name​

    ​​: 目前模闆的命名空間檔案路徑(例如​

    ​mychart/templates/mytemplate.yaml​

    ​)
  • ​Template.BasePath​

    ​​: 目前圖表的模闆目錄的命名空間路徑(例如​

    ​mychart/templates​

    ​)

上面這些值可用于任何頂級模闆,要注意内置值始終以大寫字母開頭。這也符合Go的命名約定。當你建立自己的名字時,你可以自由地使用适合你的團隊的慣例。