helm在希臘語中的意思是:舵趾盐;駕駛盤
Helm is the best way to find, share, and use software built for Kubernetes
Chart快速開始
三大概念:
1. Chart: 代表一個helm包, 里面會包含k8s上的資源定義活尊。
2.?repo: 遠程倉庫, 遠端存儲chart捞蛋。 同時helm是支持本地存儲chart的著榴。
3. Release: release代表一個正在運行的k8s上的chart實例, 一個chart可以在集群上安裝多次, 每次都會產(chǎn)生一個release
Helm運行流程
1. 從chart倉庫中獲取chart啤挎;
2. 使用者配置自己的values文件,根據(jù)自己的運行環(huán)境對values進行修改炭玫;
3. 默認values文件和使用者values文件會進行一個merge奈嘿,形成最終的values文件;
4. 使用最終的values文件吞加,渲染chart的template裙犹,形成可以被kubernetes執(zhí)行的yaml;
5. 調(diào)用kube apply提交yaml到kubernetes
Chart相關(guān)知識點梳理
1. chart開發(fā)
2. chart hooks: 在部署流程中hook一部分操作,? 改變install榴鼎、rollback伯诬、upgrade晚唇、uninstall等的執(zhí)行動作
3. chart test
4. library chart
5. chart校驗
6. OCI
7. 保存chart: helm chart save
8. 登錄repo: helm registry login repo_name
9. 高級特性:
? ? a. post rendering:提供在helm install之前對manifest進行操作、配置的一種機制, kustomize使用
chart結(jié)構(gòu)
1. Chart.yaml: chart的信息,包括chart的版本信息绳矩、描述信息危虱、依賴關(guān)系,等?
2. LICENSE: (可選)chart的LICENSE信息?
3. README.md: (可選)chart的說明文件?
4. values.yaml: chart的默認配置信息?
5. values.schema.json: (可選) values配置信息的元信息(字段類型悍及、字段描述闽瓢、字段之間的依賴等),格式j(luò)son?
6. charts: 依賴的其他chart?
7. crds: Custom Resource Definitions?
8. templates: 部署模板心赶,結(jié)合values.yaml會渲染出kubernetes yaml文件?
9. templates/NOTES.txt: (可選)安裝說明
Search
> search for charts
- helm search hub: 去hub上搜其他大佬貢獻的chart
- helm search repo : 從已經(jīng)添加的repo中,? 搜本地chart
Install
> upload the chart to Kubernetes
1. helm install [NAME] [CHART] [flags] 可以使用 `—generate-name` 替換NAME
2. `helm status` 查看release狀態(tài), 頁可以看到配置信息
其他命令
install/upgrade/rollback/uninstall/template 等
安裝前的自定義操作
helm show values [chart name] 可以看chart都支持哪些配置項
—values或者-f制定的yaml文件可以傳遞多個,? 位置越靠后, 優(yōu)先級越大
—setset復(fù)寫的配置會被持久化到config map中扣讼,同時可以使用helm get values <release-name>獲取那些通過set設(shè)置進來的值,想清除通過set進來的值可以在運行helm upgrade 時帶上--reset-values
Helm Chart Template
Charts結(jié)構(gòu)
mychart/
? Chart.yaml # 包含了chart的描述, 可以從模板中訪問,? charts木偶路可以包含其他的chart, 稱之為子chart
? values.yaml # 文件也會導(dǎo)入模板,? 包含了chart的默認值
? charts/ # 子chart存放目錄
? templates/ # 包含了模板文件,? 當(dāng)helm評估chart時, 會通過模板渲染引擎將所有文件存放templates目錄中缨叫。然后收集結(jié)果發(fā)送給kubernetes
創(chuàng)建chart
helm create mychart
快速查看mychart/templates
NOTES.txt: chart的"幫助文本"椭符。這會在你的用戶執(zhí)行helm install時展示給他們。
deployment.yaml: 創(chuàng)建Kubernetes工作負載的基本清單
service.yaml: 為你的工作負載創(chuàng)建一個service終端基本清單耻姥。
_helpers.tpl: 放置可以通過chart復(fù)用的模板輔助對象
第一個模板configMap
配置映射只是用于存儲配置數(shù)據(jù)的對象销钝。其他組件,比如pod琐簇,可以訪問配置映射中的數(shù)據(jù)蒸健。
- helm install ym-test .
- helm get manifest ym-test # 查看清單
- kubectl get cm ym-test -oyaml # 查看具體configmap
- helm uninstall ym-test
添加一個簡單的模板調(diào)用
通過插入發(fā)布名稱來生成名稱字段。
結(jié)果
configmap名字已經(jīng)變成 ym-test-configmap
helm install —debug —dry-run test . 測試自己要安裝的helm, 但是不會實際安裝
小tips
1.?用作分割命名空間,? 第一個.代表頂層命名空間。
2. Release為內(nèi)置對象
3. --dry-run會讓你變得更容易測試似忧,但不能保證Kubernetes會接受你生成的模板渣叛。 最好不要僅僅因為--dry-run可以正常運行就覺得chart可以安裝。
內(nèi)置對象
對象可以通過模板引擎?zhèn)鬟f到模板中盯捌。 當(dāng)然你的代碼也可以傳遞對象诗箍。
Release:Release對象描述了版本發(fā)布本身。包含了以下對象:
Release.Name: release名稱
Release.Namespace: 版本中包含的命名空間
Release.IsUpgrade: 如果當(dāng)前操作是升級或回滾的話, true
Release.IsInstall: 如果當(dāng)前操作是安裝的話, true
Release.Revision: 此次修訂的版本號. 安裝是1, 升級和回滾都會自增
Release.Service: 該service用來渲染當(dāng)前模板, helm里始終helm
Values:Values對象是從values.yaml文件和用戶提供的文件傳進模板的, 默認為空挽唉。
Chart:Chart.yaml文件內(nèi)容,? chart.yaml里的所有數(shù)據(jù)在這里都可訪問, 具體屬性見Chart指南
Files: 在chart中提供訪問的所有非特殊文件的對象
你不能使用它訪問Template對象滤祖,只能訪問其他文件。 請查看這個文件訪問部分了解更多信息
Files.Get通過文件名獲取文件的方法瓶籽。 (.Files.Getconfig.ini)
Files.GetBytes用字節(jié)數(shù)組代替字符串獲取文件內(nèi)容的方法匠童。 對圖片之類的文件很有用
Files.Glob用給定的shell glob模式匹配文件名返回文件列表的方法
Files.Lines逐行讀取文件內(nèi)容的方法。迭代文件中每一行時很有用
Files.AsSecrets使用Base 64編碼字符串返回文件體的方法
Files.AsConfig使用YAML格式返回文件體的方法
Capabilities: 提供關(guān)于Kubernetes集群支持功能的信息
Capabilities.APIVersions是一個版本列表
Capabilities.APIVersions.Has $version說明集群中的版本 (比如,batch/v1) 或是資源 (比如,apps/v1/Deployment) 是否可用
Capabilities.KubeVersion和Capabilities.KubeVersion.Version是Kubernetes的版本號
Capabilities.KubeVersion.MajorKubernetes的主版本
Capabilities.KubeVersion.MinorKubernetes的次版本
Capabilities.HelmVersion包含Helm版本詳細信息的對象塑顺,和helm version的輸出一致
Capabilities.HelmVersion.Version是當(dāng)前Helm語義格式的版本
Capabilities.HelmVersion.GitCommitHelm的git sha1值
Capabilities.HelmVersion.GitTreeState是Helm git樹的狀態(tài)
Capabilities.HelmVersion.GoVersion是使用的Go編譯器版本
Template: 包含當(dāng)前被執(zhí)行的當(dāng)前模板信息
Template.Name: 當(dāng)前模板的命名空間文件路徑 (e.g.mychart/templates/mytemplate.yaml)
Template.BasePath: 當(dāng)前chart模板目錄的路徑 (e.g.mychart/templates)
小tips
1. 使用首字母小寫將本地名稱與內(nèi)置對象區(qū)分開
Values文件
values對象內(nèi)容來源
1. chart中的values.yaml
2. 如果是子chart汤求, 就是父chart中的values.yaml文件
3. 使用-f參數(shù)傳遞到helm install 或 helm upgrade 的values文件
4. 使用 —set 傳遞的單個參數(shù)
優(yōu)先級從低到高
實驗舉例
在configmap.yaml中新增drink: {{ .Values.favoriteDrink }}
1. helm install ym-test . —dry-run —debug
2. helm install solid-vulture ./mychart --dry-run --debug --set favoriteDrink=slurm
刪除默認的key
如果需要從默認的value中刪除key, 可以將key設(shè)置為null
1. helm install stable/drupal --set image=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt] --set livenessProbe.httpGet=null
可以生成如下yaml
模板函數(shù)和流水線
我們希望以一種更有用的方式來轉(zhuǎn)換所提供的數(shù)據(jù)。
quote 是一個函數(shù),? .Values.favorite.food 是一個參數(shù)
Helm中有超過60個可用的函數(shù)严拒。 其中有些通過Go模板語言本身定義扬绪。其他大部分都是Sprig 模板庫。我們可以在示例看到其中很多函數(shù)裤唠。
當(dāng)我們討論"Helm模板語言"時挤牛,感覺它是Helm專屬的,實際上他是Go模板語言种蘸、一些額外的函數(shù)和用于 向模板暴露某些對象的裝飾器組合而成的墓赴。很多Go模板的資料也有助于你學(xué)習(xí)模板。
管道符
管道符是按順序完成一系列任務(wù)的方式
apiVersion: v1
kind: ConfigMap
metadata:
? name: {{ .Release.Name }}-configmap
data:
? myvalue: "Hello World"
? drink: {{ .Values.favorite.drink | quote }}
? food: {{ .Values.favorite.food | upper | quote }}
倒置命令是模板中的常見做法航瞭〗胨叮可以經(jīng)常看到.val | quote而不是quote .val刊侯。實際上兩種操作都是可以的章办。
使用default函數(shù)
模板中頻繁使用的一個函數(shù)是default:default DEFAULT_VALUE GIVEN_VALUE。 這個函數(shù)允許你在模板中指定一個默認值滨彻,以防這個值被忽略藕届。
示例如下
? drink: {{ .Values.favorite.drink | default "tea" | quote }}
靜態(tài)默認值應(yīng)該設(shè)置在values.yaml文件中,default命令很適合計算值, 例如
drink: {{ .Values.favorite.drink | default (printf "%s-tea" (include "fullname" .)) }}
這里**fullname**如何添加引用?
使用lookup函數(shù)疮绷、
lookup函數(shù)可以用于在運行的集群中查找資源翰舌。lookup函數(shù)簡述為查找apiVersion, kind, namespace,name -> 資源或者資源列表。
parametertype
apiVersionstring
kindstring
namespacestring
namestring
lookup返回值接收
當(dāng)lookup返回一個對象冬骚,它會返回一個字典椅贱。這個字典可以進一步被引導(dǎo)以獲取特定值懂算。
(lookup "v1" "Namespace" "" "mynamespace").metadata.annotations
當(dāng)lookup返回一個對象列表時,可以通過items字段訪問對象列表:
{{ range $index, $service := (lookup "v1" "Service" "mynamespace" "").items }}
? ? {{/* do something with each service */}}
{{ end }}
當(dāng)對象未找到時庇麦,會返回空值计技。可以用來檢測對象是否存在山橄。
Helm在helm template或者helm install|upgrade|delete|rollback --dry-run時 會返回空字典
運算符頁是函數(shù)
對于模板來說垮媒,運算符(eq,ne,lt,gt,and,or等等) 都是作為函數(shù)來實現(xiàn)的。 在管道符中航棱,操作可以按照圓括號分組睡雇。
模板函數(shù)列表
Helm 包含了很多可以在模板中利用的模板函數(shù)。以下列出了具體分類:
Logic and Flow Control重點, 里面包含 and/or/eq等邏輯判斷
流控制
控制結(jié)構(gòu)(在模板語言中稱為"actions")提供給你和模板作者控制模板迭代流的能力饮醇。 Helm的模板語言提供了以下控制結(jié)構(gòu):
if/else它抱, 用來創(chuàng)建條件語句
with, 用來指定范圍
range朴艰, 提供"for each"類型的循環(huán)
除了這些之外观蓄,還提供了一些聲明和使用命名模板的關(guān)鍵字:
define在模板中聲明一個新的命名模板
template導(dǎo)入一個命名模板
block聲明一種特殊的可填充的模板塊
If/Else
{{ if PIPELINE }}
? # Do something
{{ else if OTHER PIPELINE }}
? # Do something else
{{ else }}
? # Default case
{{ end }}
apiVersion: v1
kind: ConfigMap
metadata:
? name: {{ .Release.Name }}-configmap
data:
? myvalue: "Hello World"
? drink: {{ .Values.favorite.drink | default "tea" | quote }}
? food: {{ .Values.favorite.food | upper | quote }}
? {{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }}
對比下面?zhèn)z命令
helm install solid-vulture . --dry-run --debug
helm install solid-vulture . --dry-run --debug —set 'favorite.drink='
控制空格
要確保-和其他命令之間有一個空格。{{- 3 }}表示“刪除左邊空格并打印3”祠墅,而{{-3 }}表示“打印-3”侮穿。
最終,有時這更容易告訴模板系統(tǒng)如何縮進毁嗦,而不是試圖控制模板指令間的間距亲茅。因此,您有時會發(fā)現(xiàn)使用indent方法({{ indent 2 "mug:true" }})會很有用金矛。
修改使用with的范圍
.作用域會從全局變?yōu)閣ith的作用域, 為了獲取全局對象, 可以使用$從父作用域中訪問Release.Name對象芯急。當(dāng)模板開始執(zhí)行后$會被映射到根作用域,且執(zhí)行過程中不會更改驶俊。 下面這種方式也可以正常工作
? {{- with .Values.favorite }}
? drink: {{ .drink | default "tea" | quote }}
? food: {{ .food | upper | quote }}
? release: {{ $.Release.Name }}
? {{- end }}
使用range操作循環(huán)
apiVersion: v1
kind: ConfigMap
metadata:
? name: {{ .Release.Name }}-configmap
data:
? myvalue: "Hello World"
? {{- with .Values.favorite }}
? drink: {{ .drink | default "tea" | quote }}
? food: {{ .food | upper | quote }}
? toppings: |-
? ? {{- range $.Values.pizzaToppings }}
? ? - {{ . | title | quote }}
? ? {{- end }}? ?
? {{- end }}
正如例子中所示,|-標(biāo)識在YAML中是指多行字符串免姿。這在清單列表中嵌入大塊數(shù)據(jù)是很有用的技術(shù)饼酿。 具體見Kubernetes ConfigMap 文檔
有時能在模板中快速創(chuàng)建列表然后迭代
Helm模板的tuple可以很容易實現(xiàn)該功能
sizes: |-
? ? {{- range tuple "small" "medium" "large" }}
? ? - {{ . }}
? ? {{- end }}
變量
解決作用域問題的一種方法是將對象分配給可以不考慮當(dāng)前作用域而訪問的變量。
變量是對另一個對象的命名引用胚膊。遵循$name變量的格式且指定了一個特殊的賦值運算符::=
apiVersion: v1
kind: ConfigMap
metadata:
? name: {{ .Release.Name }}-configmap
data:
? myvalue: "Hello World"
? {{- $relname := .Release.Name -}}
? {{- with .Values.favorite }}
? drink: {{ .drink | default "tea" | quote }}
? food: {{ .food | upper | quote }}
? release: {{ $relname }}
? {{- end }}
變量在range循環(huán)中特別有用故俐。可以用于類似列表的對象紊婉,以捕獲索引和值:
? toppings: |-
? ? {{- range $index, $topping := .Values.pizzaToppings }}
? ? ? {{ $index }}: {{ $topping }}
? ? {{- end }}? ?
對于數(shù)據(jù)結(jié)構(gòu)有key和value药版,可以使用range獲取key和value。比如喻犁,可以通過.Values.favorite進行循環(huán):
apiVersion: v1
kind: ConfigMap
metadata:
? name: {{ .Release.Name }}-configmap
data:
? myvalue: "Hello World"
? {{- range $key, $val := .Values.favorite }}
? {{ $key }}: {{ $val | quote }}
? {{- end }}
但有個變量一直是全局的$這個變量一直是指向根的上下文槽片。當(dāng)在一個范圍內(nèi)循環(huán)時會很有用何缓,同時你要知道chart的版本名稱。
命名模板
模板名稱是全局的还栓。如果您想聲明兩個相同名稱的模板碌廓,哪個最后加載就使用哪個。 因為在子chart中的模板和頂層模板一起編譯剩盒,命名時要注意chart特定名稱谷婆。
創(chuàng)建方式:
在流控制部分, 我們介紹了三種聲明和管理模板的方法:define辽聊,template纪挎,和block
特殊用途的include方法,類似于template操作
局部的和_文件
Helm的模板語言允許你創(chuàng)建命名的嵌入式模板跟匆, 這樣就可以在其他位置按名稱訪問廷区。
_helpers.tpl文件是模板局部的默認位置。
在編寫模板細節(jié)之前贾铝,文件的命名慣例需要注意:
templates/中的大多數(shù)文件被視為包含Kubernetes清單
NOTES.txt是個例外
命名以下劃線(_)開始的文件則假定沒有包含清單內(nèi)容隙轻。這些文件不會渲染為Kubernetes對象定義,但在其他chart模板中都可用垢揩。
用define和template聲明和使用模板
{{- define "MY.NAME" }}
? # body of template here
{{- end }}
{{- define "mychart.labels" }}
? labels:
? ? generator: helm
? ? date: {{ now | htmlDate }}
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
? name: {{ .Release.Name }}-configmap
? {{- template "mychart.labels" }}
data:
? myvalue: "Hello World"
? {{- range $key, $val := .Values.favorite }}
? {{ $key }}: {{ $val | quote }}
? {{- end }}
tips:
define 中的 mychart.labels 全局的, 因此可以在任意地方調(diào)用
define 不會有輸出, 除非使用 template 調(diào)用它
一般helm chart講這些模板防止在局部文件中, 一般是_helpers.tpl
按照慣例define方法會有個簡單的文檔塊({{/* ... */}})來描述要做的事玖绿。
define最好使用{chart_name}.{labels}作為模板前綴
設(shè)置模板范圍
{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
? labels:
? ? generator: helm
? ? date: {{ now | htmlDate }}
? ? chart: {{ .Chart.Name }}
? ? version: {{ .Chart.Version }}
{{- end }}
如果渲染這個,會因為.沒有內(nèi)容傳入, 導(dǎo)致錯誤
要查看渲染了什么helm install --dry-run --disable-openapi-validation moldy-jaguar .
{- template "mychart.labels" }}沒有內(nèi)容傳入叁巨,所以模板中無法用.訪問任何內(nèi)容斑匪。{{- template "mychart.labels" . }}即可解決,.可以是其他參數(shù), .Values 等
helm install --dry-run --debug plinking-anaco .
include方法
相較于使用template,在helm中使用include被認為是更好的方式 只是為了更好地處理YAML文檔的輸出格式
在模板內(nèi)部訪問文件
Helm 提供了通過.Files對象訪問文件的方法锋勺。不過蚀瘸,在我們使用模板示例之前,有些事情需要注意:
可以添加額外的文件到chart中庶橱。雖然這些文件會被綁定贮勃。但是要小心,由于Kubernetes對象的限制苏章,Chart必須小于1M寂嘉。
通常處于安全考慮,一些文件無法通過.Files對象訪問:
無法訪問templates/中的文件
無法訪問使用.helmignore排除的文件
helm應(yīng)用subchart之外的文件枫绅,包括父級中的泉孩,不能被訪問的
Chart不能保留UNIX模式信息,因此當(dāng)文件涉及到.Files對象時并淋,文件級權(quán)限不會影響文件的可用性寓搬。
基礎(chǔ)應(yīng)用
{{$file := .Files }} # 獲取文件句柄
{{$file.Get file_name }} 獲取文件信息
路徑幫助
幫助處理文件路徑見模板函數(shù)-FilePath
全局模式
當(dāng)你的chart不斷變大時Files.Glob(pattern string)方法來使用全局模式的靈活性讀取特定文件。
{{ range $path, $_ :=? .Files.Glob? "**.yaml" }}
? ? ? {{ $.Files.Get $path }}
{{ end }}
ConfigMap and Secrets utility functions
Files類型提供了很多使用方法
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
{{ .Files.Get "config1.toml" | b64enc }}
lines, 直接支持遍歷
data:
? some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
? ? {{ . }}{{ end }}
創(chuàng)建一個NOTES.txt文件
templates/NOTES.txt在helm install或helm upgrade命令的最后县耽,高度自定義部分的信息句喷。
參考文檔
參考文檔
helm Chart+configmap? 使用 helm template具體生成需要看下
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"