Kubernetes 包管理神器 helm

概覽

? Helm 簡(jiǎn)介

? Helm 安裝使用

? Helm 的基本使用

? Helm 模板詳解之內(nèi)置函數(shù)與 Values

? Helm 模板詳解之模板函數(shù)與管道

? Helm 模板詳解之控制流程

? Helm Hooks

helm 簡(jiǎn)介

很多人都使用過(guò) Ubuntu 下的 ap-get 或者 CentOS 下的 yum, 這兩者都是Linux 系統(tǒng)下的包管理工具。采用 apt-get/yum ,應(yīng)用開(kāi)發(fā)者可以管理應(yīng)用包之間的依賴關(guān)系,發(fā)布應(yīng)用;用戶則可以以簡(jiǎn)單的方式查找、安裝、升級(jí)、卸載應(yīng)用程序。

這里可以將 Helm 看作 Kubernetes 下的 apt-get/yum。Helm 是 Deis (https://deis.com/) 開(kāi)發(fā)的一個(gè)用于 kubernetes 的包管理器。每個(gè)包稱為一個(gè) Chart,一個(gè) Chart 是一個(gè)目錄(一般情況下會(huì)將目錄進(jìn)行打包壓縮,形成 name-version.tgz 格式的單一文件,方便傳輸和存儲(chǔ))。

對(duì)于應(yīng)用發(fā)布者而言,可以通過(guò) Helm 打包應(yīng)用,管理應(yīng)用依賴關(guān)系,管理應(yīng)用版本并發(fā)布應(yīng)用到軟件倉(cāng)庫(kù)。

對(duì)于使用者而言,使用 Helm 后不用需要了解 Kubernetes 的 Yaml 語(yǔ)法并編寫(xiě)應(yīng)用部署文件,可以通過(guò) Helm 下載并在 kubernetes 上安裝需要的應(yīng)用。

除此以外,Helm 還提供了 kubernetes 上的軟件部署,刪除,升級(jí),回滾應(yīng)用的強(qiáng)大功能。

helm 應(yīng)用場(chǎng)景一:應(yīng)用部署在多個(gè)區(qū)域

單獨(dú)維護(hù)各個(gè)區(qū)域的 部署文件

Configmap、secret 等資源如何與 deployment—起發(fā)布 和回滾

image

挑戰(zhàn)

?管理、編輯與更新大量的 K8s 配置文件

?部署一個(gè)含有大量配置文件的復(fù)雜 K8s 應(yīng)用

?分享和復(fù)用 K8s 配置和應(yīng)用

?參數(shù)化配置模板支持多個(gè)環(huán)境

?管理應(yīng)用的發(fā)布:回滾、diff 和查看發(fā)布?xì)v史

?控制一個(gè)部署周期中的某一些環(huán)節(jié)

?發(fā)布后的驗(yàn)證

helm 解決方案

Helm 把 Kubernetes 資源(比女^deployment、service 或 ingress 等)打包到一個(gè) chart中,而 chart 被保存到 chart 倉(cāng) 庫(kù)。通過(guò) chart 倉(cāng)庫(kù)可用來(lái)存儲(chǔ)和分 享chart。

? Helm 使發(fā)布可配置,支持發(fā)布應(yīng)用配置的版本管理,簡(jiǎn)化 了 Kubernetes 部署應(yīng)用的版本控制、打包、發(fā)布、刪除、 更新等操作

? chart 是描述相關(guān)的一組 Kubernetes 資源的文件集合。 chart 通過(guò)創(chuàng)建為特定目錄樹(shù)的文件,將它們打包到版本化 的壓縮包,然后進(jìn)行部署。

Chart

Chart.yaml 是必須的,它 記錄了 chart 的一些信息: chart 版本和名字等

? templates 下是 kubernetes資源的模板

? values.yaml 存放了模板 中的變量的值

image

helm 安裝和使用

helm 架構(gòu)

image

Helm Client

  • 本地 chart 開(kāi)發(fā)
  • 倉(cāng)庫(kù)管理
  • 與 Tiller sever 交互
  • 發(fā)送預(yù)安裝的 chart
  • 查詢 release 信息
  • 要求升級(jí)或卸載已存在的 release

Tiller Server

監(jiān)聽(tīng)來(lái)自 Helm client 的請(qǐng)求

通過(guò) chart 及其配置構(gòu)建一次發(fā)布

安裝 chart 到 Kubernetes 集群,并跟蹤隨后的發(fā)布

通過(guò)與 Kubernetes 交互升級(jí)或卸載 chart

簡(jiǎn)單的說(shuō),client 管理 charts,而 server 管理發(fā)布 release

Helm 客戶端安裝

客戶端安裝:到 Helm Release 下載二進(jìn)制文件,根據(jù)使用 的操作系統(tǒng)不同下載不同的版本,這里以 Linux上V2.15.1 為例,解壓后將可執(zhí)行文件 helm 拷貝至 usr/local/ bin 目錄下即可, 這樣 Helm 客戶端就在這臺(tái)機(jī)器上安裝完了

使用 Helm 命令查看版本,會(huì)提示無(wú)法連接到服務(wù)端 Tiller helm version

Helm 服務(wù)器端組件安裝

?前提:確保本地 kubectl 可以正常訪問(wèn)kubernetes的資源

?在命令行中執(zhí)行:helm init. Helm 默認(rèn)會(huì)去 gcr.io 拉取 tiller 的鏡像,有時(shí)鏡像拉不下來(lái),

?可以指定 tiller 的鏡像:

helm init --tiller-image registry.cn-

hangzhou.aliyuncs.com/softputer/tiller:v2.15.1

Helm 服務(wù)器組件安裝問(wèn)題

?如果在安裝過(guò)程中遇到了一些其他問(wèn)題,比如初始化的時(shí) 候出現(xiàn)了如下錯(cuò)誤:

image

需要在節(jié)點(diǎn)上安裝 socat 進(jìn)行解決

image

安裝完檢查

Helm 服務(wù)端正常安裝完成后,Tiller 默認(rèn)被部署在 kubernetes 集群的 kube-system 命名空間下:

image

查看 helm 版本

image

創(chuàng)建 RBAC 授權(quán)文件

為 Tiller 創(chuàng)建一個(gè)ServiceAccount,讓他擁有執(zhí)行權(quán)限,創(chuàng)建 rbac.yaml

image

部署 rbac

部署

image

指定 serviceaccount 給 tiller

kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":

{"template":{"spec":{"serviceAccount":"tiller"}}}}'

helm ls

Helm 使用

創(chuàng)建一個(gè) Chart

Templates 下的 deploment.yaml 默認(rèn)是一個(gè) nginx 服務(wù),可以通過(guò)修改 Values.yaml 文件中的 image tag,來(lái)修改需要部署的 nginx 的版本

image

Chart 安裝部署

執(zhí)行:helm install –-name hell-helm ./hello-helm部署和

安裝 chart.

查看 release

helm ls

刪除 release

helm del hello-helm

Helm基本使用

倉(cāng)庫(kù)

可以用 helm repo list 來(lái)查看當(dāng)前的倉(cāng)庫(kù)配置

image

對(duì)于無(wú)法正??茖W(xué)上網(wǎng)的情況,可以自建一個(gè) chart 倉(cāng)庫(kù)使用(此處不做介紹)

查找 chart

  • helm search

查找倉(cāng)庫(kù)里所有可用的 chart

  • helm seach mysql

查找倉(cāng)庫(kù)里是否有 mysql

  • helm inspect stable/mysql

查找 chart 的描述信息,包括運(yùn)行方式和配置信息

安裝 chart

  • 最簡(jiǎn)單的情況,只需要一個(gè) 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 沒(méi)有刪除,不能被復(fù)用

  • Helm del –-purge release-name

release-name 可以再次被使用

定義 chart

一個(gè) chart 包就是一個(gè)文件夾的集合,文件夾名稱就是 chart 包的名稱,比如創(chuàng)建一 個(gè) mychart 的 chart 包

把 templates 目錄下的文件全部 刪除,來(lái)創(chuàng)建自己的模板

image

創(chuàng)建模板文件

在 templates 下新建一個(gè) configmap.yaml 文件

實(shí)際上現(xiàn)在就已經(jīng)有一個(gè)可安裝的 chart 包了

helm install --name mychart ./mychart

image

添加一個(gè)簡(jiǎn)單的模板

Helm Chart 模板主要使用的是 Go 語(yǔ)言模板編寫(xiě)而成

image

包含在{{和}}之中的就是模板指令,{{ .Release.Name }}將 release 的名稱注入到模板中來(lái),這樣最終生成的 ConfigMap 名稱就是以 release 的名稱開(kāi)頭的了。這里的 Release 模板對(duì)象屬于 Helm 內(nèi)置的一種對(duì)象,還有其他很多內(nèi)置的對(duì)象

調(diào)試

  • Helm 為我們提供了--dry-run --debug 這個(gè)可選參數(shù),在執(zhí)行 helm install 的時(shí)候帶上這兩個(gè)參數(shù)就可以把對(duì)應(yīng)的 values 值和生成的最終的資源清單文件打印出來(lái),而不會(huì)真正的去部署一個(gè) release 實(shí)例
  • helm install . --dry-run --debug ./mychart

Helm模板詳解之內(nèi)置函數(shù)與Values

內(nèi)置對(duì)象

  • Release:這個(gè)對(duì)象描述了 release 本身。內(nèi)置對(duì)象可以直接在文件中引用,Release 內(nèi)置對(duì)象常用的值有:Release.Name:release 名稱 Release.Namespace:release 的 namespace
  • Values:從 values.yaml 文件或者其他方式傳入模板的值。默認(rèn)情況下,Values 是空的

Values對(duì)象

Values 對(duì)象的值有四個(gè)來(lái)源, chart 包中的 values.yaml 文件,父 chart 包的 values.yaml 文件,使用 helm install 或者 helm upgrade 的-f 或者--values參數(shù)傳?的?定義的 yaml 文件,通過(guò)--set 參數(shù)傳?的值

values.yaml

重新清空 mychart/values.yaml,添加新的一行數(shù)據(jù) course: k8s,同事修 configmap.yaml 的內(nèi)容如下

image

helm install --dry-run --debug ./mychart

helm install --dry-run --debug –set course=python ./mychart

Helm 模板詳解之模板函數(shù)與管道

模板函數(shù)

從.Values 中讀取的值變成?符串的時(shí)候就可以通過(guò)調(diào)用 quote 模板函數(shù)來(lái)實(shí)現(xiàn)

image

模板函數(shù)使用結(jié)構(gòu)

模板函數(shù)遵循調(diào)用的語(yǔ)法為:functionName arg1 arg2...。在上頁(yè)的模板文件中,quote.Values.course.k8s 調(diào)用 quote函數(shù)并將后面的值作為一個(gè)參數(shù)傳遞給它

image

管道

管道我們通常稱為 Pipeline,是一個(gè)鏈在一起的一系列模板命令的工具,以緊湊地表達(dá)一系列轉(zhuǎn)換。

簡(jiǎn)單來(lái)說(shuō),管道是可以按順序完成一系列事情的一種方法。

管道示例

k8s 的 value 值被渲染后是大寫(xiě)的?符串

python 的值渲染為重復(fù)出現(xiàn)3次的?符串Helm模板詳解之控制

image

Helm模板詳解之控制流程

控制流程

模板函數(shù)和管道是通過(guò)轉(zhuǎn)換信息并將其插入到 YAML 文件中的強(qiáng)大方法。

但有時(shí)候需要添加一些比插入?符串更復(fù)雜一些的模板邏輯。這就需要使用到helm模板語(yǔ)言中提供的控制結(jié)構(gòu)了

流程控制關(guān)鍵字

控制流程為我們提供了控制模板生成流程的一種能力,Helm 的模板語(yǔ)言提供了以下幾種流程控制:

  • If/else 條件塊
  • With 指定范圍
  • Range 循環(huán)塊

If/else條件

if/else 塊是用于在模板中有條件地包含文本塊的方法,條件塊的基本結(jié)構(gòu)

image

判斷條件

要使用條件塊就得判斷條件是否為真,如果值為下面的幾種

情況,則管道的結(jié)果為 false:

  • 一個(gè)布爾類型的假
  • 一個(gè)數(shù)?零
  • 一個(gè)空的?符串
  • 一個(gè) nil(空或null)
  • 一個(gè)空的集合(map、slice、tuple、dict、array)

除了上面的這些情況外,其他所有條件都為真。

If/else 控制流程示例

image

helm install --dry-run --debug .

空格控制

上面我們的條件判斷語(yǔ)句是在一整行中的,如果平時(shí)經(jīng)常寫(xiě)代碼的同學(xué)可能非常不習(xí)慣了,我們一般會(huì)將其格式化為更容易閱讀的形式,比如:

image

這樣在進(jìn)行模板渲染的時(shí)候,會(huì)有多余的空行。

可以通過(guò)使用在而在}}前面添加一個(gè)空格和破折號(hào)-}}表示應(yīng)該刪除右邊的空格,另外需要注意的是換行符也模板標(biāo)識(shí){{后面添加破折號(hào)和空格{{-來(lái)表示將空白左移,是空格

image

With關(guān)鍵詞

  • With 關(guān)鍵詞可以控制變量作用域
image
  • 之前的{{ .Release.xxx }},其中的.就是表示對(duì)當(dāng)前范圍的引用,.Values 就是告訴模板在當(dāng)前范圍中查找 Values 對(duì)象的值。
  • with語(yǔ)句可以允許將當(dāng)前范圍.設(shè)置為特定的對(duì)象,?如我們前??直使?的.Values.course,我們可以使? with 來(lái)將.范圍指向.Values.course:(templates/configmap.yaml)
image

range 循環(huán)

幾乎所有的編程語(yǔ)言都支持類似于 for、foreach 或者類似功能的循環(huán)機(jī)制,在 Helm 模板語(yǔ)言中,是使用 range 關(guān)鍵來(lái)進(jìn)行循環(huán)操作

values.yaml

image

現(xiàn)在我們有一個(gè)課程列表,修改 configmap 模板文件來(lái)循環(huán)打印列表 range 循環(huán)結(jié)

image

循環(huán)結(jié)果

image

Helm Hooks

和 Kubernetes 里面的容器一樣,Helm 也提供了 Hook 的機(jī)制,允許 chart 開(kāi)發(fā)人員在 release 的生命周期中的某些節(jié)點(diǎn)來(lái)進(jìn)行干預(yù),比如我們可以利用 Hooks 來(lái)做下面的這些事情:

  • 在加載任何其他 chart 之前,在安裝過(guò)程中加載 ConfigMap 或Secret
  • 在安裝新 chart 之前執(zhí)行作業(yè)以備份數(shù)據(jù)庫(kù),然后在升級(jí)后執(zhí)行第二個(gè)作業(yè)以恢復(fù)數(shù)據(jù)
  • 在刪除 release 之前運(yùn)行作業(yè),以便在刪除 release 之前優(yōu)雅地停止服務(wù)

值得注意的是 Hooks 和普通模板一樣工作,但是它們具有特殊的注釋,可以使 Helm 以不同的方式使用它們。

Hooks

image

Hook 寫(xiě)法

Hook 在資源清單中的 metadata 部分用 annotations 的?式進(jìn)?聲明:

image

寫(xiě)一個(gè) hook

給一個(gè)資源添加 hook,只需要在 metadata 中添加相應(yīng)的 annotations,如下 Job 資源中我們添加一個(gè) annotations,要注意的是,如果我們沒(méi)有添加下面這行注釋的話,添加的內(nèi)容就會(huì)被當(dāng)成是 release 的一部分資源:

image

Hook 注解

  • 一個(gè)資源中我們也可以同時(shí)部署多個(gè) hook
image
  • 為 hook 定義了一個(gè)權(quán)重,這有助于建立一個(gè)確定性的執(zhí)行順序,權(quán)重可以是正數(shù)也可以是負(fù)數(shù),但是必須是字符串才行
image
  • 刪除 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 直播為大家講解,歡迎有問(wèn)題的同學(xué)來(lái)聽(tīng)找WeChat:17812796384即可獲得直播鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容