目錄linux
Kubernetes 是一個提供了基於容器的應用集羣管理解決方案,Kubernetes 爲容器化應用提供了部署運行、資源調度、服務發現和動態伸縮等一系列完整功能。
Kubernetes 的核心設計理念是: 用戶定義要部署的應用程序的規則,而 Kubernetes 則負責按照定義的規則部署並運行應用程序。若是應用程序出現問題致使偏離了定義的規格,Kubernetes 負責對其進行自動修正。例如:定義的應用規則要求部署兩個實例(Pod),其中一個實例異常終止了,Kubernetes 會檢查到並從新啓動一個新的實例。
用戶經過使用 Kubernetes API 對象來描述應用程序規則,包括 Pod、Service、Volume、Namespace、ReplicaSet、Deployment、Job等等。通常這些資源對象的定義須要寫入一系列的 YAML 文件中,而後經過 Kubernetes 命令行工具 Kubectl 調 Kubernetes API 進行部署。git
以一個典型的三層應用 Wordpress 爲例,該應用程序就涉及到多個 Kubernetes API 對象,而要描述這些 Kubernetes API 對象就可能要同時維護多個 YAML 文件。
在進行 Kubernetes 軟件部署時,咱們面臨下述幾個問題:github
Helm 是 Deis 開發的一個用於 Kubernetes 應用的包管理工具,主要用來管理 Charts。有點相似於 Ubuntu 中的 APT 或 CentOS 中的 YUM。vim
Helm Chart 是用來封裝 Kubernetes 原生應用程序的一系列 YAML 文件。能夠在你部署應用的時候自定義應用程序的一些 Metadata,以便於應用程序的分發。api
對於應用發佈者而言,能夠經過 Helm 打包應用、管理應用依賴關係、管理應用版本併發布應用到軟件倉庫。bash
對於使用者而言,使用 Helm 後不用須要編寫複雜的應用部署文件,能夠以簡單的方式在 Kubernetes 上查找、安裝、升級、回滾、卸載應用程序。
作爲 Kubernetes 的一個包管理工具,Helm具備以下功能:
建立新的 chart
chart 打包成 tgz 格式
上傳 chart 到 chart 倉庫或從倉庫中下載 chart
在Kubernetes集羣中安裝或卸載 chart
管理用Helm安裝的 chart 的發佈週期服務器
本文中講到的是helm V2最新版本,V3版本也已經發布了beta版,在 Helm 3 中,Tiller 被移除了。併發
Helm
Helm 是一個命令行下的客戶端工具。主要用於 Kubernetes 應用程序 Chart 的建立、打包、發佈以及建立和管理本地和遠程的 Chart 倉庫。app
Tiller
Tiller 是 Helm 的服務端,部署在 Kubernetes 集羣中。Tiller 用於接收 Helm 的請求,並根據 Chart 生成 Kubernetes 的部署文件( Helm 稱爲 Release ),而後提交給 Kubernetes 建立應用。Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能。ide
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。
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 是用戶命令行工具,其主要負責以下:
Tiller Server是一個部署在Kubernetes集羣內部的 server,其與 Helm client、Kubernetes API server 進行交互。Tiller server 主要負責以下:
監聽來自 Helm client 的請求
經過 chart 及其配置構建一次發佈
安裝 chart 到Kubernetes集羣,並跟蹤隨後的發佈
經過與Kubernetes交互升級或卸載 chart
簡單的說,client 管理 charts,而 server 管理髮布 release
客戶端二進制文件下載地址: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
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
由於 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完成卸載。
命令自動補全
爲了方便 helm 命令的使用,Helm 提供了自動補全功能
若是使用 ZSH 請執行
$ source <(helm completion zsh)
若是使用 BASH 請執行
$ source <(helm completion bash) $ echo "source <(helm completion bash)" >> ~/.bashrc