kubernetes(k8s)helm模板之內(nèi)置函數(shù)和values

定義 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ì)象的使用方法呻畸,并用它們將信息注入到了模板之中移盆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伤为,隨后出現(xiàn)的幾起案子咒循,更是在濱河造成了極大的恐慌,老刑警劉巖绞愚,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叙甸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡位衩,警方通過(guò)查閱死者的電腦和手機(jī)裆蒸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糖驴,“玉大人光戈,你說(shuō)我怎么就攤上這事哪痰。” “怎么了久妆?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵晌杰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我筷弦,道長(zhǎng)肋演,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任烂琴,我火速辦了婚禮爹殊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奸绷。我一直安慰自己梗夸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布号醉。 她就那樣靜靜地躺著反症,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畔派。 梳的紋絲不亂的頭發(fā)上铅碍,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音线椰,去河邊找鬼胞谈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憨愉,可吹牛的內(nèi)容都是我干的烦绳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼配紫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼径密!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起笨蚁,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趟庄,沒(méi)想到半個(gè)月后括细,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戚啥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年奋单,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猫十。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡览濒,死狀恐怖呆盖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贷笛,我是刑警寧澤应又,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站乏苦,受9級(jí)特大地震影響株扛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汇荐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一洞就、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掀淘,春花似錦旬蟋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至稠腊,卻和暖如春躁染,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背架忌。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工吞彤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叹放。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓饰恕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親井仰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埋嵌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容