从 Helm 迁移到 Kustomize
适用场景
希望去掉模板和 Release 状态,改用纯 YAML + overlay 管理自有应用;或 GitOps 中更偏好 Kustomize 的声明式叠加。
前置条件
- 能渲染 Helm chart:
helm template。
- 确认 chart 的 hooks、CRD、依赖和 values 逻辑。
- 明确哪些环境差异要用 overlay 表达。
- 准备 Git 仓库和部署验证流程。
步骤
- 渲染 Helм 模板:
helm template app ./chart -f values-prod.yaml -n prod > base.yaml
- 拆分基础清单和 overlay:
base/
deployment.yaml
service.yaml
kustomization.yaml
overlays/
staging/kustomization.yaml
prod/kustomization.yaml
- 编写
base/kustomization.yaml:
resources:
- deployment.yaml
- service.yaml
- 编写 overlay:
resources:
- ../../base
namespace: prod
images:
- name: registry.example.com/app
newTag: "1.2.3"
patches:
- path: replicas.yaml
- 渲染并对比:
kustomize build overlays/prod > rendered.yaml
kubectl diff -f rendered.yaml
kubectl apply -k overlays/prod
验证
- 渲染结果与 Helm 模板一致(除必要差异)。
- Pod、Service、Ingress、探针和资源限制正确。
- 滚动更新、回滚和配置变更正常。
- CRD/依赖资源已单独管理。
回滚
- 保留 Helm release 和 values,必要时切回 Helm。
- Kustomize 部署的变更可通过 Git revert + apply 回滚。
- 注意 Helm release 状态与 Kustomize 资源可能冲突。
常见坑
- Helm 的 hooks(pre-install/post-upgrade)和 release 生命周期在 Kustomize 中没有等价物。
- values 的默认值/合并逻辑要展开成明确 YAML,避免遗漏。
- CRD 通常要单独安装,不能只靠 overlay。
- 生成的名字/标签/注解可能依赖 Helm 模板函数,需要固化。
- Secret 不要明文提交;用 SOPS/External Secrets。
- 两种工具同时管理同一资源会产生冲突。
相关命令
helm — 渲染与发布
kustomize — 清单叠加
kubectl — diff/apply