10.3.2 Helm 与 Chart

相信读者朋友们知道 Linux 的包管理工具和封装格式,如 Debian 系的 apt-get 和 dpkg,RHEL 系的 yum 和 rpm。在 Linux 系统中,有了包管理工具,我们只要知道应用名称,就能从仓库中下载、安装、升级或回滚。而且,包管理工具掌握应用的依赖和版本信息,应用依赖的第三方库,在安装时都会一并处理好。

Helm 于 2015 年由 Deis(后被 Microsoft 收购)创建,借鉴了各大 Linux 发行版的应用管理方式,引入了与 Linux 包管理对应的 Chart 格式和 Repository 仓库概念。对于用户而言,使用 Helm 无需手动编写部署文件、无需了解 Kubernetes 的 YAML 语法,只需一行命令,即可在 Kubernetes 集群内安装所需应用。


图 Helm 的工作原理

Chart 是一个包含描述 Kubernetes 相关资源的文件集合。以官方仓库中 WordPress 应用为例,它的 Chart 目录结构是这样的。

WordPress
 |—— charts                           // 存放依赖的chart
 ├── templates                        // 存放应用一系列 Kubernetes 资源的 YAML 模板,通过渲染变量得到部署文件
 │     ├── NOTES.txt                  // 为用户提供一个关于 chart 部署后使用说明的文件
 |     |—— _helpers.tpl               // 存放能够复用的模板
 │     ├── deployment.yaml
 │     ├── externaldb-secrets.yaml
 │     └── ingress.yaml
 │     └── ....
 └── Chart.yaml                       // chart 的基本信息(名称、版本、许可证、自述、说明、图标,等等)
 └── requirements.yaml                // 应用的依赖关系,依赖项指向的是另一个应用的坐标(名称、版本、Repository 地址)
 └── values.yaml                      // 存放全局变量,templates 目录中模板文件中用到变量的值

以模版目录中的 deployment.yaml 为例,它的内容如下。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-nginx
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
      - name: nginx
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        ports:
        - containerPort: 80

部署应用时,Helm 会先将管理员指定的值覆盖 values.yaml 中的默认值,然后通过字符串替换将这些值传递给 templates 目录中的资源模板,最终渲染为 Kubernetes 资源文件,在 Kubernetes 集群中以 Release 的形式管理。

Release 是 Helm Chart 的运行实例,它将多个 Kubernetes 资源抽象为一个整体,用户无需单独操作每个资源,而是通过 Helm 提供的命令(如 helm install、helm upgrade、helm rollback 等)进行统一管理。

Helm 提供了应用生命周期、版本、依赖项的管理能力,还支持与 CI/CD 流程的集成,强大的功能使它在业内备受瞩目,业内流行的应用纷纷提供 Helm Chart 格式的版本。2020 年,由云原生计算基金会(CNCF)牵头开发的 Artifact Hub,全球规模最大的 Helm 仓库,用户可以在这里找到数以千计的 Helm Charts,一键部署各种应用(如数据库、消息队列、监控工具、CI/CD 系统、日志处理工具)。

不过,需要明确的是,Helm 本质是简化 Kubernetes 应用安装与配置的工具。对于“有状态应用”(Stateful Application)来说,Helm 无法进行精细的生命周期管理。例如,它无法处理数据备份、扩缩容、分区重平衡、动态扩展等操作,这些都是在管理复杂有状态应用时所必须考虑的细节!

如何对复杂有状态应用提供全生命周期的管理,是接下介绍的 Operator 的课题。

总字数:848
Last Updated:
Contributors: isno