一、Helm核心概念:
Chart:一個(gè)helm的程序包;
Repostriy:Charts倉(cāng)庫(kù),https/http服務(wù);
-
Release:特定的chart部署與目標(biāo)集群上的一個(gè)實(shí)例;
Chart—>Config—>Release
程序架構(gòu):
- helm:客戶端,管理本地的Chart倉(cāng)庫(kù),管理Chart,與Tiller服務(wù)器交互,發(fā)送Chart,實(shí)例安裝、查詢、卸載等操作。
- Tiller:服務(wù)端,接受helm發(fā)來(lái)的Charts與Config,合并生成Release;
helm官方可用的chart列表:
helm官方可用的chart
go語(yǔ)言編寫(xiě),基于gRPC協(xié)議與Tiller進(jìn)行通信交互。
組件
Helm 有兩個(gè)主要部分:

圖片來(lái)自-Helm – Application deployment management for Kubernetes
Helm Client 是最終用戶的命令行客戶端。客戶端負(fù)責(zé)以下部分:
- 本地 chart 開(kāi)發(fā)
- 管理存儲(chǔ)庫(kù)
- 與 Tiller 服務(wù)交互
- 發(fā)送要安裝的 chart
- 查詢有關(guān)發(fā)布的信息
- 請(qǐng)求升級(jí)或卸載現(xiàn)有 release
Tiller Server 是一個(gè)集群內(nèi)服務(wù),與 Helm 客戶端進(jìn)行交互,并與 Kubernetes API 服務(wù)進(jìn)行交互。服務(wù)負(fù)責(zé)以下內(nèi)容:
- 監(jiān)聽(tīng)來(lái)自 Helm 客戶端的傳入請(qǐng)求
- 結(jié)合 chart 和配置來(lái)構(gòu)建發(fā)布
- 將 chart 安裝到 Kubernetes 中,然后跟蹤后續(xù) release
- 通過(guò)與 Kubernetes 交互來(lái)升級(jí)和卸載 chart
簡(jiǎn)而言之,客戶端負(fù)責(zé)管理 chart,而服務(wù)端負(fù)責(zé)管理 release。
二、helm的安裝
Helm Client安裝
基于二進(jìn)制文件進(jìn)行安裝
- 在github上選擇對(duì)應(yīng)版本,點(diǎn)擊這里
$ wget "https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz"
- 解壓
tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
- 將二進(jìn)制文件移動(dòng)到
bin目錄下
mv linux-amd64/helm /usr/local/bin/helm
腳本安裝
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh
或者使用的
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get | bash
Tiller server安裝
1.使用helm init命令進(jìn)行安裝,該命令將會(huì)在kubectl當(dāng)值context指定集群內(nèi)的kube-system命名空間創(chuàng)建一個(gè)deployment和一個(gè)Service。但是helm init時(shí)使用的Deployment使用的鏡像是gci.io/kubernetes-helm/tiller:[Helm-Verison],helm的版本可以通過(guò)helm version獲得。
如果服務(wù)器無(wú)法訪問(wèn)gcr.io,可以先pull下來(lái)鏡像,push至私有鏡像倉(cāng)庫(kù)。
初始化時(shí)使用-i或著--tiller-images指定鏡像
$ heml init -i [YOUR_REPO]/kubernetes-helm/tiller:v2.13.1
如果你的kubernetes cluster使用了RBAC還需要?jiǎng)?chuàng)建Serviceaccount rbac-config.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
創(chuàng)建RBAC
$ kubectl create -f rbac-config.yaml
serviceaccount "tiller" created
clusterrolebinding "tiller" created
$ helm init --service-account tiller --history-max 200
查看是否創(chuàng)建成功
$ kubectl get serviceaccount -n kube-system
NAME SECRETS AGE
default 1 107d
tiller 1 1min
查看的Tiller是否部署成功
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
tiller-deploy-8bc864b8d-9sl5z 1/1 Running 0 1min
測(cè)試安裝是否正確,helm是否可用,安裝redis,報(bào)錯(cuò)uid : unable to do port forwarding: socat not found. 詳細(xì)報(bào)錯(cuò)如下:
$ helm install stable/redis-ha --version 3.3.3
E0407 23:29:03.101684 24867 portforward.go:391] an error occurred forwarding 34855 -> 44134: error forwarding port 44134 to pod a37813193576bbb1f3ed88f318361608345766234eb8accdeaee494153be6ece, uid : unable to do port forwarding: socat not found.
解決方式:
$ yum install -y socat
三、helm的使用
helm install
$ helm install stable/redis
NAME: nosy-echidna
LAST DEPLOYED: Mon Apr 8 02:17:48 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/ConfigMap
NAME DATA AGE
nosy-echidna-redis 3 0s
nosy-echidna-redis-health 3 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
nosy-echidna-redis-master-0 0/1 Pending 0 0s
nosy-echidna-redis-slave-68d5f64f4f-6bzcx 0/1 ContainerCreating 0 0s
==> v1/Secret
NAME TYPE DATA AGE
nosy-echidna-redis Opaque 1 0s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nosy-echidna-redis-master ClusterIP 10.254.233.50 <none> 6379/TCP 0s
nosy-echidna-redis-slave ClusterIP 10.254.13.10 <none> 6379/TCP 0s
==> v1beta1/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nosy-echidna-redis-slave 0/1 1 0 0s
==> v1beta2/StatefulSet
NAME READY AGE
nosy-echidna-redis-master 0/1 0s
NOTES:
** Please be patient while the chart is being deployed **
Redis can be accessed via port 6379 on the following DNS names from within your cluster:
nosy-echidna-redis-master.default.svc.cluster.local for read/write operations
nosy-echidna-redis-slave.default.svc.cluster.local for read-only operations
To get your password run:
export REDIS_PASSWORD=$(kubectl get secret --namespace default nosy-echidna-redis -o jsonpath="{.data.redis-password}" | base64 --decode)
To connect to your Redis server:
1. Run a Redis pod that you can use as a client:
kubectl run --namespace default nosy-echidna-redis-client --rm --tty -i --restart='Never' \
--env REDIS_PASSWORD=$REDIS_PASSWORD \
--image docker.io/bitnami/redis:4.0.14 -- bash
2. Connect using the Redis CLI:
redis-cli -h nosy-echidna-redis-master -a $REDIS_PASSWORD
redis-cli -h nosy-echidna-redis-slave -a $REDIS_PASSWORD
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace default svc/nosy-echidna-redis 6379:6379 &
redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD
安裝完chart之后,helm會(huì)在kube-system下創(chuàng)建一個(gè)Configmap來(lái)保存Release數(shù)據(jù)信息。
$ kubectl get Configmap -n kube-system
NAME DATA AGE
extension-apiserver-authentication 1 107d
newbie-leopard.v1 1 2h
nosy-echidna.v1 1 2m
helm install 支持多種方式部署安裝
1.repostriy
2.本地Chart壓縮包
3.一個(gè)Chart目錄
helm install /opt/chart/redis
4.完整的URL
helm install https://example.com/charts/redis-5.0.1.tgz
搜索chart
首次安裝 Helm 時(shí),它已預(yù)配置為使用官方 Kubernetes chart 存儲(chǔ)庫(kù) repo。該 repo 包含許多精心設(shè)計(jì)和維護(hù)的 charts。此 charts repo 默認(rèn)以 stable 命名。
可以通過(guò)運(yùn)行 helm search 查看有哪些 charts 可用:
$ helm search
NAME VERSION DESCRIPTION
stable/drupal 0.3.2 One of the most versatile open source content m...
stable/jenkins 0.1.0 A Jenkins Helm chart for Kubernetes.
stable/mariadb 0.5.1 Chart for MariaDB
stable/mysql 0.1.0 Chart for MySQL
...
如果沒(méi)有使用過(guò)濾條件,helm search 顯示所有可用的 charts??梢酝ㄟ^(guò)使用過(guò)濾條件進(jìn)行搜索來(lái)縮小搜索的結(jié)果范圍:
$ helm search mysql
NAME VERSION DESCRIPTION
stable/mysql 0.1.0 Chart for MySQL
stable/mariadb 0.5.1 Chart for MariaDB
現(xiàn)在只會(huì)看到與過(guò)濾條件匹配的結(jié)果。
為什么 mariadb 在列表中?因?yàn)樗陌枋雠c MySQL 相關(guān)。我們可以使用 helm inspect chart 到這個(gè):
$ helm inspect stable/mariadb
Fetched stable/mariadb to mariadb-0.5.1.tgz
description: Chart for MariaDB
engine: gotpl
home: https://mariadb.org
keywords:
- mariadb
- mysql
- database
- sql
...
搜索是找到可用軟件包的好方法。一旦找到想要安裝的軟件包,可以使用 helm install 它來(lái)安裝它。
刪除chart
helm delete
使用helm list,列出所有Release
$ helm list
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
newbie-leopard 1 Sun Apr 7 23:34:14 2019 DEPLOYED redis-ha-3.3.3 5.0.3 default
nosy-echidna 1 Mon Apr 8 02:17:48 2019 DEPLOYED redis-6.4.3 4.0.14 default
刪除已經(jīng)部署的Release
$ helm delete newbie-leopard
release "newbie-leopard" deleted
自定義Chart配置
-
—set:在命令行設(shè)置參數(shù)。 -
--values或者使用-f: 使用yaml文件對(duì)參數(shù)進(jìn)行配置,可以設(shè)置多個(gè)文件,最后一個(gè)文件優(yōu)先生效。多個(gè)文件中重復(fù)的values會(huì)進(jìn)行的覆蓋,不用value會(huì)疊加生效。
如果同時(shí)使用兩個(gè)參數(shù),則—set會(huì)以高優(yōu)先級(jí)合并到—values中。
自定義打包應(yīng)用
Chart目錄結(jié)構(gòu)和配置文件的說(shuō)明
redis-ha
├── Chart.yaml #描述chart信息的yaml文件
├── OWNERS #
├── README.md #
├── templates #config 模板
│ ├── _helpers.tpl
│ ├── NOTES.txt
│ ├── redis-auth-secret.yaml
│ ├── redis-ha-announce-service.yaml
│ ├── redis-ha-configmap.yaml
│ ├── redis-ha-healthchecks.yaml
│ ├── redis-ha-pdb.yaml
│ ├── redis-ha-rolebinding.yaml
│ ├── redis-ha-role.yaml
│ ├── redis-ha-serviceaccount.yaml
│ ├── redis-ha-service.yaml
│ ├── redis-ha-statefulset.yaml
│ └── tests
│ ├── test-redis-ha-configmap.yaml
│ └── test-redis-ha-service.yaml
└── values.yaml #默認(rèn)的配置值
如果我們需要修改chart
下載Chart
$ helm fetch stable/redis
解壓對(duì)應(yīng)的下載下來(lái)的Chart
$ tar xvf redis-6.4.4.tar.gz
修改values.yaml中對(duì)應(yīng)的值為私有倉(cāng)庫(kù),redis的版本為,并重命名為test-redis
- repository: bitnami/redis
+ repository: reg.test.com/library/redis
- tag: 4.0.14
+ tag: 4.0
將Chart.yaml中的版本號(hào)修改為6.4.5,name為test-redis-ha
- name: redis
+ name: test-redis
- version: 6.4.4
+ version: 6.4.5
使用helm package test-redis打包c(diǎn)hart,會(huì)生成一個(gè)test-redis-6.4.5.tgz的壓縮文件
$ helm package .
Successfully packaged chart and saved it to: test-redis/test-redis-6.4.5.tgz
安裝Chart:通過(guò)helm install test-redis-ha-0.1.1.tgz 就可以將新生成的chart部署到kubernetes集群
$ helm install test-redis-6.4.5.tgz
helm upgrade(更新)和 helm rollbackup(回滾)
當(dāng)新版本的 chart 發(fā)布時(shí),或者當(dāng)你想要更改 release 配置時(shí),可以使用 helm upgrade 命令。
升級(jí)需要已有的 release 并根據(jù)提供的信息進(jìn)行升級(jí)。由于 Kubernetes chart 可能很大而且很復(fù)雜,因此 Helm 會(huì)嘗試執(zhí)行最小侵入式升級(jí)。它只會(huì)更新自上次發(fā)布以來(lái)發(fā)生更改的內(nèi)容。
$ helm upgrade -f panda.yaml happy-panda stable/mariadb
Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz
happy-panda has been upgraded. Happy Helming!
Last Deployed: Wed Sep 28 12:47:54 2016
Namespace: default
Status: DEPLOYED
...
在上面的例子中,happy-panda release 使用相同的 chart 進(jìn)行升級(jí),但使用新的 YAML 文件:
mariadbUser: user1
我們可以使用 helm get values 看看這個(gè)新設(shè)置是否生效。
$ helm get values happy-panda
mariadbUser: user1
該 helm get 命令是查看集群中的 release 的有用工具。正如我們上面所看到的,它表明我們的新值 panda.yaml 已被部署到群集中。
現(xiàn)在,如果在發(fā)布過(guò)程中某些事情沒(méi)有按計(jì)劃進(jìn)行,那么使用回滾到以前的版本很容易 helm rollback [RELEASE] [REVISION]。
$ helm rollback happy-panda 1
上述回滾我們的 “happy-panda” 到它的第一個(gè) release 版本。release 版本是增量修訂。每次安裝,升級(jí)或回滾時(shí),修訂版本號(hào)都會(huì)增加 1. 第一個(gè)修訂版本號(hào)始終為 1. 我們可以使用 helm history [RELEASE] 查看特定版本的修訂版號(hào)。