概覽
? Helm 簡介
? Helm 安裝使用
? Helm 的基本使用
? Helm 模板詳解之內(nèi)置函數(shù)與 Values
? Helm 模板詳解之模板函數(shù)與管道
? Helm 模板詳解之控制流程
? Helm Hooks
helm 簡介
很多人都使用過 Ubuntu 下的 ap-get 或者 CentOS 下的 yum, 這兩者都是Linux 系統(tǒng)下的包管理工具愈腾。采用 apt-get/yum ,應(yīng)用開發(fā)者可以管理應(yīng)用包之間的依賴關(guān)系荐捻,發(fā)布應(yīng)用氢拥;用戶則可以以簡單的方式查找丐巫、安裝、升級斤斧、卸載應(yīng)用程序早抠。
這里可以將 Helm 看作 Kubernetes 下的 apt-get/yum。Helm 是 Deis (https://deis.com/) 開發(fā)的一個用于 kubernetes 的包管理器折欠。每個包稱為一個 Chart贝或,一個 Chart 是一個目錄(一般情況下會將目錄進(jìn)行打包壓縮,形成 name-version.tgz 格式的單一文件锐秦,方便傳輸和存儲)咪奖。
對于應(yīng)用發(fā)布者而言,可以通過 Helm 打包應(yīng)用酱床,管理應(yīng)用依賴關(guān)系羊赵,管理應(yīng)用版本并發(fā)布應(yīng)用到軟件倉庫。
對于使用者而言扇谣,使用 Helm 后不用需要了解 Kubernetes 的 Yaml 語法并編寫應(yīng)用部署文件昧捷,可以通過 Helm 下載并在 kubernetes 上安裝需要的應(yīng)用。
除此以外罐寨,Helm 還提供了 kubernetes 上的軟件部署靡挥,刪除,升級鸯绿,回滾應(yīng)用的強大功能跋破。
helm 應(yīng)用場景一:應(yīng)用部署在多個區(qū)域
單獨維護(hù)各個區(qū)域的 部署文件
Configmap、secret 等資源如何與 deployment—起發(fā)布 和回滾
挑戰(zhàn)
?管理瓶蝴、編輯與更新大量的 K8s 配置文件
?部署一個含有大量配置文件的復(fù)雜 K8s 應(yīng)用
?分享和復(fù)用 K8s 配置和應(yīng)用
?參數(shù)化配置模板支持多個環(huán)境
?管理應(yīng)用的發(fā)布:回滾毒返、diff 和查看發(fā)布?xì)v史
?控制一個部署周期中的某一些環(huán)節(jié)
?發(fā)布后的驗證
helm 解決方案
Helm 把 Kubernetes 資源(比女^deployment、service 或 ingress 等)打包到一個 chart中舷手,而 chart 被保存到 chart 倉 庫拧簸。通過 chart 倉庫可用來存儲和分 享chart。
? Helm 使發(fā)布可配置男窟,支持發(fā)布應(yīng)用配置的版本管理盆赤,簡化 了 Kubernetes 部署應(yīng)用的版本控制、打包蝎宇、發(fā)布弟劲、刪除、 更新等操作
? chart 是描述相關(guān)的一組 Kubernetes 資源的文件集合姥芥。 chart 通過創(chuàng)建為特定目錄樹的文件兔乞,將它們打包到版本化 的壓縮包,然后進(jìn)行部署。
Chart
Chart.yaml 是必須的庸追,它 記錄了 chart 的一些信息: chart 版本和名字等
? templates 下是 kubernetes資源的模板
? values.yaml 存放了模板 中的變量的值
helm 安裝和使用
helm 架構(gòu)
Helm Client
- 本地 chart 開發(fā)
- 倉庫管理
- 與 Tiller sever 交互
- 發(fā)送預(yù)安裝的 chart
- 查詢 release 信息
- 要求升級或卸載已存在的 release
Tiller Server
監(jiān)聽來自 Helm client 的請求
通過 chart 及其配置構(gòu)建一次發(fā)布
安裝 chart 到 Kubernetes 集群霍骄,并跟蹤隨后的發(fā)布
通過與 Kubernetes 交互升級或卸載 chart
簡單的說,client 管理 charts淡溯,而 server 管理發(fā)布 release
Helm 客戶端安裝
客戶端安裝:到 Helm Release 下載二進(jìn)制文件,根據(jù)使用 的操作系統(tǒng)不同下載不同的版本读整,這里以 Linux上V2.15.1 為例,解壓后將可執(zhí)行文件 helm 拷貝至 usr/local/ bin 目錄下即可咱娶, 這樣 Helm 客戶端就在這臺機器上安裝完了
使用 Helm 命令查看版本米间,會提示無法連接到服務(wù)端 Tiller helm version
Helm 服務(wù)器端組件安裝
?前提:確保本地 kubectl 可以正常訪問kubernetes的資源
?在命令行中執(zhí)行:helm init. Helm 默認(rèn)會去 gcr.io 拉取 tiller 的鏡像,有時鏡像拉不下來,
?可以指定 tiller 的鏡像:
helm init --tiller-image registry.cn-
hangzhou.aliyuncs.com/softputer/tiller:v2.15.1
Helm 服務(wù)器組件安裝問題
?如果在安裝過程中遇到了一些其他問題膘侮,比如初始化的時 候出現(xiàn)了如下錯誤:
需要在節(jié)點上安裝 socat 進(jìn)行解決
安裝完檢查
Helm 服務(wù)端正常安裝完成后屈糊,Tiller 默認(rèn)被部署在 kubernetes 集群的 kube-system 命名空間下:
查看 helm 版本
創(chuàng)建 RBAC 授權(quán)文件
為 Tiller 創(chuàng)建一個ServiceAccount,讓他擁有執(zhí)行權(quán)限琼了,創(chuàng)建 rbac.yaml
部署 rbac
部署
指定 serviceaccount 給 tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":
{"template":{"spec":{"serviceAccount":"tiller"}}}}'
helm ls
Helm 使用
創(chuàng)建一個 Chart
Templates 下的 deploment.yaml 默認(rèn)是一個 nginx 服務(wù)逻锐,可以通過修改 Values.yaml 文件中的 image tag,來修改需要部署的 nginx 的版本
Chart 安裝部署
執(zhí)行:helm install –-name hell-helm ./hello-helm部署和
安裝 chart.
查看 release
helm ls
刪除 release
helm del hello-helm
Helm基本使用
倉庫
可以用 helm repo list 來查看當(dāng)前的倉庫配置
對于無法正车裥剑科學(xué)上網(wǎng)的情況昧诱,可以自建一個 chart 倉庫使用(此處不做介紹)
查找 chart
- helm search
查找倉庫里所有可用的 chart
- helm seach mysql
查找倉庫里是否有 mysql
- helm inspect stable/mysql
查找 chart 的描述信息,包括運行方式和配置信息
安裝 chart
- 最簡單的情況所袁,只需要一個 chart 的名稱參數(shù)
helm install stable/mysql
- 可以自定義 release 的名字盏档,而不是使用 chart 中配置的名字
helm install stable/mysql --name mydb
- Helm status release-name
跟蹤 release 狀態(tài)或重新讀取配置信息
刪除 release
- helm del release-name
刪除 kubernetes 中的所有資源,但是 release-name 沒有刪除燥爷,不能被復(fù)用
- Helm del –-purge release-name
release-name 可以再次被使用
定義 chart
一個 chart 包就是一個文件夾的集合妆丘,文件夾名稱就是 chart 包的名稱,比如創(chuàng)建一 個 mychart 的 chart 包
把 templates 目錄下的文件全部 刪除局劲,來創(chuàng)建自己的模板
創(chuàng)建模板文件
在 templates 下新建一個 configmap.yaml 文件
實際上現(xiàn)在就已經(jīng)有一個可安裝的 chart 包了
helm install --name mychart ./mychart
添加一個簡單的模板
Helm Chart 模板主要使用的是 Go 語言模板編寫而成
包含在{{和}}之中的就是模板指令,{{ .Release.Name }}將 release 的名稱注入到模板中來奶赠,這樣最終生成的 ConfigMap 名稱就是以 release 的名稱開頭的了鱼填。這里的 Release 模板對象屬于 Helm 內(nèi)置的一種對象,還有其他很多內(nèi)置的對象
調(diào)試
- Helm 為我們提供了--dry-run --debug 這個可選參數(shù)毅戈,在執(zhí)行 helm install 的時候帶上這兩個參數(shù)就可以把對應(yīng)的 values 值和生成的最終的資源清單文件打印出來苹丸,而不會真正的去部署一個 release 實例
- helm install . --dry-run --debug ./mychart
Helm模板詳解之內(nèi)置函數(shù)與Values
內(nèi)置對象
- Release:這個對象描述了 release 本身。內(nèi)置對象可以直接在文件中引用苇经,Release 內(nèi)置對象常用的值有:Release.Name:release 名稱 Release.Namespace:release 的 namespace
- Values:從 values.yaml 文件或者其他方式傳入模板的值赘理。默認(rèn)情況下,Values 是空的
Values對象
Values 對象的值有四個來源扇单, chart 包中的 values.yaml 文件商模,父 chart 包的 values.yaml 文件,使用 helm install 或者 helm upgrade 的-f 或者--values參數(shù)傳?的?定義的 yaml 文件,通過--set 參數(shù)傳?的值
values.yaml
重新清空 mychart/values.yaml施流,添加新的一行數(shù)據(jù) course: k8s响疚,同事修 configmap.yaml 的內(nèi)容如下
helm install --dry-run --debug ./mychart
helm install --dry-run --debug –set course=python ./mychart
Helm 模板詳解之模板函數(shù)與管道
模板函數(shù)
從.Values 中讀取的值變成?符串的時候就可以通過調(diào)用 quote 模板函數(shù)來實現(xiàn)
模板函數(shù)使用結(jié)構(gòu)
模板函數(shù)遵循調(diào)用的語法為:functionName arg1 arg2...。在上頁的模板文件中瞪醋,quote.Values.course.k8s 調(diào)用 quote函數(shù)并將后面的值作為一個參數(shù)傳遞給它
管道
管道我們通常稱為 Pipeline忿晕,是一個鏈在一起的一系列模板命令的工具,以緊湊地表達(dá)一系列轉(zhuǎn)換银受。
簡單來說践盼,管道是可以按順序完成一系列事情的一種方法。
管道示例
k8s 的 value 值被渲染后是大寫的?符串
python 的值渲染為重復(fù)出現(xiàn)3次的?符串Helm模板詳解之控制
Helm模板詳解之控制流程
控制流程
模板函數(shù)和管道是通過轉(zhuǎn)換信息并將其插入到 YAML 文件中的強大方法宾巍。
但有時候需要添加一些比插入?符串更復(fù)雜一些的模板邏輯咕幻。這就需要使用到helm模板語言中提供的控制結(jié)構(gòu)了
流程控制關(guān)鍵字
控制流程為我們提供了控制模板生成流程的一種能力,Helm 的模板語言提供了以下幾種流程控制:
- If/else 條件塊
- With 指定范圍
- Range 循環(huán)塊
If/else條件
if/else 塊是用于在模板中有條件地包含文本塊的方法蜀漆,條件塊的基本結(jié)構(gòu)
判斷條件
要使用條件塊就得判斷條件是否為真谅河,如果值為下面的幾種
情況,則管道的結(jié)果為 false:
- 一個布爾類型的假
- 一個數(shù)?零
- 一個空的?符串
- 一個 nil(空或null)
- 一個空的集合(map确丢、slice绷耍、tuple、dict鲜侥、array)
除了上面的這些情況外褂始,其他所有條件都為真。
If/else 控制流程示例
helm install --dry-run --debug .
空格控制
上面我們的條件判斷語句是在一整行中的描函,如果平時經(jīng)常寫代碼的同學(xué)可能非常不習(xí)慣了崎苗,我們一般會將其格式化為更容易閱讀的形式,比如:
這樣在進(jìn)行模板渲染的時候舀寓,會有多余的空行胆数。
可以通過使用在而在}}前面添加一個空格和破折號-}}表示應(yīng)該刪除右邊的空格,另外需要注意的是換行符也模板標(biāo)識{{后面添加破折號和空格{{-來表示將空白左移互墓,是空格
With關(guān)鍵詞
- With 關(guān)鍵詞可以控制變量作用域
- 之前的{{ .Release.xxx }}必尼,其中的.就是表示對當(dāng)前范圍的引用,.Values 就是告訴模板在當(dāng)前范圍中查找 Values 對象的值篡撵。
- with語句可以允許將當(dāng)前范圍.設(shè)置為特定的對象判莉,?如我們前??直使?的.Values.course,我們可以使? with 來將.范圍指向.Values.course:(templates/configmap.yaml)
range 循環(huán)
幾乎所有的編程語言都支持類似于 for育谬、foreach 或者類似功能的循環(huán)機制券盅,在 Helm 模板語言中,是使用 range 關(guān)鍵來進(jìn)行循環(huán)操作
values.yaml
現(xiàn)在我們有一個課程列表膛檀,修改 configmap 模板文件來循環(huán)打印列表 range 循環(huán)結(jié)
循環(huán)結(jié)果
Helm Hooks
和 Kubernetes 里面的容器一樣锰镀,Helm 也提供了 Hook 的機制娘侍,允許 chart 開發(fā)人員在 release 的生命周期中的某些節(jié)點來進(jìn)行干預(yù),比如我們可以利用 Hooks 來做下面的這些事情:
- 在加載任何其他 chart 之前互站,在安裝過程中加載 ConfigMap 或Secret
- 在安裝新 chart 之前執(zhí)行作業(yè)以備份數(shù)據(jù)庫私蕾,然后在升級后執(zhí)行第二個作業(yè)以恢復(fù)數(shù)據(jù)
- 在刪除 release 之前運行作業(yè),以便在刪除 release 之前優(yōu)雅地停止服務(wù)
值得注意的是 Hooks 和普通模板一樣工作胡桃,但是它們具有特殊的注釋踩叭,可以使 Helm 以不同的方式使用它們。
Hooks
Hook 寫法
Hook 在資源清單中的 metadata 部分用 annotations 的?式進(jìn)?聲明:
寫一個 hook
給一個資源添加 hook,只需要在 metadata 中添加相應(yīng)的 annotations,如下 Job 資源中我們添加一個 annotations翠胰,要注意的是容贝,如果我們沒有添加下面這行注釋的話,添加的內(nèi)容就會被當(dāng)成是 release 的一部分資源:
Hook 注解
- 一個資源中我們也可以同時部署多個 hook
- 為 hook 定義了一個權(quán)重之景,這有助于建立一個確定性的執(zhí)行順序斤富,權(quán)重可以是正數(shù)也可以是負(fù)數(shù),但是必須是字符串才行
- 刪除 hook 資源的策略
刪除策略
- hook-succeeded:表示 Tiller 在 hook 成功執(zhí)?后刪除hook 資源
- hook-failed:表示如果 hook 在執(zhí)?期間失敗了锻狗,Tiller 應(yīng)該刪除 hook 資源
- before-hook-creation:表示在刪除新的 hook 之前應(yīng)該刪除以前的 hook
2019.10.29日21:00-22:00 直播為大家講解满力,歡迎有問題的同學(xué)來聽找WeChat:17812796384即可獲得直播鏈接