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。
Helm v3 纯客户端架构 Helm CLI helm install / upgrade Chart 仓库 OCI / HTTP 索引 K8s API Server 创建 / 更新资源 Release 记录 Secret (Namespace) 说明: Helm v3 无 Tiller,直接与 API Server 交互;Release 记录以 Secret 持久化,支持回滚。

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 的版本化遵循语义化版本规范,发布流程则涉及打包、索引、分发与部署。以下是标准流程:

  1. 开发与测试:在本地修改模板与 values,使用 helm lint 验证语法,helm template 预览渲染结果。
  2. 打包:执行 helm package ./mychart,生成 mychart-1.0.0.tgz 压缩包。
  3. 索引(传统仓库):将 .tgz 上传至仓库服务器,运行 helm repo index 生成 index.yaml。
  4. 分发:用户执行 helm repo add 添加仓库,helm search repo 查找 Chart。
  5. 安装:helm install myrelease mychart --values custom-values.yaml,Helm 渲染模板并调用 API 创建资源。
  6. 升级与回滚:helm upgrade 更新 Release,helm rollback 回到历史版本。
Chart 版本化发布流程 1. 开发/测试 2. 打包 3. 索引 4. 分发 5. 安装 6. 升级 / 回滚 版本化关键: Chart 版本 (version) 与 appVersion 分离;每次变更必须递增 version,支持回滚到任意历史 Release。

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 摘要不可变性