1. Helm 基础回顾:架构、Chart 结构与核心概念
在深入多集群 Chart 部署与版本回滚治理之前,必须重新夯实 Helm 的基础知识。Helm 是 Kubernetes 生态中最成熟的包管理工具,它将复杂的应用资源定义封装为可复用、可版本化的 Chart,并通过 Release 机制管理每一次部署的生命周期。本节从架构演进、Chart 结构、核心概念三个维度进行系统回顾。
1.1 Helm 架构演进:从 Tiller 到 Helm v3
Helm 经历了从 v2 到 v3 的重大架构变革,核心变化在于移除了服务端组件 Tiller,并重构了安全模型与 Release 存储方式。下表对比了两个版本的关键差异:
| 对比维度 | Helm v2(Tiller 时代) | Helm v3(无 Tiller) |
|---|---|---|
| 服务端组件 | 需要 Tiller 部署在集群内 | 无服务端组件,直接调用 Kubernetes API |
| 安全模型 | Tiller 拥有集群级权限,存在安全风险 | 使用 kubeconfig 中的用户权限,遵循 RBAC |
| Release 存储 | 存储在 ConfigMap 中(默认命名空间) | 存储在 Secret 中(默认命名空间),支持加密 |
| 命名空间隔离 | Release 名称全局唯一 | Release 名称按命名空间隔离 |
| Chart 依赖管理 | 依赖 requirements.yaml | 依赖 Chart.yaml 中的 dependencies 字段 |
| CRD 处理 | 需要手动管理 CRD 安装顺序 | 支持 crds/ 目录自动安装 CRD |
关键结论:Helm v3 移除了 Tiller,使得 Helm 客户端可以直接使用当前用户的 Kubernetes 权限进行部署操作,大幅提升了安全性和多租户场景的适用性。本课程所有实践均基于 Helm v3。
下图展示了 Helm v3 的简化架构,客户端直接与 Kubernetes API Server 交互,不再需要中间代理组件:
1.2 Chart 结构详解
一个标准的 Helm Chart 是一个遵循特定目录结构的文件集合。理解 Chart 结构是编写可维护、可复用 Chart 的前提。以下是一个典型 Chart 的目录树:
my-chart/
├── Chart.yaml # Chart 元数据(名称、版本、描述、依赖)
├── values.yaml # 默认配置值
├── values.schema.json # (可选)values 的 JSON Schema 校验
├── charts/ # (可选)子 Chart 依赖包
├── crds/ # (可选)CRD 定义,helm install 时优先安装
├── templates/ # 模板文件目录
│ ├── NOTES.txt # (可选)安装后的使用说明
│ ├── _helpers.tpl # (可选)模板辅助函数
│ ├── deployment.yaml # Deployment 资源模板
│ ├── service.yaml # Service 资源模板
│ ├── ingress.yaml # Ingress 资源模板
│ ├── hpa.yaml # (可选)HPA 模板
│ ├── serviceaccount.yaml # (可选)ServiceAccount 模板
│ └── tests/ # (可选)测试 Pod 模板
│ └── test-connection.yaml
└── README.md # (可选)Chart 使用文档
最佳实践:在
templates/ 目录中,建议将每个 Kubernetes 资源类型拆分为独立的 YAML 文件,并使用 _helpers.tpl 集中管理公共标签和名称模板,避免重复代码。
下表列出了 Chart.yaml 中最重要的字段及其说明:
| 字段 | 类型 | 说明 |
|---|---|---|
apiVersion |
string | Chart API 版本,v2 用于 Helm 3 |
name |
string | Chart 名称 |
version |
string | Chart 语义化版本(SemVer 2) |
appVersion |
string | 应用版本号,与 Chart 版本独立 |
description |
string | Chart 简短描述 |
dependencies |
list | 子 Chart 依赖列表(Helm v3 方式) |
type |
string | application 或 library(Helm 3.2+) |
icon |
string | Chart 图标的 URL |
1.3 Helm 核心概念:Chart、Release、Repository
Helm 的三大核心概念构成了其包管理体系的基石。理解它们之间的关系是掌握 Helm 操作的关键。
- Chart:一个预配置的 Kubernetes 资源包,包含部署应用所需的所有 YAML 模板和默认值。Chart 可以被版本化、打包和分发。
- Release:Chart 在 Kubernetes 集群中的一个运行实例。每次
helm install都会创建一个新的 Release;每次helm upgrade都会更新该 Release 的版本。Release 名称在命名空间内唯一。 - Repository:Chart 的存储仓库,用于共享和发现 Chart。Helm 官方维护了
https://charts.helm.sh/stable等公共仓库,企业也可以搭建私有仓库。
下图展示了 Chart、Release 与 Repository 之间的协作关系:
1.4 常用 Helm 命令速查
以下命令是日常操作中最常用的 Helm 指令,建议熟练掌握:
| 命令 | 功能 | 示例 |
|---|---|---|
helm repo add |
添加 Chart 仓库 | helm repo add bitnami https://charts.bitnami.com/bitnami |
helm search repo |
搜索仓库中的 Chart | helm search repo nginx |
helm install |
安装 Chart 创建 Release | helm install my-release bitnami/nginx |
helm upgrade |
升级 Release 到新版本 | helm upgrade my-release bitnami/nginx --set image.tag=latest |
helm rollback |
回滚 Release 到历史版本 | helm rollback my-release 1 |
helm list |
列出当前命名空间的 Release | helm list -n production |
helm history |
查看 Release 的版本历史 | helm history my-release |
helm uninstall |
卸载 Release | helm uninstall my-release |
注意:在 Helm v3 中,
helm delete 已被 helm uninstall 替代。同时,helm init 和 helm reset 命令已完全移除,因为不再需要 Tiller 初始化。