1. Helm 架构总览:核心组件与概念解析
Helm v3 是 Kubernetes 生态中最流行的包管理工具,其架构设计在 v3 版本中经历了重大简化——最显著的变化是移除了 Tiller 组件。本章从架构组件、Chart、Repo、Release 四个维度,系统梳理 Helm v3 的核心概念与调度逻辑。
1.1 Helm v3 架构组件:Tiller 移除后的变化
Helm v2 采用客户端-服务端架构,客户端(Helm CLI)与集群内的 Tiller 服务端通信,Tiller 负责管理 Release 状态并执行安装/升级操作。这种设计带来了权限过大、多租户隔离困难、升级风险高等问题。
Helm v3 彻底移除了 Tiller,改为纯客户端架构。Helm CLI 直接通过 Kubernetes API Server 与集群交互,Release 状态信息存储在 Kubernetes Secret 中,而非由 Tiller 维护。
| 对比维度 | Helm v2 | Helm v3 |
|---|---|---|
| 服务端组件 | Tiller(集群内运行) | 无(纯客户端) |
| Release 状态存储 | Tiller 内存 + ConfigMap | Kubernetes Secret |
| 权限模型 | Tiller 拥有集群级权限 | 使用当前 kubeconfig 用户权限 |
| 多租户支持 | 弱(Tiller 共享) | 强(按命名空间隔离) |
| 升级回滚 | 依赖 Tiller 状态 | 依赖 Secret 历史记录 |
| 安装复杂度 | 需先部署 Tiller | 直接使用 helm 命令 |
1.2 Chart:应用打包与描述标准
Chart 是 Helm 的应用打包格式,本质是一个遵循特定目录结构的文件集合。一个 Chart 包含描述应用元数据的 Chart.yaml、定义 Kubernetes 资源模板的 templates/ 目录、以及默认配置值文件 values.yaml。
标准 Chart 目录结构如下:
mychart/
├── Chart.yaml # Chart 元数据(名称、版本、描述等)
├── values.yaml # 默认配置值
├── values.schema.json # (可选)值校验 schema
├── charts/ # (可选)子 Chart 依赖
├── templates/ # Kubernetes 资源模板(Go template 语法)
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── _helpers.tpl # 模板辅助函数
│ └── NOTES.txt # 安装后提示信息
├── crds/ # (可选)CRD 定义
└── README.md # 使用说明
Chart.yaml 中的 appVersion 字段用于标识应用版本,version 字段标识 Chart 包版本,两者可以不同。
1.3 Repo:Chart 分发与索引机制
Helm Repo(仓库)是 Chart 包的存储和分发中心。一个 Repo 本质上是一个 HTTP/HTTPS 服务器,提供 index.yaml 索引文件和 Chart 压缩包(.tgz)。
Repo 的核心工作流程:
- 索引构建:Chart 维护者将 Chart 打包为
.tgz并上传到 Repo 服务器,同时生成index.yaml索引文件。 - 仓库添加:用户通过
helm repo add将 Repo URL 注册到本地缓存。 - 索引同步:
helm repo update从远程 Repo 拉取最新的index.yaml到本地。 - Chart 搜索与下载:
helm search repo在本地索引中查找 Chart,helm pull下载 Chart 包。
| 命令 | 作用 | 示例 |
|---|---|---|
helm repo add |
添加 Chart 仓库 | helm repo add bitnami https://charts.bitnami.com/bitnami |
helm repo list |
列出已添加的仓库 | helm repo list |
helm repo update |
更新本地仓库索引 | helm repo update |
helm search repo |
在仓库中搜索 Chart | helm search repo nginx |
helm pull |
下载 Chart 包到本地 | helm pull bitnami/nginx --version 15.0.0 |
1.4 Release:Chart 的运行实例
Release 是 Chart 在 Kubernetes 集群中的一次具体部署实例。每次执行 helm install 都会创建一个新的 Release,并分配一个唯一的 Release Name。Release 记录了 Chart 版本、配置值、部署时间、状态等完整信息。
Release 的生命周期包含以下状态:
- pending-install:安装请求已提交,资源尚未完全创建。
- deployed:Release 已成功部署,资源正常运行。
- failed:安装或升级过程中发生错误。
- pending-upgrade:升级请求已提交,正在执行。
- pending-rollback:回滚请求已提交,正在执行。
- superseded:被新版本替代的历史 Release 版本。
- uninstalled:Release 已被卸载,但历史记录保留。
sh.helm.release.v1.<release-name>.v<revision>。不要手动修改这些 Secret,否则可能导致 Release 状态不一致。
1.5 核心概念关系总结
Chart、Repo、Release 三者构成了 Helm 的完整工作链路:
| 概念 | 类比 | 核心作用 | 存储位置 |
|---|---|---|---|
| Chart | 应用安装包(如 .deb/.rpm) | 定义应用的所有 Kubernetes 资源模板 | 本地文件系统或 Repo 服务器 |
| Repo | 软件源(如 apt/yum 源) | Chart 的索引与分发中心 | HTTP/HTTPS 服务器 |
| Release | 已安装的应用实例 | 记录部署状态、版本历史、配置值 | Kubernetes Secret(目标命名空间) |
Helm v3 通过移除 Tiller,将 Release 管理下沉到 Kubernetes 原生资源(Secret),既简化了架构,又提升了安全性和可扩展性。后续章节将深入探讨如何通过 Chart 模板实现控制平面调度策略与资源映射。