本文档基于 Helm 3.14.0 整理而来。
1 Helm 的背景
Kubernetes 提供了基于容器的应用集群管理,为容器化应用提供了部署运行、资源调度、服务发现和动态等一系列完整功能。
Kubernetes 的核心设计理念是:用户定义应用程序的规格,Kubernetes 负责按照定义的规则部署并运行应用程序,并当应用程序出现问题时,进行自动修正,如 Deployment 下的自动重启。
用户通过使用 Kubernetes API 对象来描述应用程序规格,包括 Pod,Service,Volume,Namespace,ReplicaSet,Deployment,Job 等等。一般这些对象需要写入一系列的 yaml 文件中,然后通过 kubernetes 命令行工具 kubectl 进行部署。
然而,当一个系统需要较多的配置文件时,使用 Kubernetes 进行部署,往往会遇到下面的问题:
- 如何管理、编辑和更新这些分散的应用配置文件?
- 如何将一套相关配置文件作为一个整体应用进行管理?
- 如何分发和重用 kubernetes 的应用配置?
Helm 就是用来解决上面的问题。
2 Helm 是什么
Helm 是 Kubernetes 的包管理器,用户可以以简单的方式打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
除此以外,Helm 还提供了 Kubernetes 上的软件部署,删除,升级,回滚应用的强大功能。
Helm 是 Go 编程语言来编写的,源码地址:GitHub - helm/helm: The Kubernetes Package Manager
Helm 官方文档:Helm | Docs
Helm 安装方法:Helm | 安装 Helm
这个库使用 Kubernetes 客户端库与 Kubernetes 通信。现在,这个库使用 REST+JSON。它将信息存储在 Kubernetes 的密钥中。不需要自己的数据库。
3 Helm 的功能
Helm 可以做以下的事情:
- 从头开始创建新的 chart
- 将 chart 打包成归档(tgz)文件
- 与存储 chart 的仓库进行交互
- 在现有的 Kubernetes 集群中安装和卸载 chart
- 管理与 Helm 一起安装的 chart 的发布周期
4 Helm 组件及概念
对于 Helm,有几个概念:
- chart 创建 Kubernetes 应用程序所必需的一组信息。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在 Kubernetes 中的等价物。
- config 包含了可以合并到打包的 chart 中的配置信息,用于创建一个可发布的对象。
- release 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。
- Repository 是用来存放和共享 charts 的地方,类似于 Docker Hub。
而 Helm 是一个可执行文件,执行时分成两个不同的部分:
Helm 客户端 是终端用户的命令行客户端。负责以下内容:
- 本地 chart 开发
- 管理仓库
- 管理发布
- 与 Helm 库建立接口
- 发送安装的 chart
- 发送升级或卸载现有发布的请求
Helm 库 提供执行所有 Helm 操作的逻辑。与 Kubernetes API 服务交互并提供以下功能:
- 结合 chart 和配置来构建版本
- 将 chart 安装到 Kubernetes 中,并提供后续发布对象
- 与 Kubernetes 交互升级和卸载 chart
独立的 Helm 库封装了 Helm 逻辑以便不同的客户端可以使用它。
5 Helm 简单使用
helm create mychart # 创建一个 helm chart
helm package ./mychart # helm chart 打包
helm install mychart-release-name mychart-1.0.0.tgz.gz # 安装
helm uninstall mychart-release-name # 卸载