关于 Kubernetes 系列其他文章的传送门
-
《 k8s 中的云原生应用管理利器 – Helm 》 您当前所在位置

什么是 Helm ?¶
Helm 就是一个类似于 yum 的东西,能够让用户一键安装、部署 k8s 之上的应用。它会把应用需要用到的各种资源的配置清单,打包在一个文件当中,通过 Helm install 下载到集群上,之后展开并应用到集群上,完成一键部署,大大减低了手动写配置清单的难度。
一句话总结:Helm 就是 k8s 中的应用程序管理工具。
关于 Helm2¶
工作逻辑:
Helm 只是一个 dff 客户端工具,在集群中有一个叫 Tailer 的守护进程,以 Pod 的形式运行,它才是真正执行相应部署任务的程序,而 Helm 就是 Tailer 的客户端。Helm 可以部署在任何位置,甚至是集群之外,只要它能和 Tailer 通信即可。
概念:
部署应用程序时需要用到的清单称为 chart,保存在一个仓库中。Helm 负责维护和管理 chart 清单,并提交给 Tailer。Tarler 负责将收到的 chart 创建为 chart release,并负责管理。chart 是个静态的定义,只有一个,而 chart release 可以有很多个,可以理解为 chart 是个进程,而 chart release 是子进程。
工作流程:
一些常用软件的维护方,已经把部署时需要用到的 chart 保存在仓库中,当用户创建程序时,Helm 连接到仓库去检索一个 chart,之后下载到本地并将其中的清单展开,一般为 yaml 格式。之后 Helm 把 chart 提交给 Tailer,再由 Tarler 提交给 apiServer,创建为 chart release。
自定义参数:
chart 是一个打包的配置清单模板文件,可以调用 config 文件中的各种值生成配置清单。而 config 一个文本配置文件,有一些键值数据,用户可以自定义一些配置。
Helm 和 Tarler 之间通信使用的 GRPC 协议。而 Tarler 和 apiServer 之间通信使用的则是 HTTPS。其实 apiServer 也支持 GRPC 协议。
关于 Helm3¶
Helm 2 是 C/S 架构,主要分为客户端 helm 和服务端 Tiller。
与之前版本相同,Helm 3 同样在 Release 页面提供了预编译好的二进制文件。差别在于原先的二进制包下载下来你会看到 helm 和 tiller,而 Helm 3 则只有 helm 的存在了。
Tiller 主要用于在 Kubernetes 集群中管理各种应用发布的版本,在 Helm 3 中移除了 Tiller, 版本相关的数据直接存储在了 Kubernetes 中。
关于 Helm3 的变动,从架构到使用上都有变化,必看读物:
官方的 Helm Hub 站点地址:https://hub.helm.sh/
安装 Helm¶
从二进制版本安装¶
Helm 要安装在能够运行 kubectl 命令的节点上,这个节点中应该有与 apiServer 通信的证书。因为安装后需要让 Helm 直接与 apiServer 通信去创建一个 Tarler 的 Pod。之后 Helm 才会只和 Tarler 通信,由 Tarler 去和 apiServer 联系。
- 下载 所需版本
- 解压
tar -zxvf helm-v3.0.0-linux-amd64.gz - 在解压后的目录中找到 helm 的二进制文件,然后将其移至所需的目标位置
mv linux-amd64/helm /usr/local/bin/helm - 之后就应该可以运行客户端了
helm help
这段是安装 Helm2 时需要的操作¶
默认情况下,Helm2 没有 k8s 集群的权限,所以应该提前创建一个 ServiceAccount,并为这个 SA 赋予一个拥有管理权限的 ClusterRole。
创建一个 tiller 的 SA 账户,并绑定在 k8s 内键的管理员集群角色 cluster-admin:
1 | kubectl create serviceaccount tiller -n kube-system |
初始化 Helm2:
init:初始化 Helm 自身和 Tarler 端;Service-account:指定 SA 账号;
1 | helm init --service-account tiller |
这段是安装 Helm3 时需要的操作¶
直接添加官方的仓库即可:
1 | helm repo add stable https://kubernetes-charts.storage.googleapis.com/ |
官方的 Helm Hub 站点地址:https://hub.helm.sh/
Helm3 命令¶
以下命令是在 helm3 中使用的,不确定在 helm2 能否使用。
helm repo update:更新仓库,建议每天使用前先更新;helm search repo redis:搜索仓库中的软件;helm show readme stable/redis:查看 redis 程序的自述文件;helm install redis stable/redis --set password=123qwe:下载 redis 的 chart 并安装;--set:定义一个变量的值;-f FILE:指定一个文件,从文件中加载变量。这两种定义的变量优先级最高;
helm uninstall redis:移除程序和 chart;helm list:移除程序和 chart;
chart 文件的目录结构¶
Helm 会把每一个 chart 下载到本地,保存在 /root/.cache/helm/repository 目录下。
Chart.yaml:用于描述当前 chart 的元数据文件,包括版本号、名称等;ci:是一个目录,用于保存部署时在不同环境下各种配置文件中的基础变量值。如不指定则使用default-values.yaml文件;values.yaml:为当前 chart 提供配置文件中变量的默认值。ci目录中的变量文件不是被直接使用的。默认情况下,是直接使用此文件的;其他模板文件引用此文件中的变量时,格式为.Values.image.repository,开头为固定格式表示从Values这个文件中加载变量;README.md:自述文件;templates:是一个目录,保存着模板文件。每个模板文件都要需要结合values.yaml文件中的值,加以处理以后才能生成真正可用的配置清单;templates/NOTES.txt:是各种配置清单模板的使用说明,一般会在使用helm install后显示;LICENSE:许可文件;requirements.yaml:描述当前 chart 所依赖的其他 chart,如果没有可以不定义;charts:是一个目录,保存所有被当前 chart 所依赖的其他 chart 的程序包;
chart 的创建、升级、回滚¶
创建 chart¶
使用以下命令创建一个 chart,会自动生成模板文件:
1 | -> # helm create myapp |
编辑 ./myapp/value.yaml 更改以下字段,定义要使用的容器:
1 | ... |
如何从本地 chart 创建:
helm lint myapp:查看指定的 chart 目录是否存在语法等方面的错误;helm install myapp ./myapp:从本地目录中加载 chart,并指定创建的名字为myapp;helm install --set service.type=NodePort myapp ./myapp/:默认此 chart 的 service type 为 ClusterIP,可以使用这种方式改变变量为NodePort,优先级最高;
升级 chart¶
升级 chart 的步骤:
1、先将 ./myapp/Chart.yaml 中关于 chart 的元数据信息升级版本,这里更改的只是属性信息,实际内容没有改变:
version: 0.1.0改为0.1.1;appVersion: 1.16.0改为1.16.1;
2、然后将镜像的版本进行升级,这是实质性的改变,编辑 ./myapp/value.yaml,将 tag 字段中的版本升级:
1 | ... |
升级语法:
helm upgrade [RELEASE] [CHART] [flags]
1 | helm upgrade --set server.type=NodePort myapp ./myapp |
回滚 chart¶
查看版本:
1 | -> # helm list |
回滚:
1 | -> # helm rollback myapp 1 |
再次查看版本:
1 | -> # helm list |
分发 chart¶
1 | helm package |
一些其他的管理命令¶
helm status:查看已部署的 chart 的状态,会显示刚部署后提示的哪些信息;get:仅下载,不安装;fetch:仅下载并自动解压到本地目录;dependency:管理依赖关系;会自动把依赖到的其他 chart 下载并放至 chart 中;