k8s的應用打包工具Helm


每個成功的軟件平台都有一個優秀的打包系統,比如 Debian、Ubuntu 的 apt,Redhat、Centos 的 yum。而 Helm 則是 Kubernetes 上的包管理器。

本章我們將討論為什么需要 Helm,它的架構和組件,以及如何使用 Helm。

1.Why Helm

Helm 到底解決了什么問題?為什么 Kubernetes 需要 Helm?

答案是:Kubernetes 能夠很好地組織和編排容器,但它缺少一個更高層次的應用打包工具,而 Helm 就是來干這件事的。

先來看個例子。
比如對於一個 MySQL 服務, Kubernetes 需要部署下面這些對象:

1.Service,讓外界能夠訪問到 MySQL。

2.Secret,定義 MySQL 的密碼。

3.PersistentVolumeClaim,為 MySQL 申請持久化存儲空間。

4.Deployment,部署 MySQL Pod,並使用上面的這些支持對象。

我們可以將上面這些配置保存到對象各自的文件中,或者集中寫進一個配置文件,然后通過 kubectl apply -f 部署。

到目前為止,Kubernetes 對服務的部署支持得都挺好,如果應用只由一個或幾個這樣的服務組成,上面的部署方式完全足夠了。

但是,如果我們開發的是微服務架構的應用,組成應用的服務可能多達十個甚至幾十上百個,這種組織和管理應用的方式就不好使了:

  1. 很難管理、編輯和維護如此多的服務。每個服務都有若干配置,缺乏一個更高層次的工具將這些配置組織起來。

  2. 不容易將這些服務作為一個整體統一發布。部署人員需要首先理解應用都包含哪些服務,然后按照邏輯順序依次執行 kubectl apply。即缺少一種工具來定義應用與服務,以及服務與服務之間的依賴關系。

  3. 不能高效地共享和重用服務。比如兩個應用都要用到 MySQL 服務,但配置的參數不一樣,這兩個應用只能分別拷貝一套標准的 MySQL 配置文件,修改后通過 kubectl apply 部署。也就是說不支持參數化配置和多環境部署。

  4. 不支持應用級別的版本管理。雖然可以通過 kubectl rollout undo 進行回滾,但這只能針對單個 Deployment,不支持整個應用的回滾。

  5. 不支持對部署的應用狀態進行驗證。比如是否能通過預定義的賬號訪問 MySQL。雖然 Kubernetes 有健康檢查,但那是針對單個容器,我們需要應用(服務)級別的健康檢查。

Helm 能夠解決上面這些問題,Helm 幫助 Kubernetes 成為微服務架構應用理想的部署平台。

2.Helm架構

Helm 有兩個重要的概念:chart 和 release。

chart 是創建一個應用的信息集合,包括各種 Kubernetes 對象的配置模板、參數定義、依賴關系、文檔說明等。chart 是應用部署的自包含邏輯單元。可以將 chart 想象成 apt、yum 中的軟件安裝包。

release 是 chart 的運行實例,代表了一個正在運行的應用。當 chart 被安裝到 Kubernetes 集群,就生成一個 release。chart 能夠多次安裝到同一個集群,每次安裝都是一個 release。

Helm 是包管理工具,這里的包就是指的 chart。Helm 能夠:

  1. 從零創建新 chart。

  2. 與存儲 chart 的倉庫交互,拉取、保存和更新 chart。

  3. 在 Kubernetes 集群中安裝和卸載 release。

  4. 更新、回滾和測試 release。

Helm 包含兩個組件:Helm 客戶端 和 Tiller 服務器。

Helm 客戶端是終端用戶使用的命令行工具,用戶可以:

  1. 在本地開發 chart。

  2. 管理 chart 倉庫。

  3. 與 Tiller 服務器交互。

  4. 在遠程 Kubernetes 集群上安裝 chart。

  5. 查看 release 信息。

  6. 升級或卸載已有的 release。

Tiller 服務器運行在 Kubernetes 集群中,它會處理 Helm 客戶端的請求,與 Kubernetes API Server 交互。Tiller 服務器負責:

  1. 監聽來自 Helm 客戶端的請求。

  2. 通過 chart 構建 release。

  3. 在 Kubernetes 中安裝 chart,並跟蹤 release 的狀態。

  4. 通過 API Server 升級或卸載已有的 release。

簡單的講:Helm 客戶端負責管理 chart;Tiller 服務器負責管理 release。

3.Helm的部署

3.1Helm 客戶端

通常,我們將 Helm 客戶端安裝在能夠執行 kubectl 命令的節點上,只需要下面一條命令:(需要翻牆)

curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash

執行 helm version 驗證。

[root@k8s-master app]# mv linux-amd64/helm /usr/local/bin/helm

目前只能查看到客戶端的版本,服務器還沒有安裝。

3.2Tiller 服務器

Tiller 服務器安裝非常簡單,只需要執行 helm init

 

Tiller 本身也是作為容器化應用運行在 Kubernetes Cluster 中的:

查看日志

kubectl describe pod --namespace=kube-system

沒法翻牆鏡像pull失敗,於是在網上找了個鏡像壓縮包

 根據日志tiller需要版本v2.11.0而現在我們這個是v2.9.0需要改一下tag

docker tag gcr.io/kubernetes-helm/tiller:v2.9.0 gcr.io/kubernetes-helm/tiller:v2.11.0

將鏡像打包 分發給工作節點node1 和node2

docker save  gcr.io/kubernetes-helm/tiller:v2.11.0 tiller-v2.11.0.tar

 

可以看到 Tiller 的 Service、Deployment 和 Pod。

現在, helm version 已經能夠查看到服務器的版本信息了。

 

Helm 部署完畢,能科學上網的最好用科學上網 下載最新的,不然在使用的時候版本不一致會出現問題。

 

4.Helm的使用

Helm 安裝成功后,可執行 helm search 查看當前可安裝的 chart。

這個列表很長,這里只截取了一部分。大家不禁會問,這些 chart 都是從哪里來的?

前面說過,Helm 可以像 apt 和 yum 管理軟件包一樣管理 chart。apt 和 yum 的軟件包存放在倉庫中,同樣的,Helm 也有倉庫。

Helm 安裝時已經默認配置好了兩個倉庫:stable 和 localstable 是官方倉庫,local 是用戶存放自己開發的 chart 的本地倉庫。

helm search 會顯示 chart 位於哪個倉庫,比如 local/cool-chart 和 stable/acs-engine-autoscaler

用戶可以通過 helm repo add 添加更多的倉庫,比如企業的私有倉庫,倉庫的管理和維護方法請參考官網文檔 https://docs.helm.sh

與 apt 和 yum 一樣,helm 也支持關鍵字搜索:

包括 DESCRIPTION 在內的所有信息,只要跟關鍵字匹配,都會顯示在結果列表中。

安裝 chart 也很簡單,執行如下命令可以安裝 MySQL。

helm install stable/mysql

如果看到如下報錯,通常是因為 Tiller 服務器的權限不足。

 

執行如下命名添加權限:

kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

 

 

 需要添加倉庫

helm repo list    #列出所有源,當前還沒有添加源
# 添加一個國內可以訪問的阿里源,不過好像最近不更新了
helm repo add ali https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts  
如果能連外網,可以加google,f8
helm repo add google https://kubernetes-charts.storage.googleapis.com 
helm repo add fabric8 https://fabric8.io/helm
# 更新源
helm repo update

無法科學上網,只好老實的加一條阿里的倉庫

 

輸出分為三部分:

① chart 本次部署的描述信息:

NAME 是 release 的名字,因為我們沒用 -n 參數指定,Helm 隨機生成了一個,這里是 piquant-parrot

NAMESPACE 是 release 部署的 namespace,默認是 default,也可以通過 --namespace 指定。

STATUS 為 DEPLOYED,表示已經將 chart 部署到集群。

② 當前 release 包含的資源:Service、Deployment、Secret 和 PersistentVolumeClaim,其名字都是 fun-zorse-mysql,命名的格式為 ReleasName-ChartName

③ NOTES 部分顯示的是 release 的使用方法。比如如何訪問 Service,如何獲取數據庫密碼,以及如何連接數據庫等。

通過 kubectl get 可以查看組成 release 的各個對象

 

因為我們還沒有准備 PersistentVolume,當前 release 還不可用。

helm list 顯示已經部署的 release,helm delete 可以刪除 release

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM