2. Helm 与 Chart 基础回顾:Helm 架构、Chart 结构、版本化与发布流程
在深入 OCI 分发与缓存加速之前,有必要重新梳理 Helm 的核心概念。Helm 是 Kubernetes 的包管理器,它将应用及其依赖打包为 Chart,并通过 Release 机制管理部署生命周期。本节将聚焦 Helm 架构、Chart 文件结构、版本化规范以及标准发布流程,为后续仓库迁移与存储优化奠定基础。
2.1 Helm 架构:Tiller 已死,Client-Only 时代
Helm v3 彻底移除了服务端组件 Tiller,采用 纯客户端架构。Helm CLI 直接通过 kubeconfig 与 Kubernetes API Server 交互,不再需要集群内的服务端代理。这一变化大幅简化了安全模型与部署流程。
架构要点:
- Helm CLI:负责 Chart 打包、仓库管理、Release 安装/升级/回滚。
- Chart 仓库:存储 Chart 包的索引与压缩包(传统方式为 HTTP 静态文件,优化后为 OCI 制品)。
- Kubernetes API Server:Helm 直接调用 API 创建/更新/删除资源。
- Release 记录:默认以 Secret 形式存储在目标 Namespace 中,记录每次部署的元数据与 Manifest。
2.2 Chart 结构:标准目录与核心文件
一个 Helm Chart 是一个遵循固定目录结构的文件集合。标准 Chart 包含以下核心元素:
| 文件/目录 | 是否必需 | 作用说明 |
|---|---|---|
Chart.yaml |
是 | Chart 元数据:名称、版本、API 版本、描述、依赖等 |
values.yaml |
是 | 默认配置值,供模板引用;用户可通过 --set 或自定义 values 文件覆盖 |
templates/ |
是 | Go 模板文件,渲染后生成 Kubernetes 资源清单(Deployment、Service 等) |
charts/ |
否 | 子 Chart 依赖(手动或通过 helm dependency 管理) |
crds/ |
否 | 自定义资源定义(CRD),在模板渲染前安装 |
README.md |
推荐 | Chart 使用说明与参数文档 |
最佳实践:始终在
Chart.yaml 中声明 apiVersion: v2(Helm v3 标准),并保持 version 字段遵循 SemVer 2.0 规范(如 1.2.3)。appVersion 用于标识应用版本,可与 Chart 版本不同。
2.3 Chart 版本化与发布流程
Chart 的版本化遵循语义化版本规范,发布流程则涉及打包、索引、分发与部署。以下是标准流程:
- 开发与测试:在本地修改模板与 values,使用
helm lint验证语法,helm template预览渲染结果。 - 打包:执行
helm package ./mychart,生成mychart-1.0.0.tgz压缩包。 - 索引(传统仓库):将 .tgz 上传至仓库服务器,运行
helm repo index生成index.yaml。 - 分发:用户执行
helm repo add添加仓库,helm search repo查找 Chart。 - 安装:
helm install myrelease mychart --values custom-values.yaml,Helm 渲染模板并调用 API 创建资源。 - 升级与回滚:
helm upgrade更新 Release,helm rollback回到历史版本。
2.4 版本化规范与依赖管理
Helm 对 Chart 版本有严格约束,依赖管理通过 Chart.yaml 中的 dependencies 字段声明:
# Chart.yaml 示例
apiVersion: v2
name: myapp
description: A Helm chart for Kubernetes
type: application
version: 1.2.3
appVersion: "2.5.0"
dependencies:
- name: redis
version: ">=10.0.0"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled
注意:传统仓库依赖解析需要
helm dependency update 下载子 Chart 到 charts/ 目录。OCI 分发模式下,依赖可直接通过 OCI 引用(oci://registry.example.com/charts/redis),无需本地索引文件。
2.5 传统仓库 vs OCI 分发:版本化差异
| 特性 | 传统 HTTP 仓库 | OCI 分发 |
|---|---|---|
| 版本标识 | Chart.yaml 中的 version 字段 |
OCI 标签(tag),如 1.2.3 |
| 索引文件 | 需要 index.yaml 维护版本列表 |
无需索引,Registry 原生支持标签列举 |
| 依赖解析 | 基于 repository URL + 版本范围 |
基于 OCI 引用 + 标签或摘要 |
| 回滚支持 | 依赖 Release 记录中的 Manifest | 依赖 Release 记录 + OCI 摘要不可变性 |