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 交互,不再需要中间代理组件:

Helm v3 架构:无 Tiller 模式 Helm Client CLI / SDK Kubernetes API Server kubectl / REST Workloads (Pod/Deploy) Release Secrets 架构优势 • 无服务端组件,部署更简单 • 权限继承 kubeconfig • Release 信息加密存储

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 之间的协作关系:

Helm 核心概念关系图 Repository Chart 存储仓库 (索引 + 压缩包) Chart 模板 + 默认值 (版本化包) Release 运行实例 (命名空间隔离) helm fetch helm install 核心工作流 1. 从 Repository 中获取 Chart(helm repo add + helm fetch) 2. 使用 Chart 在集群中创建 Release(helm install) 3. 通过 Release 管理应用生命周期(helm upgrade / helm rollback / helm uninstall)

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 初始化。