1、Kubernetes 應用部署的挑戰
Kubernetes 是一個提供了基於容器的應用集群管理解決方案,Kubernetes 為容器化應用提供了部署運行、資源調度、服務發現和動態伸縮等一系列完整功能。
Kubernetes 的核心設計理念是: 用戶定義要部署的應用程序的規則,而 Kubernetes 則負責按照定義的規則部署並運行應用程序。如果應用程序出現問題導致偏離了定義的規格,Kubernetes 負責對其進行自動修正。例如:定義的應用規則要求部署兩個實例(Pod),其中一個實例異常終止了,Kubernetes 會檢查到並重新啟動一個新的實例。
用戶通過使用 Kubernetes API 對象來描述應用程序規則,包括 Pod、Service、Volume、Namespace、ReplicaSet、Deployment、Job等等。一般這些資源對象的定義需要寫入一系列的 YAML 文件中,然后通過 Kubernetes 命令行工具 Kubectl 調 Kubernetes API 進行部署。
以一個典型的三層應用 Wordpress 為例,該應用程序就涉及到多個 Kubernetes API 對象,而要描述這些 Kubernetes API 對象就可能要同時維護多個 YAML 文件。
在進行 Kubernetes 軟件部署時,我們面臨下述幾個問題:
- 如何管理、編輯和更新這些這些分散的 Kubernetes 應用配置文件。
- 如何把一套相關的配置文件作為一個應用進行管理。
- 如何分發和重用 Kubernetes 的應用配置
2、Helm 是什么
Helm 是 Deis 開發的一個用於 Kubernetes 應用的包管理工具,主要用來管理 Charts。有點類似於 Ubuntu 中的 APT 或 CentOS 中的 YUM。
Helm Chart 是用來封裝 Kubernetes 原生應用程序的一系列 YAML 文件。可以在你部署應用的時候自定義應用程序的一些 Metadata,以便於應用程序的分發。
對於應用發布者而言,可以通過 Helm 打包應用、管理應用依賴關系、管理應用版本並發布應用到軟件倉庫。
對於使用者而言,使用 Helm 后不用需要編寫復雜的應用部署文件,可以以簡單的方式在 Kubernetes 上查找、安裝、升級、回滾、卸載應用程序。
做為 Kubernetes 的一個包管理工具,Helm具有如下功能:
創建新的 chart
chart 打包成 tgz 格式
上傳 chart 到 chart 倉庫或從倉庫中下載 chart
在Kubernetes集群中安裝或卸載 chart
管理用Helm安裝的 chart 的發布周期
3、Helm 組件及相關術語
本文中講到的是helm V2最新版本,V3版本也已經發布了beta版,在 Helm 3 中,Tiller 被移除了。
-
Helm
Helm 是一個命令行下的客戶端工具。主要用於 Kubernetes 應用程序 Chart 的創建、打包、發布以及創建和管理本地和遠程的 Chart 倉庫。 -
Tiller
Tiller 是 Helm 的服務端,部署在 Kubernetes 集群中。Tiller 用於接收 Helm 的請求,並根據 Chart 生成 Kubernetes 的部署文件( Helm 稱為 Release ),然后提交給 Kubernetes 創建應用。Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能。 -
Chart
包含了創建Kubernetes的一個應用實例的必要信息,Helm 的軟件包,采用 TAR 格式。類似於 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一組定義 Kubernetes 資源相關的 YAML 文件。 -
Repoistory
Helm 的軟件倉庫,Repository 本質上是一個 Web 服務器,該服務器保存了一系列的 Chart 軟件包以供用戶下載,並且提供了一個該 Repository 的 Chart 包的清單文件以供查詢。Helm 可以同時管理多個不同的 Repository。 -
Release
是一個 chart 及其配置的一個運行實例,使用 helm install 命令在 Kubernetes 集群中部署的 Chart 稱為 Release。
4、Helm 工作原理
-
Chart Install 過程
Helm 從指定的目錄或者 TAR 文件中解析出 Chart 結構信息。
Helm 將指定的 Chart 結構和 Values 信息通過 gRPC 傳遞給 Tiller。
Tiller 根據 Chart 和 Values 生成一個 Release。
Tiller 將 Release 發送給 Kubernetes 用於生成 Release。 -
Chart Update 過程
Helm 從指定的目錄或者 TAR 文件中解析出 Chart 結構信息。
Helm 將需要更新的 Release 的名稱、Chart 結構和 Values 信息傳遞給 Tiller。
Tiller 生成 Release 並更新指定名稱的 Release 的 History。
Tiller 將 Release 發送給 Kubernetes 用於更新 Release。 -
Chart Rollback 過程
Helm 將要回滾的 Release 的名稱傳遞給 Tiller。
Tiller 根據 Release 的名稱查找 History。
Tiller 從 History 中獲取上一個 Release。
Tiller 將上一個 Release 發送給 Kubernetes 用於替換當前 Release。 -
Chart 處理依賴說明
Tiller 在處理 Chart 時,直接將 Chart 以及其依賴的所有 Charts 合並為一個 Release,同時傳遞給 Kubernetes。因此 Tiller 並不負責管理依賴之間的啟動順序。Chart 中的應用需要能夠自行處理依賴關系。
Helm Client 是用戶命令行工具,其主要負責如下:
- 本地 chart 開發
- 倉庫管理
- 與 Tiller sever 交互
- 發送預安裝的 chart
- 查詢 release 信息
- 要求升級或卸載已存在的 release
Tiller Server是一個部署在Kubernetes集群內部的 server,其與 Helm client、Kubernetes API server 進行交互。Tiller server 主要負責如下:
監聽來自 Helm client 的請求
通過 chart 及其配置構建一次發布
安裝 chart 到Kubernetes集群,並跟蹤隨后的發布
通過與Kubernetes交互升級或卸載 chart
簡單的說,client 管理 charts,而 server 管理發布 release
5、Helm 安裝
5.1 客戶端安裝
客戶端二進制文件下載地址:https://github.com/helm/helm/releases
解壓后將可執行文件helm拷貝到/usr/local/bin目錄下即可,這樣Helm客戶端就在這台機器上安裝完成了。
[root@master01 helm-soft]# mv linux-amd64/helm /usr/local/bin/
[root@master01 helm-soft]# helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Error: could not find tiller
5.2 安裝服務端 Tiller
Tiller 是以 Deployment 方式部署在 Kubernetes 集群中的,只需使用以下指令便可簡單的完成安裝,使用阿里雲鏡像安裝並把默認倉庫設置為阿里雲上的鏡像倉庫
[root@master01 helm-soft]# helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
$HELM_HOME has been configured at /root/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!
[root@master01 helm-soft]# kubectl get pods -n kube-system |grep tiller-deploy
tiller-deploy-6d99bc8567-zv9q8 1/1 Running 0 2m33s
[root@master01 helm-soft]# helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
如果在初始化時報錯
Error: cannot connect to Tiller
解決方法為在節點執行
yum install -y socat
5.3 給 Tiller 授權
因為 Helm 的服務端 Tiller 是一個部署在 Kubernetes 中 Kube-System Namespace 下 的 Deployment,它會去連接 Kube-Api 在 Kubernetes 里創建和刪除應用。
而從 Kubernetes 1.6 版本開始,API Server 啟用了 RBAC 授權。目前的 Tiller 部署時默認沒有定義授權的 ServiceAccount,這會導致訪問 API Server 時被拒絕。所以我們需要明確為 Tiller 部署添加授權。詳細內容可見https://docs.helm.sh/using_helm/#role-based-access-control
[root@master01 helm]# pwd
/root/manifest/helm
[root@master01 helm]# vim rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
[root@master01 helm]# kubectl create -f rbac.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
使用 kubectl patch 更新 API 對象,給 Tiller 打上一個 ServiceAccount 的補丁
[root@master01 helm]# kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
deployment.extensions/tiller-deploy patched
查看授權是否成功
[root@master01 helm]# kubectl get deploy --namespace kube-system tiller-deploy --output yaml|grep serviceAccount
serviceAccount: tiller
serviceAccountName: tiller
卸載 Helm 服務器端 Tiller
如果你需要在 Kubernetes 中卸載已部署的 Tiller,可使用命令helm reset完成卸載。
5.4 Helm 命令補全
命令自動補全
為了方便 helm 命令的使用,Helm 提供了自動補全功能
如果使用 ZSH 請執行
$ source <(helm completion zsh)
如果使用 BASH 請執行
$ source <(helm completion bash)
$ echo "source <(helm completion bash)" >> ~/.bashrc