What is Helm?
- The package manager for kubernetes, Helm is the best way to find, share, and use software built for kubernetes.
Helm helps you manage Kubernetes applications — Helm Charts helps you define, install, and upgrade even the most complex Kubernetes application.
Charts are easy to create, version, share, and publish — so start using Helm and stop the copy-and-paste madness.
The latest version of Helm is maintained by the CNCF - in collaboration with Microsoft, Google, Bitnami and the Helm contributor community.
Why use Helm?
kubernetes發布一個生產級別的微服務應用需要包含的內容;當環境中的微服務越來越多,單純通過手工的方式去管理將會非常混亂和負載。這時候Helm就應該登場了。

Helm Architecture

上面這張圖描述了Helm的幾個關鍵組件Helm(客戶端),Tiller(服務器),Repository(Chart軟件倉庫),Release(Chart運行的實例),Chart(軟件包)之前的關系。
重要概念
Helm 有三個重要概念:
- chart:包含了創建
Kubernetes的一個應用實例的必要信息 - config:包含了應用發布配置信息
- release:是一個 chart 及其配置的一個運行實例
Helm組件
Helm 有以下兩個組成部分:
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
Helm部署方法(1)
在其中一個K8S節點上安裝Helm Client(需要配置代理,否則無法下載安裝包)
$ curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6737 100 6737 0 0 3204 0 0:00:02 0:00:02 --:--:-- 3205 Downloading https://kubernetes-helm.storage.googleapis.com/helm-v2.9.0-linux-amd64.tar.gz Preparing to install into /usr/local/bin helm installed into /usr/local/bin/helm Run 'helm init' to configure helm.
Tiller 服務器安裝非常簡單,只需要執行 helm init(需要配置docker代理,否則Tiller Image無法從gcr.io下載)
$ helm init Creating /root/.helm Creating /root/.helm/repository Creating /root/.helm/repository/cache Creating /root/.helm/repository/local Creating /root/.helm/plugins Creating /root/.helm/starters Creating /root/.helm/cache/archive Creating /root/.helm/repository/repositories.yaml Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com Adding local repo with URL: http://127.0.0.1:8879/charts $HELM_HOME has been configured at /root/.helm. Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster. Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy. For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation Happy Helming!
驗證
$ helm version Client: &version.Version{SemVer:"v2.9.0", GitCommit:"f6025bb9ee7daf9fee0026541c90a6f557a3e0bc", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.9.0", GitCommit:"f6025bb9ee7daf9fee0026541c90a6f557a3e0bc", GitTreeState:"clean"}
配置RBAC
我的kubernetes 集群是1.10版本的,默認開啟了RBAC訪問控制,所以我們需要為Tiller創建一個ServiceAccount,讓他擁有執行的權限,詳細內容可以查看 Helm 文檔中的Role-based Access Control。
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"}}}}'
問題
部署完成后,發現無法install任何chart,查看tiller容器的的logs發現以下錯誤日志,google查詢到是2.9的bug,降級到2.8.2即可。

Helm部署方法(2)
安裝Helm Client,
直接在Helm Realese頁面下載二進制文件,這里下載的2.8.2版本,解壓后將可執行文件helm拷貝到/usr/local/bin目錄下即可,這樣Helm客戶端就在這台機器上安裝完成了。
$ helm version Client: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"}
安裝Helm Server,
執行命令
$ helm init
由於 Helm 默認會去gcr.io拉取鏡像,所以如果你當前執行的機器沒有配置科學上網的話可以實現下面的命令代替:
$ helm init --upgrade --tiller-image cnych/tiller:v2.8.2
創建Tiller ServiceAccount
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 version Client: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"}
$ helm list
參考文檔:
https://helm.sh/
https://blog.qikqiak.com/post/first-use-helm-on-kubernetes/
