Helm 在 Docker EE 環境下的安裝


Helm 是 Kubernetes 環境下的軟體包管理工具。可以這樣想像,Kubernetes 環境下的 Helm 猶如作業系統 CentOS 中的 yum. Helm使用稱為 chart 的軟體包格式,裡面包含描述 Kubernetes 應用程式資源的純文字文件,可用來部署簡單的內容例如 memcached pod,或者複雜的內容例如 HTTP server,DB,cache 等完整 Web 應用程序堆疊。Docker 容器化將單一程式封裝到單一個映像檔中,而 Helm 將整合一支應用系統所包含的多個微服務程式各自的映像檔(image),及相關資源配置,打包到單一應用程式軟體包中封裝,且基於 chart 軟體包格式來做 Kubernetes 應用程式的分發散佈,如此更符合大型企業應用的需求。

Helm 由兩部分組成,客戶端 helm 和服務端 tiller:
helm 是安裝在本地 docker host 運行的一个命令行工具;
tiller 安裝運行在 Kubernetes cluster 上,管理部署在 Kubernetes cluster 的 chart 軟體包,

Docker EE 2.0 cluster 支援 Kubernetes 的編配, 在 Docker EE 環境下安裝 Helm 是有可能完成的,這篇文章詳細介紹如何在 Docker EE 環境下安裝 Helm (包含以上提到的 helm 客戶端以及 tiller 服務端兩者)並進而利用 Helm 來部署 K8s 應用程式。

實驗開始前已經先建立好 Docker EE UCP cluster, (關於如何建立 Docker EE UCP cluster 請參閱其他文章), 本次所使用的 Docker EE 引擎以及 kubectl 版本如下所示:

$ docker version 
Client: Docker Enterprise Edition (EE) 2.0
Version:      17.06.2-ee-16
API version:  1.30
Go version:   go1.8.7
Git commit:   9ef4f0a
Built:        Thu Jul 26 16:41:28 2018
OS/Arch:      linux/amd64

Server: Docker Enterprise Edition (EE) 2.0
Engine:
Version:      17.06.2-ee-16
API version:  1.30 (minimum version 1.12)
Go version:   go1.8.7
Git commit:   9ef4f0a
Built:        Thu Jul 26 16:42:11 2018
OS/Arch:      linux/amd64
Experimental: false
Universal Control Plane:
Version:       3.0.3
ApiVersion:                   1.30
Arch:                         amd64
BuildTime:                    Thu Jul 26 15:50:45 UTC 2018
GitCommit:                    1aab64b
GoVersion:                    go1.9.4
MinApiVersion:                1.20
Os:                           linux
Kubernetes:
Version:      1.8+
buildDate:                   2018-04-26T16:51:21Z
compiler:                    gc
gitCommit:                   8d637aedf46b9c21dde723e29c645b9f27106fa5
gitTreeState:                clean
gitVersion:                  v1.8.11-docker-8d637ae
goVersion:                   go1.8.3
major:                       1
minor:                       8+
platform:                    linux/amd64
Calico:
Version:          v3.0.8
cni:                             v2.0.6
kube-controllers:                v2.0.5
node:                            v3.0.8

$ kubectl version 
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"8+", GitVersion:"v1.8.11-docker-8d637ae", GitCommit:"8d637aedf46b9c21dde723e29c645b9f27106fa5", GitTreeState:"clean", BuildDate:"2018-04-26T16:51:21Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl config current-context 
ucp_192.168.100.51:6443_admin



下載 Helm tarball,這裡我們用的版本是 v2.10
# download helm
$ wget -c https://storage.googleapis.com/kubernetes-helm/helm-v2.10.0-linux-amd64.tar.gz 
$ tar -xvzf helm-v2.10.0-linux-amd64.tar.gz

解開後會產生 linux-amd64 目錄,該目錄下有一個執行文件 helm ,把它安裝在系統中
# copy helm
$ sudo cp linux-amd64/helm /usr/local/bin/

初始化 Helm

# Initialize Helm
$ helm init 

這將會在你的家目錄下建立 .helm 目錄,並且安裝 Tiller ,如果安裝成功,類似訊息如下:


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.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
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.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}

更新 helm 軟體倉庫清單


$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈ 

到目前為止看起來很順利。但是用如下命令列出 helm 軟體倉庫清單卻有問題:

# Error :(
$ helm ls
Error: configmaps is forbidden: User "system:serviceaccount:kube-system:default" cannot list configmaps in the namespace "kube-system": access denied

必須先在 Docker EE 環境下建立對應的 k8s service account, 先在命令行環境下用 kubectl


$ kubectl create serviceaccount --namespace kube-system tiller
serviceaccount "tiller" created

namespace 是 kube-system, service account 是 tiller,

然後打開瀏覽器登入任一 UCP 節點,在 UCP manager web UI 畫面左邊菜單找到 User Management > Grants
這將會帶出 Grants 清單,注意到右上角有一個藍底白字的 Create 按鈕,
按下去建立新的 Grant 並參照下面截圖依序設定,

第一步:Subject, Type 選擇 service account, Namespace 選擇 kube-system, 接著 service account 選擇 tiller. 這 UI 操作過程很直覺流暢。再來按下 Next 按鈕,進行下一步。

第二步:Role, Type 選擇 Full Control, 再來按下 Next 按鈕,進行下一步。

Type 選擇 namespaces, 可看到這時候右邊多了一個選項,按一下啟動 Apply grant to all existing and new namespaces, 最後要按右下角藍底白字的 Create 按鈕進行保存,

成功後可以看到對應的 tiller service account 出現在 Grants 列表上:

回到 CLI 命令行環境,輸入下列命令打補丁,


$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
deployment.extensions "tiller-deploy" patched

以上,就完成了 Helm 在 Docker EE 的基本安裝!

之後在命令行中可以用 helm install 命令來直接安裝我們所需要的 helm charts,同時這也可提供我們做更多的進階應用。

具體 Helm 使用方法請參考下面連結。


【參考資料】

https://success.docker.com/article/installing-helm-on-docker-ee-2-0

https://docs.helm.sh/using_helm/#using-helm


留言

這個網誌中的熱門文章

Docker 環境下的 Proxy 配置