Helm vs Kustomize
概述
在 Kubernetes 生态中,应用的配置管理是持续交付流水线的核心环节。Helm 和 Kustomize 是两种主流的配置管理工具,但它们的设计哲学截然不同。Helm 采用模板渲染(Template Rendering)模式,将配置视为参数化的可安装包;Kustomize 则采用声明式覆盖(Declarative Overlay)模式,以基础配置加补丁的方式实现环境差异化。理解两者的差异对于 SRE 团队选择合适的部署工具至关重要,因为这直接影响变更安全性、回滚可靠性以及配置漂移(Configuration Drift)的防控能力。
Helm:模板化方法
Helm 是 Kubernetes 的包管理器,其核心抽象是 Chart。一个 Chart 是一组预定义的 Kubernetes 资源模板,通过 values.yaml 文件注入参数,最终渲染为可部署的 manifest。
Chart 结构
一个标准的 Helm Chart 目录结构如下:
my-app/
├── Chart.yaml # Chart 元数据(名称、版本、依赖)
├── values.yaml # 默认配置值
├── templates/ # Go template 模板文件
│ ├── deployment.yaml
│ ├── service.yaml
│ └── _helpers.tpl # 模板辅助函数
└── charts/ # 子 Chart 依赖
核心机制
values.yaml:定义所有可配置参数的默认值。部署时可通过-f custom-values.yaml或--set key=value覆盖。- Releases:每次
helm install或helm upgrade都会创建一个 Release,记录在集群中(默认以 Secret 形式存储),支持通过helm history查看部署历史。 - Rollback:
helm rollback <release> <revision>可快速回滚到任意历史版本,Release 的 revision 机制为回滚提供了可靠的基础。
# 安装
helm install my-app ./my-app -f production-values.yaml
# 升级
helm upgrade my-app ./my-app -f production-values.yaml --set image.tag=v2.1.0
# 回滚到上一个版本
helm rollback my-app 1
Kustomize:覆盖式方法
Kustomize 内置于 kubectl(自 v1.14 起),其设计哲学是无模板的配置定制。它通过 Base 和 Overlay 的分层结构,使用 Strategic Merge Patch 和 JSON Patch 来实现环境差异化。
Base/Overlay 结构
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ └── service.yaml
└── overlays/
├── dev/
│ ├── kustomization.yaml
│ └── replica-patch.yaml
├── staging/
│ └── kustomization.yaml
└── production/
├── kustomization.yaml
└── resource-patch.yaml
核心机制
- Base:包含原始的、未经修改的 Kubernetes 资源文件,是所有环境共享的共同基础。
- Overlay:引用 Base 并定义针对特定环境的修改。Overlay 不直接修改 Base 文件,而是通过 Patch(Strategic Merge Patch 或 JSON 6902 Patch)叠加变更。
- Generators:支持通过
configMapGenerator和secretGenerator自动生成 ConfigMap 和 Secret,并自动添加哈希后缀以触发滚动更新。
# 构建生产环境 manifest
kubectl kustomize overlays/production/
# 直接应用
kubectl apply -k overlays/production/
对比分析
| 维度 | Helm | Kustomize |
|---|---|---|
| 学习曲线 | 较陡峭,需掌握 Go Template 语法 | 较平缓,YAML 原生,易于上手 |
| 模板复杂度 | 高,模板逻辑可能变得难以维护 | 低,无模板语言,配置即 YAML |
| Secret 管理 | 依赖外部工具(Sealed Secrets、Vault) | secretGenerator 支持本地生成 |
| 生态系统 | 丰富,Artifact Hub 提供大量预制 Chart | 较小,依赖社区 Base 配置 |
| 版本管理 | 原生 Release 和 Revision 机制 | 无内置版本管理,依赖 Git |
| 依赖管理 | Chart.yaml 声明依赖并自动拉取 | 无原生依赖管理 |
| 模板复用 | 支持 Library Chart 和子 Chart | 通过 Base 引用实现复用 |
| 原生集成 | 需安装 Helm CLI | 内置于 kubectl |
SRE 视角
升级安全性
Helm 的 Release 机制提供了内置的升级安全网:每次升级都会记录完整的 manifest 快照,使得升级失败时可以快速回滚。然而,Helm 的模板渲染是全量的,复杂的条件逻辑可能导致意外的资源变更。
Kustomize 的 Overlay 模式在升级时更加可控——变更范围完全由 Patch 定义,SRE 可以精确审查每次变更的影响面。但由于缺乏内置的版本管理,回滚操作完全依赖 Git 历史和 CI/CD 流水线的质量。
回滚可靠性
Helm 的 helm rollback 是可靠的原子操作,适合紧急回滚场景。Kustomize 的回滚则需要 git revert 加重新部署,在时间紧迫的故障恢复中可能增加 MTTR。
配置漂移防控
配置漂移是 SRE 的核心关注点。Helm 通过 helm diff 插件可以在升级前预览变更,有效防止意外修改。Kustomize 的声明式特性天然适合 GitOps 工作流,结合 Argo CD 或 Flux 的自动同步机制,可以从源头遏制配置漂移。
选择建议
- 选择 Helm:当应用本身需要作为可分发的包管理(如开源项目、内部平台组件),或团队需要可靠的 Release 管理和一键回滚能力时。
- 选择 Kustomize:当管理同一应用的多环境配置差异,或团队偏好纯声明式、无模板的 GitOps 工作流时。
- 混合使用:许多团队采用 Helm 渲染基础 manifest,再通过 Kustomize Overlay 进行环境定制的混合策略,兼顾两者优势。