第29章|Kubernetes 进阶:Helm、Kustomize 与可复用部署包

当 YAML 多到你开始“靠手感复制粘贴”,你已经到了需要部署包的阶段。 本章把 Helm 和 Kustomize 当作两种“打包语言”:Helm 更像模板编程, Kustomize 更像补丁叠加。 然后我们学习如何把它们组合成可复用、可参数化、可在多环境晋级的交付资产。

Package thinking

部署不是复制,是资产化

  • 把“应用 + 依赖 + 参数”封装成包
  • 环境差异用 overlay / values 表达
  • 用 GitOps 把期望状态晋级
Helm

模板渲染:values 驱动

  • Chart 目录结构:Chart.yaml / values.yaml / templates/
  • release 与版本:upgrade / rollback
  • 依赖 charts:subcharts 组装复用
Kustomize

补丁叠加:base + overlay

  • 声明式合并:patches / generators / transformers
  • 环境 overlay:dev / staging / prod
  • 输出就是最终 manifests(更直观)

1. 为什么“可复用部署包”比“会写 YAML”更重要?

YAML 是表达语法,不是交付资产。你真正需要的能力有三件事:

  1. 复用:不要每个服务都重新发明一套部署逻辑。
  2. 参数化:同一个服务在不同环境差异可控。
  3. 可审计与可回滚:render 后的结果、变更来源、回滚点必须能解释。
提醒:当你发现“复制粘贴”已经超过两次,就该把它提炼成 chart 或 base/overlay。

2. Helm:把模板与值变成可升级的发行版(Chart)

2.1 Helm 的基本对象:Chart、Release、Values、Templates

2.2 Helm 渲染管线:values 驱动“生成最终 manifests”

Helm 的关键理解是:它不是在集群里“保持模板”,而是在安装/升级时渲染出一组最终 YAML,交给 Kubernetes 去创建资源。 所以可审计性来自“渲染结果 + release 记录 + values 输入”。

Helm 渲染与 Release 生命周期:values → templates → manifests → upgrade 目标:把参数变更变成可升级发行版,并且保留回滚依据 Values input values.yaml -f env/staging.yaml Templates if/loop helpers rendering rules Rendered manifests K8s resources ready for apply Release history install / upgrade / rollback release name: my-app revision: 12 → 13 values snapshot preserved Safety mechanics Dry-run + diff + rollback helm template for review atomic upgrade (optional) status & health checks
图 1:Helm 的核心是“渲染”。你提供 values,模板生成最终 manifests,Release 决定升级与回滚依据。

3. Kustomize:用补丁叠加构建最终 manifests(base/overlay)

3.1 Kustomize 的基本思想:不写模板,写“变更”

Kustomize 的哲学是:尽量避免模板逻辑,让差异用 overlay 的补丁表达。 这使得最终输出是直观的 YAML,可以更容易做审计与比对。

Kustomize:base → overlay → 合成最终 manifests 差异用补丁叠加表达;输出是最终资源,便于审计与 diff base Deployment / Service common labels/selectors shared config structure overlay: dev replicas: 1 imageTag: dev resources: small namePrefix: dev- overlay: prod replicas: 5 imageDigest: prod resources: hardened policy: strict output final manifests audit ready diff friendly GitOps apply
图 2:Kustomize 用 overlay 叠加 base,只改必要差异;最终输出就是可审计的 manifests。

4. Helm vs Kustomize:如何选择,避免“选工具而不是选架构”

选择 Helm 或 Kustomize,本质是选择“表达差异”的方式。 当差异简单、可解释、可补丁化,Kustomize 往往更稳;当差异复杂,需要参数驱动的生成逻辑,Helm 更灵活。

经验法则:如果你写到需要复杂逻辑来理解最终 YAML,就该反思:这是不是已经超过 Kustomize 的舒适区,或者需要把逻辑提炼到模板/库中?

4.1 对照维度(建议用来做团队决策)

Helm vs Kustomize:表达差异的两种路线 用三问选择:差异复杂度、审计要求、升级/回滚机制 Helm template generation values -> render -> release Kustomize patch overlay base + overlay -> final manifests Selection questions 1) 差异是否需要复杂生成? 需要:Helm;不需要:Kustomize 2) 审计 diff 是否是硬要求? Kustomize 通常更直观;Helm需配合 template 输出 review 3) 你依赖哪种回滚机制? Helm release history vs Git commit 回滚与声明式收敛
图 3:选择不是站队,而是用审计/差异复杂度/回滚机制三问做架构决策。

5. 混用模式:Helm 做“骨架”,Kustomize 做“环境皮肤”

在真实团队里,经常出现一个折中:用 Helm charts 负责生成通用骨架(尤其包含复杂依赖/可选组件), 用 Kustomize overlays 在不同环境做补丁与注入(名字、资源规格、配置开关、副本策略)。

可复用部署包:Helm(骨架)+ Kustomize(皮肤)+ GitOps 晋级 目标:让不同环境只改“差异”,而不是重写部署逻辑 Helm chart skeleton + optional modules values drive generation Kustomize overlay env patches + namePrefix config generators resource tuning Git 晋级期望状态 dev → staging → prod sync + drift detect audit history
图 4:混用模式把“复杂生成”交给 Helm,把“环境差异”交给 Kustomize,再由 GitOps 晋级与漂移治理完成交付闭环。

6. 可复用部署包的工程化规范(让团队用得起来)

  1. 接口契约:values schema(Helm)或 patch 约定(Kustomize)要稳定;变更要有版本。
  2. 默认安全:生产默认启用严格策略(resources、probe、securityContext、network policy 等)。
  3. 渲染/合成测试:用 CI 生成 rendered manifests 并做 lint(例如 helm lint、kubeconform 等思路)。
  4. 依赖锁定:Helm dependencies 与 chart versions 固化,避免“明天渲染结果不同”。
  5. 审计友好:输出 diff 可读;PR 中展示 rendered 或 kustomize output,便于 review。
  6. 回滚演练:Helm rollback 或 GitOps 回滚要在 SOP 里可执行、可验证。
总结:Helm/Kustomize 不是“替代 YAML”,而是把 YAML 变成“可产品化的部署语言”。你在做的,是平台工程里最核心的资产:可复用部署包。
← 上一章:K8s 入门 2 下一章:CI/CD 的系统设计(Pipeline as Product) →