Helm簡(jiǎn)介

一、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è)主要部分:

helm架構(gòu)圖

圖片來(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)行安裝

  1. 在github上選擇對(duì)應(yīng)版本,點(diǎn)擊這里
$ wget "https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz"
  1. 解壓
tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
  1. 將二進(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)。

參考文檔

Helm Document

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容