目录
Helm 是什么?
Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来管理 Charts。有点类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。
Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。
对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。
对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。
使用 Helm 的优势
一般部署一个应用的过程:
- 编写yaml文件 ——》 创建 service 对外暴露 ——》 通过ingress域名访问
-
外部的应用访问集群内的服务有很多种方法,这里不细讲
-
不使用helm
- 只适合简单的应用。实际上我们部署微服务项目,可能有几十个服务,用这种方式就不合适了。需要维护大量的yaml文件。
使用helm
- 可以将大量yaml文件作为一个整体进行管理
- 实现yaml文件的高效复用。
- 实现应用级别的版本管理
Helm 整体架构
Helm 主要概念
- Chart:Chart 是一个 Helm 的软件包,采用 tar 格式。包含了运行一个K8S应用程序所需的镜像、依赖关系和资源定义等,也就是包含了一个应用所需资源对象的YAML文件。
- Repository(仓库):是 Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包供用户下载,并且提供了该 Repository 的 Chart 包的清单文件便于查询。
- Config(配置数据):部署时设置到 Chart 中的配置数据。
- Release:使用 helm install 命令在 k8s 集群中部署的 Chart 称为 Release 。是基于 Chart 和Config 部署到 K8S 集群中运行的一个实例。一个Chart可以被部署多次,每次的 Release 都不相同。
Helm 工作流程
- 开发人员将开发好的 Chart 上传到 Chart 仓库。
- 运维人员基于 Chart 的定义,设置必要的配置数据(Config),使用 Helm 命令行工具将应用一键部署到 K8S 集群中,以 Release 概念管理后续的更新回滚等。
- Chart 仓库中的 Chart 可以用于共享和分发。
Helm 版本
- V2版本Helm依赖Tiller组件。Tiller组件用于接收Helm客户端发出的指令,与K8S的API Server交互,完成资源对象的部署和管理。
- V3版本Helm不再使用Tiller组件,而是将API Server交互的功能整合到Helm客户端程序中。
Helm 部署安装
由于 helm 包在国外,国内通过这个网址进行下载:
wget https://mirrors.huaweicloud.com/helm/v3.3.1/helm-v3.3.1-linux-amd64.tar.gz
tar -zxvf helm-v3.3.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/
helm version
注: helm 客户端需要下载到安装了 kubectl 并且能执行能正常通过 kubectl 操作 kubernetes 的服务器上, 否则 helm 将不可用
构建一个 Helm Chart
helm create mychart
该命令创建了一个 mychart 目录,该目录结构如下所示。
[root@scweb ~]# tree mychart/
mychart/ # Chart 目录
├── charts # 这个 charts 依赖的其他 charts,始终被安装
├── Chart.yaml # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates # 模板目录
│ ├── deployment.yaml # deployment 控制器的 Go 模板文件
│ ├── _helpers.tpl # 以 _ 开头的文件不会部署到 k8s 上,可用于定制通用信息
│ ├── hpa.yaml # hpa 的模板文件
│ ├── ingress.yaml # ingress 的模板文件
│ ├── NOTES.txt # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值
│ ├── serviceaccount.yaml # serviceaccount 的 Go 模板文件
│ ├── service.yaml # service 的 Go 模板文件
│ └── tests # 测试pod目录
│ └── test-connection.yaml # 测试pod的deployment文件
└── values.yaml # 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件
Templates 目录下 YAML 文件模板的值默认都是在 values.yaml 里定义的,比如在 deployment.yaml 中定义的容器镜像。
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
其中的 .Values.image.repository 的值就是在 values.yaml 里定义的 nginx,.Values.image.tag 的值就是 stable。
$ cat mychart/values.yaml|grep repository
repository: nginx
$ cat mychart/values.yaml|grep tag
tag: stable
以上两个变量值是在 create chart
的时候就自动生成的默认值,可以根据实际情况进行修改。
Helm 基本命令
添加仓库地址
因为helm自带的仓库为境外仓库地址,拉取应用很慢。通过阿里云镜像安装的服务器端可以看到已经安装了很多charts。
helm repo add 存储库名 存储库URL
helm repo update
例如添加阿里云的仓库地址
helm repo add repo_name1 https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
因为仓库一直在更新,所以最好使用update更新一下
helm repo update
查看添加的仓库列表
helm repo list
据关键字检索chart包
$ helm search repo keyword
$ helm search hub keyword
上面2个命令仅仅在第3个字段有区别,repo表示在本地所添加的仓库中进行检索;hub表示在Helm Hub中进行检索。
查看helm包
$ helm inspect state/mysql
安装helm
最简单的情况下,它只需要一个 chart 的名称参数:
$ helm install stable/mysql
如果想使用自己的release名称 使用参数 --name 即可
可以通过 helm install --dry-run --debug 命令进行调试
查看安装的chart列表
$ helm list
更新charts列表以获取最新版本
helm repo update
查看chart包文件内容
helm show chart chartName # 查看chart包中的 chart.yaml 文件内容
# chart包可以是本地的未打包的chart目录(即 helm create 创建出来的chart目录),也可以是打包的chart压缩包(由helm package打包),也可以是保存在仓库中的chart包
helm show values chartName # 查看chart包中的values.yaml文件内容
helm show readme chartName #查看chart包中README文件内容
helm show all chartName # 查看chart包中chart.yaml、values.yaml、README文件内容
Release 相关
# 查看 release 的基本信息
helm status releaseName
# 卸载、升级、回滚
$ helm uninstall releaseName # 删除和该版本相关的所有相关资源(service、deployment、 pod等等)甚至版本历史。
# 加上参数:--keep-history,会保存版本历史
$ helm upgrade releaseName chartName
$ helm upgrade -f panda.yaml happy-panda bitnami/wordpress # 这个 release 使用相同的 chart 进行升级,但是使用了一个新的 YAML 文件
mariadb.auth.username: user1
# 可以使用 helm get values 命令来看看配置值是否真的生效了:
$ helm get values happy-panda
mariadb:
auth:
username: user1
# release 版本其实是一个增量修订(revision)每当发生了一次安装、升级或回滚操作, revision 的值就会加 1, 第一次 revision 的值永远是 1
# 可以使用 helm history [RELEASE] 命令来查看一个特定 release 的修订版本号。
$ helm rollback releaseName [REVISION]
有关Helm的简单介绍就到这里,helm是一个很强大的k8s包管理工具,想详细了解建议查阅官方文档,希望本文对大家有帮助!
官方文档:Helm | 快速入门指南