helm簡(jiǎn)介
很多人都使用過Ubuntu下的apt-get或者CentOS下的yum, 這兩者都是Linux系統(tǒng)下的包管理工具。采用apt-get/yum,應(yīng)用開發(fā)者可以管理應(yīng)用包之間的依賴關(guān)系,發(fā)布應(yīng)用;用戶則可以以簡(jiǎn)單的方式查找、安裝、升級(jí)、卸載應(yīng)用程序。
我們可以將Helm看作Kubernetes下的apt-get/yum。Helm是Deis (https://deis.com/) 開發(fā)的一個(gè)用于kubernetes的包管理器。每個(gè)包稱為一個(gè)Chart,一個(gè)Chart是一個(gè)目錄(一般情況下會(huì)將目錄進(jìn)行打包壓縮,形成name-version.tgz格式的單一文件,方便傳輸和存儲(chǔ))。
對(duì)于應(yīng)用發(fā)布者而言,可以通過Helm打包應(yīng)用,管理應(yīng)用依賴關(guān)系,管理應(yīng)用版本并發(fā)布應(yīng)用到軟件倉庫。
對(duì)于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml語法并編寫應(yīng)用部署文件,可以通過Helm下載并在kubernetes上安裝需要的應(yīng)用。
除此以外,Helm還提供了kubernetes上的軟件部署,刪除,升級(jí),回滾應(yīng)用的強(qiáng)大功能。
基本概念
Helm
Helm 是一個(gè)命令行下的客戶端工具。主要用于 Kubernetes 應(yīng)用程序 Chart 的創(chuàng)建、打包、發(fā)布以及創(chuàng)建和管理本地和遠(yuǎn)程的 Chart 倉庫。
Tiller
Tiller 是 Helm 的服務(wù)端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的請(qǐng)求,并根據(jù) Chart 生成 Kubernetes 的部署文件( Helm 稱為 Release ),然后提交給 Kubernetes 創(chuàng)建應(yīng)用。Tiller 還提供了 Release 的升級(jí)、刪除、回滾等一系列功能。
Chart
Helm 的軟件包,采用 TAR 格式。類似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一組定義 Kubernetes 資源相關(guān)的 YAML 文件。
Repoistory
Helm 的軟件倉庫,Repository 本質(zhì)上是一個(gè) Web 服務(wù)器,該服務(wù)器保存了一系列的 Chart 軟件包以供用戶下載,并且提供了一個(gè)該 Repository 的 Chart 包的清單文件以供查詢。Helm 可以同時(shí)管理多個(gè)不同的 Repository。
Release
使用 helm install 命令在 Kubernetes 集群中部署的 Chart 稱為 Release。
注:需要注意的是:Helm 中提到的 Release 和我們通常概念中的版本有所不同,這里的 Release 可以理解為 Helm 使用 Chart 包部署的一個(gè)應(yīng)用實(shí)例。
helm工作原理
Chart Install 過程:
Helm從指定的目錄或者tgz文件中解析出Chart結(jié)構(gòu)信息
Helm將指定的Chart結(jié)構(gòu)和Values信息通過gRPC傳遞給Tiller
Tiller根據(jù)Chart和Values生成一個(gè)Release
Tiller將Release發(fā)送給Kubernetes用于生成Release
Chart Update過程:
Helm從指定的目錄或者tgz文件中解析出Chart結(jié)構(gòu)信息
Helm將要更新的Release的名稱和Chart結(jié)構(gòu),Values信息傳遞給Tiller
Tiller生成Release并更新指定名稱的Release的History
Tiller將Release發(fā)送給Kubernetes用于更新Release
Chart Rollback過程:
Helm將要回滾的Release的名稱傳遞給Tiller
Tiller根據(jù)Release的名稱查找History
Tiller從History中獲取上一個(gè)Release
Tiller將上一個(gè)Release發(fā)送給Kubernetes用于替換當(dāng)前Release
helm安裝
我們需要安裝 Helm 客戶端到本地,同時(shí)安裝服務(wù)端 Tiller 到 Kubernetes 中
可以在Helm Realese頁面下載二進(jìn)制文件,這里下載的v2.14.2版本,解壓后將可執(zhí)行文件helm
拷貝到/usr/local/bin
目錄下即可,這樣Helm
客戶端就在這臺(tái)機(jī)器上安裝完成了。
$ wget https://get.helm.sh/helm-v2.14.2-linux-amd64.tar.gz
$ tar zxf helm-v2.14.2-linux-amd64.tar.gz
$ cd linux-amd64
$ cp helm /usr/local/bin
現(xiàn)在可以使用Helm
命令查看版本了,會(huì)提示無法連接到服務(wù)端Tiller
:
$ helm version
Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Error: could not find tiller
要安裝 Helm 的服務(wù)端程序,我們需要使用到kubectl工具,所以先確保kubectl工具能夠正常的訪問 kubernetes 集群的apiserver哦。
然后我們?cè)诿钚兄袌?zhí)行初始化操作:
$ helm init
由于 Helm 默認(rèn)會(huì)去gcr.io拉取鏡像,所以如果你當(dāng)前執(zhí)行的機(jī)器沒有配置科學(xué)上網(wǎng)的話可以實(shí)現(xiàn)下面的命令代替:
$ helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.2 --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.
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!
如果在安裝過程中遇到了一些其他問題,比如初始化的時(shí)候出現(xiàn)了如下錯(cuò)誤:
E0125 14:03:19.093131 56246 portforward.go:331] an error occurred forwarding 55943 -> 44134: error forwarding port 44134 to pod d01941068c9dfea1c9e46127578994d1cf8bc34c971ff109dc6faa4c05043a6e, uid : unable to do port forwarding: socat not found.
2018/01/25 14:03:19 (0xc420476210) (0xc4203ae1e0) Stream removed, broadcasting: 3
2018/01/25 14:03:19 (0xc4203ae1e0) (3) Writing data frame
2018/01/25 14:03:19 (0xc420476210) (0xc4200c3900) Create stream
2018/01/25 14:03:19 (0xc420476210) (0xc4200c3900) Stream added, broadcasting: 5
Error: cannot connect to Tiller
解決方案:在所有節(jié)點(diǎn)上安裝socat可以解決(node節(jié)點(diǎn)安裝)
$ yum install -y socat
Helm 服務(wù)端正常安裝完成后,Tiller默認(rèn)被部署在kubernetes集群的kube-system命名空間下:
$ kubectl get pod -n kube-system -l app=helm
NAME READY STATUS RESTARTS AGE
tiller-deploy-86b844d8c6-44fpq 1/1 Running 0 7m
此時(shí),我們查看 Helm 版本就都正常了:
helm version
Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
給 Tiller 授權(quán)
需要為Tiller
創(chuàng)建一個(gè)ServiceAccount
,讓他擁有執(zhí)行的權(quán)限,詳細(xì)內(nèi)容可以查看 Helm 文檔中的Role-based Access Control。 創(chuàng)建rbac-config.yaml
文件:
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
然后使用kubectl
創(chuàng)建:
$ kubectl create -f rbac-config.yaml
serviceaccount "tiller" created
clusterrolebinding.rbac.authorization.k8s.io "tiller" created
創(chuàng)建了tiller的 ServceAccount 后還沒完,因?yàn)槲覀兊?Tiller 之前已經(jīng)就部署成功了,而且是沒有指定 ServiceAccount 的,所以我們需要給 Tiller 打上一個(gè) ServiceAccount 的補(bǔ)丁:
$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
上面這一步非常重要,不然后面在使用 Helm 的過程中可能出現(xiàn)Error: no available release name found的錯(cuò)誤信息。
卸載 Helm 服務(wù)器端 Tiller
如果你需要在 Kubernetes 中卸載已部署的 Tiller,可使用以下命令完成卸載。
$ helm reset 或
$ helm reset --force
為了方便helm命令的使用,helm提供了自動(dòng)補(bǔ)全功能,helmj基于bash自動(dòng)補(bǔ)全:
source <(helm completion bash)
至此, Helm客戶端和服務(wù)端都配置完成了,接下來我們看看基本操作命令吧。
helm基礎(chǔ)操作命令:
若要查看在存儲(chǔ)庫中可用的所有 Helm charts,鍵入以下命令:
$ helm search
$ helm search mysql
若要查看詳細(xì)信息,鍵入:
$ helm inspect stable/mysql
appVersion: 5.7.14
description: Fast, reliable, scalable, and easy to use open-source relational database
system.
engine: gotpl
home: https://www.mysql.com/
icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
keywords:
- mysql
- database
- sql
maintainers:
- email: o.with@sportradar.com
name: olemarkus
- email: viglesias@google.com
name: viglesiasce
name: mysql
sources:
- https://github.com/kubernetes/charts
- https://github.com/docker-library/mysql
version: 0.10.1
---
## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.14"
...
若要查看在群集上安裝的Charts列表,鍵入:
$ helm list
更新repo
$ helm repo update
刪除releases
$ helm delete chartsnames1
徹底刪除releases
$ helm delete --purge mycharts
打包c(diǎn)hart:
$ helm package hello-helm
Successfully packaged chart and saved it to: /root/course/kubeadm/helm/hello-helm-0.1.0.tgz
查看之前的版本
$ helm history chartsname1
恢復(fù)之前的版本
$ helm rollback chartsname1 2
下載charts到本地
$ helm search chartsname1
$ helm fetch stable/chartsname1
ll # 查看下載的charts