本文档基于 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,有几个概念:

  1. chart  创建 Kubernetes 应用程序所必需的一组信息。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在 Kubernetes 中的等价物。
  2. config  包含了可以合并到打包的 chart 中的配置信息,用于创建一个可发布的对象。
  3. release  是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的  release
  4. 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  # 卸载