关键在于“一份基线 + 三处差异”:Helm 封装应用包(myapp-chart),Kustomize 负责环境适配,通过 charts/base/overlays 分层管理,敏感配置解耦,CI/CD 执行 dry-run 与差异校验确保安全发布。

用一套制品支撑开发、测试、生产三套隔离环境,关键不在“多写几份配置”,而在于“一份基线 + 三处差异”。Kustomize 和 Helm 各有定位:Kustomize 擅长环境差异化叠加,Helm 擅长应用打包与复用。两者结合才是企业级落地的务实路径。
明确分工:Helm管“应用包”,Kustomize管“环境适配”
把业务服务封装成 Helm Chart(例如 myapp-chart),它只关心自身结构:Deployment 怎么写、Service 暴露什么端口、ConfigMap 模板长什么样。所有环境共用同一份 Chart,版本由 Chart.yaml 和语义化标签锁定。
Kustomize 不碰 Chart 内部逻辑,只在外部做三件事:
- 指定该环境用哪个 Helm Chart 版本(如
staging用1.2.0-rc,prod用1.2.0) - 注入环境专属字段:命名空间、域名、资源限制、健康检查参数
- 叠加补丁:比如给生产环境加 PodDisruptionBudget,给开发环境禁用自动扩缩容
目录结构要分层清晰,避免交叉污染
推荐采用 GitOps 友好的三层物理隔离结构:
- charts/:存放或引用 Helm Chart(本地路径或 OCI 仓库地址)
- base/:定义通用资源——HelmRelease 基础声明、公共 ConfigMap 模板、RBAC 规则
-
overlays/{dev,staging,prod}/:每个子目录只放
kustomization.yaml和少量补丁文件(如patch-resources.yaml、patch-domain.yaml)
这样改一个镜像 tag,只需在 base/ 更新一次;调整个环境的 CPU limit,只动对应 overlays/prod/ 下的补丁,不会波及其他。
敏感配置和动态值必须解耦处理
数据库密码、API 密钥等绝不能硬编码进 YAML。正确做法是:
- 用 Kustomize 的
secretGenerator或configMapGenerator从文件或 env 文件生成资源,配合--enable-alpha-plugins(Kustomize v5+)或使用helm --set-file注入 - 对不同环境启用不同密钥管理方式:开发用
OpaqueSecret,生产对接 Vault 通过 CSI Driver 动态挂载 - 用
replacements字段将 HelmRelease 中的占位符(如${DB_HOST})替换成 overlay 中定义的实际值,不侵入 Chart 模板
CI/CD 流水线要验证再推送,不跳过 dry-run
每次 PR 提交到 overlays/ 目录时,流水线应自动执行:
-
kubectl kustomize overlays/dev | kubectl apply --dry-run=client -o yaml:校验语法与字段合法性 diff -u :快速识别关键差异是否符合预期- 部署前比对上一版渲染结果 SHA256,确保无意外变更
Flux 或 Argo CD 可直接监听 Git 分支变化,自动同步 overlays/prod/ 到生产集群,但必须设置 approval-policy: require 或人工审批门禁。

















