kubernetes實戰篇之helm安裝

系列目錄html

Helm是kubernetes的應用包管理工具,是CNCF孵化器下的一個項目,主要用來管理 Charts。相似於 Ubuntu 中的 APT 或 CentOS 中的 YUM.它提供了一種簡單的方法來發現,分享和使用爲kubernetes準備的軟件包.它消除了繁雜的配置和部署,從而極大提升開發者的生效效率.mysql

怎樣來理解它呢,假設咱們的項目很是複雜,同時須要部署api網關,註冊中心,配置中心,web服務,數據庫中間件,消息隊列中間件和緩存中間件...這將會產生大量的配置文件,若是以上操行的順序不對或者某些參數不對,就可能形成整個系統部署失敗.若是你通過一段時間的實踐熟悉了整個部署流程,可是把工做交給其它同事時他仍然可能須要大量的時間來了解部署方案,若是你要把本身的方案在互聯網上分享,開發者每每想要一鍵部署,對於繁雜的配置可能會望而卻步.實踐中部署一個wordpress僅一個web項目和一個mysql服務器的部署就着實把很多開發者折騰的不輕,更不用說像上面複雜的配置了...linux

而helm正是要解決這樣的問題,它把一系列複雜的有狀態和無狀態服務的部署封裝起來(實際上就是對yaml文件的組織),而後你能夠暴露出一些自定義參數信息供用戶選擇,這樣部署就會變得簡單不少.下面咱們對helm的一些經常使用術語進行介紹並展現如何安裝helmgit

helm相關術語

  • Helm 是一個命令行下的客戶端工具。主要用於 Kubernetes 應用程序 Chart 的建立、打包、發佈以及建立和管理本地和遠程的 Chart 倉庫。github

  • Tiller 是 Helm 的服務端,部署在 Kubernetes 集羣中。Tiller 用於接收 Helm 的請求,並根據 Chart 生成 Kubernetes 的部署文件( Helm 稱爲 Release ),而後提交給 Kubernetes 建立應用。Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能。web

  • Chart Helm 的軟件包,採用 TAR 格式。相似於 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一組定義 Kubernetes 資源相關的 YAML 文件sql

  • Repoistory Helm 的軟件倉庫,Repository 本質上是一個 Web 服務器,該服務器保存了一系列的 Chart 軟件包以供用戶下載,而且提供了一個該 Repository 的 Chart 包的清單文件以供查詢。Helm 能夠同時管理多個不一樣的 Repository。數據庫

  • Release 使用 helm install 命令在 Kubernetes 集羣中部署的 Chart 稱爲 Releasewindows

注:須要注意的是:Helm 中提到的 Release 和咱們一般概念中的版本有所不一樣,這裏的 Release 能夠理解爲 Helm 使用 Chart 包部署的一個應用實例。centos

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 中的應用須要可以自行處理依賴關係。

安裝過程

1) 先在 K8S 集羣上每一個節點安裝 socat 軟件,否則會報以下錯誤:

E0522 22:22:15.492436   24409 portforward.go:331] an error occurred forwarding 38398 -> 44134: error forwarding port 44134 to pod dc6da4ab99ad9c497c0cef1776b9dd18e0a612d507e2746ed63d36ef40f30174, uid : unable to do port forwarding: socat not found.
Error: cannot connect to Tiller
# YUM 安裝(每一個節點都要安裝)
yum install -y socat

要驗證socat是否已經安裝,在命令容器輸入sockat

2) 下載helm release

每個版本HELM提供多種操做系統的二進制版本。能夠手動下載和安裝這些版本。

下載頁面https://github.com/helm/helm/releases/

注意下載的時候選擇下載的是Installation and Upgrading下面的包,而不是下面assets裏面的內容

注意以上github下載連接地址其實指向的是storage.googleapis.com這個地址目前在國內仍是能訪問的,可是時好時壞,經過wget下載不少能會失敗,建議在windows上點擊連接下載,若是未能下載成功而後再進行重試,多重試幾回就能下載成功了,固然有上網軟件更好啦!

3) 解壓並拷貝

tar -xzvf helm-v2.12.0-linux-amd64.tar.gz
cd linux-amd64 && mv helm /usr/bin/

壓縮中包含兩個可執行文件helm,tiller。其中tiller爲server,若採用容器化部署到kubernetes中,則能夠不用管tiller,只需將helm複製到/usr/bin目錄便可。

4) 安裝服務端(Tiller)

```bash

建立服務端

helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

建立TLS認證服務端,參考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md

helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 --tiller-tls-cert /etc/kubernetes/ssl/tiller001.pem --tiller-tls-key /etc/kubernetes/ssl/tiller001-key.pem --tls-ca-cert /etc/kubernetes/ssl/ca.pem --tiller-namespace kube-system --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

若遇到錯誤 failed to list: configmaps is forbidden: User 「system:serviceaccount:kube-system:default」 cannot list configmaps in the namespace 「kube-system」

執行如下命令

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"}}}}'

這裏在init的時候須要指定鏡像源是由於init的時候襯tiller服務端,服務端是以deployment的方式安裝的.

也能夠嘗試如下一鍵安裝命令

$ curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh

注意如下內容參照了這一篇文章,實際在安裝時沒有及時記錄下來,因此個人帳戶已是正常的了,不知道是新版本的已經默認建立的sa仍是我本身手動建立而後忘記了.這裏也貼出來,初學的朋友不要懼怕,即使是默認已經建立了,再執行如下命令也不會致使錯誤發生的.

給 Tiller 受權
由於 Helm 的服務端 Tiller 是一個部署在 Kubernetes 中 Kube-System Namespace 下 的 Deployment,它會去鏈接 Kube-Api 在 Kubernetes 裏建立和刪除應用。

而從 Kubernetes 1.6 版本開始,API Server 啓用了 RBAC 受權。目前的 Tiller 部署時默認沒有定義受權的 ServiceAccount,這會致使訪問 API Server 時被拒絕。因此咱們須要明確爲 Tiller 部署添加受權。

可能看了以上描述的朋友依然一頭霧水,不知所云,其實是由於helm自己能夠建立和刪除pod,所以它須要有操做權限.

  • 建立 Kubernetes 的服務賬號和綁定角色
$ kubectl get deployment --all-namespaces
NAMESPACE     NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-system   tiller-deploy          1         1         1            1           1h
$ kubectl create serviceaccount --namespace kube-system tiller
$ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
  • 爲 Tiller 設置賬號
使用 kubectl patch 更新 API 對象
$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
deployment.extensions "tiller-deploy" patched
  • 查看是否受權成功
$ kubectl get deploy --namespace kube-system   tiller-deploy  --output yaml|grep  serviceAccount
serviceAccount: tiller
serviceAccountName: tiller
  • 驗證 Tiller 是否安裝成功
[centos@k8s-master ~]$ kubectl -n kube-system get pods|grep tiller
tiller-deploy-6df646875f-ttbn7         1/1     Running   5          15d
[centos@k8s-master ~]$ helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

helm客戶端和服務端的版本必須是一致的才能正常工做

helm命令智能補全

source <(helm completion bash)

對於zsh命令,則使用以下命令

source <(helm completion zsh)

卸載helm

使用中你會發現,helm並不像想像的那樣能正常完美工做,時爾會出現一些小問題,可使用如下命令來卸載

helm reset

查看 helm 版本信息

[centos@k8s-master tekton]$ helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
相關文章
相關標籤/搜索