Kubernetes 包管理神器 helm

概覽

• Helm 簡介

• Helm 安裝使用

• Helm 的基本使用

• Helm 模板詳解之內置函數與 Values

• Helm 模板詳解之模板函數與管道

• Helm 模板詳解之控制流程

• Helm Hooks

helm 簡介

很多人都使用過 Ubuntu 下的 ap-get 或者 CentOS 下的 yum, 這兩者都是Linux 系統下的包管理工具。採用 apt-get/yum ,應用開發者可以管理應用包之間的依賴關係,發佈應用;用戶則可以以簡單的方式查找、安裝、升級、卸載應用程序。

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

對於應用發佈者而言,可以通過 Helm 打包應用,管理應用依賴關係,管理應用版本併發布應用到軟件倉庫。

對於使用者而言,使用 Helm 後不用需要了解 Kubernetes 的 Yaml 語法並編寫應用部署文件,可以通過 Helm 下載並在 kubernetes 上安裝需要的應用。

除此以外,Helm 還提供了 kubernetes 上的軟件部署,刪除,升級,回滾應用的強大功能。


helm 應用場景一:應用部署在多個區域

單獨維護各個區域的 部署文件

Configmap、secret 等資源如何與 deployment—起發佈 和回滾

Kubernetes 包管理神器  helm

挑戰

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

•部署一個含有大量配置文件的複雜 K8s 應用

•分享和複用 K8s 配置和應用

•參數化配置模板支持多個環境

•管理應用的發佈:回滾、diff 和查看發佈歷史

•控制一個部署週期中的某一些環節

•發佈後的驗證

helm 解決方案

Helm 把 Kubernetes 資源(比女^deployment、service 或 ingress 等)打包到一個 chart中,而 chart 被保存到 chart 倉 庫。通過 chart 倉庫可用來存儲和分 享chart。

• Helm 使發佈可配置,支持發佈應用配置的版本管理,簡化 了 Kubernetes 部署應用的版本控制、打包、發佈、刪除、 更新等操作

• chart 是描述相關的一組 Kubernetes 資源的文件集合。 chart 通過創建為特定目錄樹的文件,將它們打包到版本化 的壓縮包,然後進行部署。

Chart

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

• templates 下是 kubernetes資源的模板

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

Kubernetes 包管理神器  helm

helm 安裝和使用

helm 架構

Kubernetes 包管理神器  helm

Helm Client

  • 本地 chart 開發
  • 倉庫管理
  • 與 Tiller sever 交互
  • 發送預安裝的 chart
  • 查詢 release 信息
  • 要求升級或卸載已存在的 release

Tiller Server

監聽來自 Helm client 的請求

通過 chart 及其配置構建一次發佈

安裝 chart 到 Kubernetes 集群,並跟蹤隨後的發佈

通過與 Kubernetes 交互升級或卸載 chart

簡單的說,client 管理 charts,而 server 管理發佈 release

Helm 客戶端安裝

客戶端安裝:到 Helm Release 下載二進制文件,根據使用 的操作系統不同下載不同的版本,這裡以 Linux上V2.15.1 為例,解壓後將可執行文件 helm 拷貝至 usr/local/ bin 目錄下即可, 這樣 Helm 客戶端就在這臺機器上安裝完了

使用 Helm 命令查看版本,會提示無法連接到服務端 Tiller helm version

Helm 服務器端組件安裝

•前提:確保本地 kubectl 可以正常訪問kubernetes的資源

•在命令行中執行:helm init. Helm 默認會去 gcr.io 拉取 tiller 的鏡像,有時鏡像拉不下來,

•可以指定 tiller 的鏡像:

helm init --tiller-image registry.cn-

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

Helm 服務器組件安裝問題

•如果在安裝過程中遇到了一些其他問題,比如初始化的時 候出現瞭如下錯誤:

Kubernetes 包管理神器  helm

需要在節點上安裝 socat 進行解決

Kubernetes 包管理神器  helm

安裝完檢查

Helm 服務端正常安裝完成後,Tiller 默認被部署在 kubernetes 集群的 kube-system 命名空間下:

Kubernetes 包管理神器  helm

查看 helm 版本

Kubernetes 包管理神器  helm

為 Tiller 創建一個ServiceAccount,讓他擁有執行權限,創建 rbac.yaml

Kubernetes 包管理神器  helm

部署 rbac

部署

Kubernetes 包管理神器  helm

指定 serviceaccount 給 tiller

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

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

helm ls

Helm 使用

創建一個 Chart

Templates 下的 deploment.yaml 默認是一個 nginx 服務,可以通過修改 Values.yaml 文件中的 image tag,來修改需要部署的 nginx 的版本

Kubernetes 包管理神器  helm

Chart 安裝部署

執行:helm install –-name hell-helm ./hello-helm部署和

安裝 chart.

查看 release

helm ls

刪除 release

helm del hello-helm

Helm基本使用

倉庫

可以用 helm repo list 來查看當前的倉庫配置

Kubernetes 包管理神器  helm

對於無法正常科學上網的情況,可以自建一個 chart 倉庫使用(此處不做介紹)

查找 chart

  • helm search

查找倉庫裡所有可用的 chart

  • helm seach mysql

查找倉庫裡是否有 mysql

  • helm inspect stable/mysql

查找 chart 的描述信息,包括運行方式和配置信息

安裝 chart

  • 最簡單的情況,只需要一個 chart 的名稱參數

helm install stable/mysql

  • 可以自定義 release 的名字,而不是使用 chart 中配置的名字

helm install stable/mysql --name mydb

  • Helm status release-name

跟蹤 release 狀態或重新讀取配置信息

刪除 release

  • helm del release-name

刪除 kubernetes 中的所有資源,但是 release-name 沒有刪除,不能被複用

  • Helm del –-purge release-name

release-name 可以再次被使用

定義 chart

一個 chart 包就是一個文件夾的集合,文件夾名稱就是 chart 包的名稱,比如創建一 個 mychart 的 chart 包

把 templates 目錄下的文件全部 刪除,來創建自己的模板

Kubernetes 包管理神器  helm

創建模板文件

在 templates 下新建一個 configmap.yaml 文件

實際上現在就已經有一個可安裝的 chart 包了

helm install --name mychart ./mychart

Kubernetes 包管理神器  helm

添加一個簡單的模板

Helm Chart 模板主要使用的是 Go 語言模板編寫而成

Kubernetes 包管理神器  helm

包含在{{和}}之中的就是模板指令,{{ .Release.Name }}將 release 的名稱注入到模板中來,這樣最終生成的 ConfigMap 名稱就是以 release 的名稱開頭的了。這裡的 Release 模板對象屬於 Helm 內置的一種對象,還有其他很多內置的對象

調試

  • Helm 為我們提供了--dry-run --debug 這個可選參數,在執行 helm install 的時候帶上這兩個參數就可以把對應的 values 值和生成的最終的資源清單文件打印出來,而不會真正的去部署一個 release 實例
  • helm install . --dry-run --debug ./mychart

Helm模板詳解之內置函數與Values

內置對象

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

Values對象

Values 對象的值有四個來源, chart 包中的 values.yaml 文件,父 chart 包的 values.yaml 文件,使用 helm install 或者 helm upgrade 的-f 或者--values參數傳⼊的⾃定義的 yaml 文件,通過--set 參數傳⼊的值

values.yaml

重新清空 mychart/values.yaml,添加新的一行數據 course: k8s,同事修 configmap.yaml 的內容如下

Kubernetes 包管理神器  helm

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

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

Helm 模板詳解之模板函數與管道

模板函數

從.Values 中讀取的值變成⫿符串的時候就可以通過調用 quote 模板函數來實現

Kubernetes 包管理神器  helm

模板函數使用結構

模板函數遵循調用的語法為:functionName arg1 arg2...。在上頁的模板文件中,quote.Values.course.k8s 調用 quote函數並將後面的值作為一個參數傳遞給它

Kubernetes 包管理神器  helm

管道

管道我們通常稱為 Pipeline,是一個鏈在一起的一系列模板命令的工具,以緊湊地表達一系列轉換。

簡單來說,管道是可以按順序完成一系列事情的一種方法。

管道示例

k8s 的 value 值被渲染後是大寫的⫿符串

python 的值渲染為重複出現3次的⫿符串Helm模板詳解之控制

Kubernetes 包管理神器  helm

Helm模板詳解之控制流程

控制流程

模板函數和管道是通過轉換信息並將其插入到 YAML 文件中的強大方法。

但有時候需要添加一些比插入⫿符串更復雜一些的模板邏輯。這就需要使用到helm模板語言中提供的控制結構了

流程控制關鍵字

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

  • If/else 條件塊
  • With 指定範圍
  • Range 循環塊

If/else條件

if/else 塊是用於在模板中有條件地包含文本塊的方法,條件塊的基本結構

Kubernetes 包管理神器  helm

判斷條件

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

情況,則管道的結果為 false:

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

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

If/else 控制流程示例

Kubernetes 包管理神器  helm

helm install --dry-run --debug .

空格控制

上面我們的條件判斷語句是在一整行中的,如果平時經常寫代碼的同學可能非常不習慣了,我們一般會將其格式化為更容易閱讀的形式,比如:

Kubernetes 包管理神器  helm

這樣在進行模板渲染的時候,會有多餘的空行。

可以通過使用在而在}}前面添加一個空格和破折號-}}表示應該刪除右邊的空格,另外需要注意的是換行符也模板標識{{後面添加破折號和空格{{-來表示將空白左移,是空格

Kubernetes 包管理神器  helm

With關鍵詞

  • With 關鍵詞可以控制變量作用域
Kubernetes 包管理神器  helm

  • 之前的{{ .Release.xxx }},其中的.就是表示對當前範圍的引用,.Values 就是告訴模板在當前範圍中查找 Values 對象的值。
  • with語句可以允許將當前範圍.設置為特定的對象,⽐如我們前⾯⼀直使⽤的.Values.course,我們可以使⽤ with 來將.範圍指向.Values.course:(templates/configmap.yaml)
Kubernetes 包管理神器  helm

range 循環

幾乎所有的編程語言都支持類似於 for、foreach 或者類似功能的循環機制,在 Helm 模板語言中,是使用 range 關鍵來進行循環操作

values.yaml

Kubernetes 包管理神器  helm

現在我們有一個課程列表,修改 configmap 模板文件來循環打印列表 range 循環結

Kubernetes 包管理神器  helm

循環結果

Kubernetes 包管理神器  helm

Helm Hooks

和 Kubernetes 裡面的容器一樣,Helm 也提供了 Hook 的機制,允許 chart 開發人員在 release 的生命週期中的某些節點來進行干預,比如我們可以利用 Hooks 來做下面的這些事情:

  • 在加載任何其他 chart 之前,在安裝過程中加載 ConfigMap 或Secret
  • 在安裝新 chart 之前執行作業以備份數據庫,然後在升級後執行第二個作業以恢復數據
  • 在刪除 release 之前運行作業,以便在刪除 release 之前優雅地停止服務

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

Hooks

Kubernetes 包管理神器  helm

Hook 寫法

Hook 在資源清單中的 metadata 部分用 annotations 的⽅式進⾏聲明:

Kubernetes 包管理神器  helm

寫一個 hook

給一個資源添加 hook,只需要在 metadata 中添加相應的 annotations,如下 Job 資源中我們添加一個 annotations,要注意的是,如果我們沒有添加下面這行註釋的話,添加的內容就會被當成是 release 的一部分資源:

Kubernetes 包管理神器  helm

Hook 註解

  • 一個資源中我們也可以同時部署多個 hook
Kubernetes 包管理神器  helm

  • 為 hook 定義了一個權重,這有助於建立一個確定性的執行順序,權重可以是正數也可以是負數,但是必須是字符串才行
Kubernetes 包管理神器  helm

  • 刪除 hook 資源的策略

刪除策略

  • hook-succeeded:表示 Tiller 在 hook 成功執⾏後刪除hook 資源
  • hook-failed:表示如果 hook 在執⾏期間失敗了,Tiller 應該刪除 hook 資源
  • before-hook-creation:表示在刪除新的 hook 之前應該刪除以前的 hook


2019.10.29日21:00-22:00 直播為大家講解,歡迎有問題的同學來聽


分享到:


相關文章: