概述
Helm 是 Kubernetes 生態(tài)系統(tǒng)中的一個(gè)軟件包管理工具溶锭。
Kubernetes 的應(yīng)用部署
Kubernetes 是一個(gè)提供了基于容器的應(yīng)用集群管理解決方案,Kubernetes 為容器化應(yīng)用提供了部署運(yùn)行忧侧、資源調(diào)度搏嗡、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等一系列完整功能浴麻。
Kubernetes 的核心設(shè)計(jì)理念是:用戶定義要部署的應(yīng)用程序的規(guī)則郭卫,而 Kubernetes 則負(fù)責(zé)按照定義的規(guī)則部署并運(yùn)行應(yīng)用程序。如果應(yīng)用程序出現(xiàn)問(wèn)題導(dǎo)致偏離了定義的規(guī)格舔庶,Kubernetes 負(fù)責(zé)對(duì)其進(jìn)行自動(dòng)修正抛蚁。例如:定義的應(yīng)用規(guī)則要求部署兩個(gè)實(shí)例(Pod),其中一個(gè)實(shí)例異常終止了惕橙,Kubernetes 會(huì)檢查到并重新啟動(dòng)一個(gè)新的實(shí)例瞧甩。
用戶通過(guò)使用 Kubernetes API 對(duì)象來(lái)描述應(yīng)用程序規(guī)則,包括 Pod弥鹦、Service肚逸、Volume、Namespace彬坏、ReplicaSet朦促、Deployment、Job 等等栓始。一般這些資源對(duì)象的定義需要寫(xiě)入一系列的 YAML 文件中务冕,然后通過(guò) Kubernetes 命令行工具 Kubectl 調(diào) Kubernetes API 進(jìn)行部署。
以一個(gè)典型的三層應(yīng)用 WordPress 為例幻赚,該應(yīng)用程序就涉及到多個(gè) Kubernetes API 對(duì)象禀忆,而要描述這些 Kubernetes API 對(duì)象就可能要同時(shí)維護(hù)多個(gè) YAML 文件。
從上圖可以看到落恼,在進(jìn)行 Kubernetes 軟件部署時(shí)箩退,我們面臨下述幾個(gè)問(wèn)題(Helm 的出現(xiàn)就是為了很好地解決下面這些問(wèn)題):
- 如何管理、編輯和更新這些這些分散的 Kubernetes 應(yīng)用配置文件佳谦。
- 如何把一套相關(guān)的配置文件作為一個(gè)應(yīng)用進(jìn)行管理戴涝。
- 如何分發(fā)和重用 Kubernetes 的應(yīng)用配置。
什么是 Helm
Helm 是 Deis 開(kāi)發(fā)的一個(gè)用于 Kubernetes 應(yīng)用的包管理工具,主要用來(lái)管理 Charts啥刻。有點(diǎn)類(lèi)似于 Ubuntu 中的 APT 或 CentOS 中的 YUM奸鸯。
Helm Chart 是用來(lái)封裝 Kubernetes 原生應(yīng)用程序的一系列 YAML 文件≈J玻可以在你部署應(yīng)用的時(shí)候自定義應(yīng)用程序的一些 Metadata府喳,以便于應(yīng)用程序的分發(fā)。
對(duì)于應(yīng)用發(fā)布者而言蘑拯,可以通過(guò) Helm 打包應(yīng)用、管理應(yīng)用依賴關(guān)系兜粘、管理應(yīng)用版本并發(fā)布應(yīng)用到軟件倉(cāng)庫(kù)申窘。
對(duì)于使用者而言,使用 Helm 后不用需要編寫(xiě)復(fù)雜的應(yīng)用部署文件孔轴,可以以簡(jiǎn)單的方式在 Kubernetes 上查找剃法、安裝、升級(jí)路鹰、回滾贷洲、卸載應(yīng)用程序。
組件及相關(guān)術(shù)語(yǔ)
- Helm: 是一個(gè)命令行下的客戶端工具晋柱。主要用于 Kubernetes 應(yīng)用程序 Chart 的創(chuàng)建优构、打包、發(fā)布以及創(chuàng)建和管理本地和遠(yuǎn)程的 Chart 倉(cāng)庫(kù)
- Tiller: 是 Helm 的服務(wù)端雁竞,部署在 Kubernetes 集群中钦椭。Tiller 用于接收 Helm 的請(qǐng)求,并根據(jù) Chart 生成 - Kubernetes 的部署文件( Helm 稱(chēng)為 Release )碑诉,然后提交給 Kubernetes 創(chuàng)建應(yīng)用彪腔。Tiller 還提供了 Release 的升級(jí)、刪除进栽、回滾等一系列功能
- Chart: Helm 的軟件包德挣,采用 TAR 格式。類(lèi)似于 APT 的 DEB 包或者 YUM 的 RPM 包快毛,其包含了一組定義 Kubernetes 資源相關(guān)的 YAML 文件
- Repoistory: Helm 的軟件倉(cāng)庫(kù)格嗅,Repository 本質(zhì)上是一個(gè) Web 服務(wù)器,該服務(wù)器保存了一系列的 Chart 軟件包以供用戶下載祸泪,并且提供了一個(gè)該 Repository 的 Chart 包的清單文件以供查詢吗浩。Helm 可以同時(shí)管理多個(gè)不同的 Repository
-
Release: 使用<font color=red>
helm install
</font>命令在 Kubernetes 集群中部署的 Chart 稱(chēng)為 Release
注意: Helm 中提到的 Release 和我們通常概念中的版本有所不同,這里的 Release 可以理解為 Helm 使用 Chart 包部署的一個(gè)應(yīng)用實(shí)例没隘。
工作原理
下圖描述了 Helm 的幾個(gè)關(guān)鍵組件 Helm(客戶端)懂扼、Tiller(服務(wù)器)、Repository(Chart 軟件倉(cāng)庫(kù))、Chart(軟件包)之間的關(guān)系阀湿。
Chart Install 安裝過(guò)程
- Helm 從指定的目錄或者 TAR 文件中解析出 Chart 結(jié)構(gòu)信息
- Helm 將指定的 Chart 結(jié)構(gòu)和 Values 信息通過(guò) gRPC 傳遞給 Tiller
- Tiller 根據(jù) Chart 和 Values 生成一個(gè) Release
- Tiller 將 Release 發(fā)送給 Kubernetes 用于生成 Release
Chart Update 更新過(guò)程
- Helm 從指定的目錄或者 TAR 文件中解析出 Chart 結(jié)構(gòu)信息
- Helm 將需要更新的 Release 的名稱(chēng)赶熟、Chart 結(jié)構(gòu)和 Values 信息傳遞給 Tiller
- Tiller 生成 Release 并更新指定名稱(chēng)的 Release 的 History
- Tiller 將 Release 發(fā)送給 Kubernetes 用于更新 Release
Chart Rollback 回滾過(guò)程
- Helm 將要回滾的 Release 的名稱(chēng)傳遞給 Tiller
- Tiller 根據(jù) Release 的名稱(chēng)查找 History
- Tiller 從 History 中獲取上一個(gè) Release
- Tiller 將上一個(gè) Release 發(fā)送給 Kubernetes 用于替換當(dāng)前 Release
Chart 處理依賴
Tiller 在處理 Chart 時(shí),直接將 Chart 以及其依賴的所有 Charts 合并為一個(gè) Release陷嘴,同時(shí)傳遞給 Kubernetes映砖。因此 Tiller 并不負(fù)責(zé)管理依賴之間的啟動(dòng)順序。Chart 中的應(yīng)用需要能夠自行處理依賴關(guān)系灾挨。
安裝 Helm
安裝客戶端 Helm
Helm 的安裝方式很多邑退,這里采用二進(jìn)制的方式安裝。更多安裝方法可以參考 Helm 的 官方幫助文檔
# 下載
wget https://get.helm.sh/helm-v2.11.0-linux-amd64.tar.gz
# 解壓
tar -zxvf helm-v2.11.0-linux-amd64.tar.gz
# 復(fù)制客戶端執(zhí)行文件到 bin 目錄下
cp linux-amd64/helm /usr/local/bin/
安裝服務(wù)端 Tiller
Tiller 是以 Deployment 方式部署在 Kubernetes 集群中的劳澄,只需使用以下指令便可簡(jiǎn)單的完成安裝
helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.11.0 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
給 Tiller 授權(quán)
Helm 的服務(wù)端 Tiller 是一個(gè)部署在 Kubernetes 中 <font color=red>Kube-system</font> Namespace 下的 Deployment地技,它會(huì)去連接 kube-api
在 Kubernetes 里創(chuàng)建和刪除應(yīng)用。
從 Kubernetes 1.6 版本開(kāi)始秒拔,API Server 啟用了 RBAC 授權(quán)莫矗。目前的 Tiller 部署時(shí)默認(rèn)沒(méi)有定義授權(quán)的 ServiceAccount,這會(huì)導(dǎo)致訪問(wèn) API Server 時(shí)被拒絕砂缩。所以我們需要明確為 Tiller 部署添加授權(quán)
- 創(chuàng)建一個(gè)名為
tiller-adminuser.yaml
的配置文件作谚,為 Tiller 創(chuàng)建服務(wù)帳號(hào)和綁定角色
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller-cluster-rule
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
kubectl apply -f tiller-adminuser.yaml
- 為 Tiller 設(shè)置帳號(hào)
# 使用 kubectl patch 更新 API 對(duì)象
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
# 輸出如下
deployment.extensions/tiller-deploy patched
- 查看是否授權(quán)成功
kubectl get deploy --namespace kube-system tiller-deploy --output yaml|grep serviceAccount
# 輸出如下
serviceAccount: tiller
serviceAccountName: tiller
驗(yàn)證安裝是否成功
kubectl -n kube-system get pods|grep tiller
# 輸出如下
tiller-deploy-6d74cd8c9d-v6zg4 1/1 Running 0 10m
helm version
# 輸出如下
Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
卸載 Tiller
如果你需要在 Kubernetes 中卸載已部署的 Tiller,可使用以下命令完成卸載
helm reset