Helm基本介绍及快速入门

x33g5p2x  于2022-02-24 转载在 其他  
字(7.4k)|赞(0)|评价(0)|浏览(533)

Helm基本介绍及快速入门

一、Helm基本介绍

Helm简介

很多人都使用过Ubuntu下的ap-get或者CentOS下的yum, 这两者都是Linux系统下的包管理工具。用apt-get/yum,应用开发者可以管理应用包之间的依赖关系,发布应用;用户则可以以简单的方式查找、安装、升级、卸载应用程序

我们可以将Helm看作Kubernetes下的apt-get/yum

Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。

对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库

对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库

除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能

Helm 相关组件及概念

Helm 包含两个组件,分别是 helm 客户端 和 Tiller 服务器:

  • helm :是一个命令行工具,用于本地开发及管理chart,chart仓库管理等
  • chart: Helm 的软件包,采用 TAR 格式,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源
  • release: 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release
  • Repoistory:Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。

二、Helm部署

Helm客户端安装

方式一:使用官方提供的脚本一键安装

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

方式二:手动下载安装

#从官网下载最新版本的二进制安装包到本地:https://github.com/kubernetes/helm/releases
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz # 解压压缩包
# 把 helm 指令放到bin目录下
mv linux-amd64/helm /usr/local/bin/helm
helm help # 验证

校验是否安装成功

root@k8s1:~# helm version
version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"clean", GoVersion:"go1.15.11"}

注意:helm 3版本,没有Tiller,也就不用安装Tiller

三、Helm 使用

使用仓库(helm repo)

若遇到Unable to get an update from the “stable” chart repository (https://kubernetes-charts.storage.googleapis.com) 错误手动更换stable 存储库为阿里云的存储库

# 查看仓库
helm repo list
# 移除原先的仓库
helm repo remove stable
# 添加新的仓库地址
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库
helm repo update
  • helm search hubArtifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库
  • helm search repo 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。
root@k8s1:~# helm search repo mongo
NAME                              	CHART VERSION	APP VERSION	DESCRIPTION                                       
aliyun/mongodb                    	0.4.27       	3.7.1      	NoSQL document-oriented database that stores JS...
aliyun/mongodb-replicaset         	2.3.1        	3.6        	NoSQL document-oriented database that stores JS...
$ helm search hub wordpress

含义:

  1. 从 Artifact Hub 中搜索所有的 wordpress charts
  2. 如果不进行过滤,helm search hub 命令会展示所有可用的 charts。
  3. Helm 搜索使用模糊字符串匹配算法,所以你可以只输入名字的一部分

安装一个helm包(helm install)

使用 helm install 命令来安装一个新的 helm 包。最简单的使用方法只需要传入两个参数:你命名的release名字和你想安装的chart的名称。

$ helm install mymongodb bitnami-azure/mongodb

现在mongodb chart 已经安装。注意安装chart时创建了一个新的 release 对象。上述发布被命名为 mymongodb。 (如果想让Helm生成一个名称,删除发布名称并使用--generate-name。)

查看release的配置信息(helm status)

root@k8s1:~# helm status mymongodb
NAME: mymongodb
LAST DEPLOYED: Thu Feb 24 06:35:10 2022
NAMESPACE: onecloud
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mongodb
CHART VERSION: 11.0.3
APP VERSION: 4.4.12

** Please be patient while the chart is being deployed **

MongoDB® can be accessed on the following DNS name(s) and ports from within your cluster:

    mymongodb.onecloud.svc.cluster.local

To get the root password run:

    export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace onecloud mymongodb -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)

To connect to your database, create a MongoDB® client container:

    kubectl run --namespace onecloud mymongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image marketplace.azurecr.io/bitnami/mongodb:4.4.12-debian-10-r12 --command -- bash

Then, run the following command:
    mongo admin --host "mymongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace onecloud svc/mymongodb 27017:27017 &
    mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD

查看我安装mongodb的密码:

方式一:

root@k8s1:~# echo $(kubectl get secret --namespace onecloud mymongodb -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)

方式二:

查看当前部署的所有 release(helm list)

helm list -n [命名空间名称]

例如:
helm list -n default

不加命名空间就是helm进行安装的时候安装在默认的命名空间中

自定义安装chart

上述安装方式只会使用chart的默认配置选项,很多时候,我们需要自定义 chart 来指定我们想要的配置

# 查看 chart 中的可配置选项
$ helm show values bitnami/wordpress

然后,你可以使用 YAML 格式的文件覆盖上述任意配置项,并在安装过程中使用该文件

$ echo '{mariadb.auth.database: user0db, mariadb.auth.username: user0}' > values.yaml
$ helm install -f values.yaml bitnami/wordpress --generate-name

上述命令将为 MariaDB 创建一个名称为 user0 的默认用户,并且授予该用户访问新建的 user0db 数据库的权限。chart 中的其他默认配置保持不变。

安装过程中有两种方式传递配置数据

  • --values (或 -f):使用 YAML 文件覆盖配置。可以指定多次,优先使用最右边的文件
  • --set:通过命令行的方式对指定项进行覆盖

如果同时使用两种方式,则 --set 中的值会被合并到 --values 中,但是 --set 中的值优先级更高。在--set 中覆盖的内容会被被保存在 ConfigMap 中。可以通过 helm get values <release-name> 来查看指定 release 中 --set 设置的值。也可以通过运行 helm upgrade 并指定 --reset-values 字段来清除 --set 中设置的值。

--set 的格式和限制

--set 选项使用0或多个 name/value 对。最简单的用法类似于:--set name=value,等价于如下 YAML 格式:

name: value

多个值使用逗号分割,因此 --set a=b,c=d 的 YAML 表示是:

a: b
c: d

支持更复杂的表达式。例如,--set outer.inner=value 被转换成了:

outer:
  inner: value

列表使用花括号({})来表示。例如,--set name={a, b, c} 被转换成了:

name:
  - a
  - b
  - c

从 2.5.0 版本开始,可以使用数组下标的语法来访问列表中的元素。例如 --set servers[0].port=80 就变成了:

servers:
  - port: 80

多个值也可以通过这种方式来设置。--set servers[0].port=80,servers[0].host=example 变成了:

servers:
  - port: 80
    host: example

如果需要在 --set 中使用特殊字符,你可以使用反斜线来进行转义;--set name=value1\,value2 就变成了:

name: "value1,value2"

升级release(helm upgrade)

  • 首先创建好panda.yaml
mariadb:
  auth:
    password: zYWQ1WTJVT
    rootPassword: 6WtGXOkPlp
    username: user1
wordpressPassword: 93sTSYPuT4
  • 执行命令helm upgrade
$ helm upgrade -f panda.yaml happy-panda bitnami/wordpress
  • 查看结果helm get values
root@k8s1:~/huanglei/helm# helm get values mywordpress
USER-SUPPLIED VALUES:
mariadb:
  auth:
    password: zYWQ1WTJVT
    rootPassword: 6WtGXOkPlp
    username: user1
wordpressPassword: 93sTSYPuT4

回滚release(helm rollback)

格式:helm rollback [RELEASE] [REVISION]

$ helm rollback mywordpress 1

上面这条命令将我们的 mywordpress 回滚到了它最初的版本。release 版本其实是一个增量修订(revision)。 每当发生了一次安装、升级或回滚操作,revision 的值就会加1。第一次 revision 的值永远是1。我们可以使用 helm history [RELEASE] 命令来查看一个特定 release 的修订版本号

$ helm history mywordpress
REVISION	UPDATED                 	STATUS    	CHART            	APP VERSION	DESCRIPTION     
1       	Thu Feb 24 07:41:57 2022	superseded	wordpress-13.0.11	5.9.0      	Install complete
2       	Thu Feb 24 08:01:52 2022	superseded	wordpress-13.0.11	5.9.0      	Upgrade complete
3       	Thu Feb 24 08:07:25 2022	deployed  	wordpress-13.0.11	5.9.0      	Rollback to 1

查看回滚结果:

root@k8s1:~/huanglei/helm# helm get values mywordpress
USER-SUPPLIED VALUES:
null

卸载release(helm uninstall)

格式:helm uninstall 名称

$ helm uninstall mywordpress

校验:

root@k8s1:~/huanglei/helm# helm list
NAME	NAMESPACE	REVISION	UPDATED	STATUS	CHART	APP VERSION

注意:

  1. 在上一个 Helm 版本中,当一个 release 被删除,会保留一条删除记录。而在 Helm 3 中,删除也会移除 release 的记录
  2. 如果你想保留删除记录,使用 helm uninstall --keep-history。使用 helm list --uninstalled 只会展示使用了 --keep-history 删除的 release

安装、升级、回滚的有用选项

要查看所有参数的说明,请执行 helm <command> --help 命令。

  • --timeout:一个 Go duration类型的值, 用来表示等待 Kubernetes 命令完成的超时时间,默认值为 5m0s
  • --wait:表示必须要等到所有的 Pods 都处于 ready 状态,PVC 都被绑定,Deployments 都至少拥有最小 ready 状态 Pods 个数(Desired减去 maxUnavailable),并且 Services 都具有 IP 地址(如果是LoadBalancer, 则为 Ingress),才会标记该 release 为成功。最长等待时间由 --timeout 值指定。如果达到超时时间,release 将被标记为 FAILED。注意:当 Deployment 的 replicas 被设置为1,但其滚动升级策略中的 maxUnavailable 没有被设置为0时,--wait 将返回就绪,因为已经满足了最小 ready Pod 数。
  • --no-hooks:不运行当前命令的钩子
  • --recreate-pods(仅适用于 upgraderollback):这个参数会导致重建所有的 Pod(deployment中的Pod 除外)。(在 Helm 3 中已被废弃)

创建你自己的charts(helm create)

$ helm create deis-workflow
Creating deis-workflow

现在,./deis-workflow 目录下已经有一个 chart 了。你可以编辑它并创建你自己的模版。

在编辑 chart 时,可以通过 helm lint 验证格式是否正确。

当准备将 chart 打包分发时,你可以运行 helm package 命令:

$ helm package deis-workflow
deis-workflow-0.1.0.tgz

然后这个 chart 就可以很轻松的通过 helm install 命令安装:

$ helm install deis-workflow ./deis-workflow-0.1.0.tgz

打包好的 chart 可以上传到 chart 仓库中

helm push chart.tgz repoName    上传chart到chart仓库
例:helm push demo.tgz harbor-10.30.12.211 --username=admin --password=Harbor12345

更多安装方式

  • chart 的仓库(helm install mymongodb bitnami-azure/mongodb)
  • 本地 chart 压缩包(helm install foo foo-0.1.1.tgz
  • 解压后的 chart 目录(helm install foo path/to/foo
  • 完整的 URL(helm install foo https://example.com/charts/foo-1.2.3.tgz

相关文章