1. Kustomize 概述
1.1 Kustomize 是什么
Kustomize 是 Kubernetes 生态中原生的配置管理工具,于 2018 年由 Google 开源,随后在 2019 年合并为 kubectl 的内置子命令(kubectl apply -k)。它采用 声明式覆盖(Declarative Overlay) 模式,允许用户在不修改原始 YAML 文件的前提下,通过分层叠加的方式生成不同环境(开发、测试、生产)的最终部署配置。
核心思想:Kustomize 不引入新的模板语法,而是直接操作 Kubernetes 原生资源对象。用户维护一组 base(基准) 和若干 overlay(覆盖),通过
kustomization.yaml 文件描述如何组合与覆盖,最终输出完整的 Kubernetes 资源清单。
1.2 Kustomize 与 Helm 的区别
Helm 和 Kustomize 是 Kubernetes 配置管理领域最主流的两个工具,但设计哲学截然不同。下表从关键维度进行对比:
| 对比维度 | Kustomize | Helm |
|---|---|---|
| 设计哲学 | 声明式覆盖,无模板 | 模板引擎 + 值注入 |
| 学习曲线 | 低,只需理解 YAML 覆盖逻辑 | 中高,需掌握 Go 模板语法与 Chart 结构 |
| 原生性 | kubectl 内置,无需额外安装 | 需单独安装 Helm CLI 和 Tiller(v2) |
| 模板语法 | 无模板,纯 YAML 操作 | Go 模板({{ .Values.replicaCount }}) |
| 版本管理 | 依赖 Git 等外部版本控制 | 内置 Chart 版本与 Release 管理 |
| 回滚机制 | 无内置回滚,依赖 kubectl rollout | 内置 helm rollback 命令 |
| 适用场景 | 多环境配置差异管理、GitOps 工作流 | 应用打包分发、复杂依赖管理 |
选型建议:如果你的团队追求 原生 Kubernetes 体验、希望避免模板调试的复杂性,或者正在实施 GitOps(如 ArgoCD、Flux),Kustomize 是更自然的选择。Helm 更适合需要 应用打包、版本发布和复杂依赖管理 的场景。
1.3 Kustomize 的核心优势
Kustomize 的三大核心优势使其在云原生社区迅速获得广泛采用:
- 无模板,原生 Kubernetes
- 不引入 Go 模板、Jsonnet 等额外语法,所有配置都是标准 Kubernetes YAML。
- 编辑器、CI/CD 工具、代码审查工具无需特殊插件即可理解配置内容。
- 减少因模板语法错误导致的调试成本。
- 声明式覆盖(Overlay)
- 通过
patches、patchesStrategicMerge、patchesJson6902等机制,精准修改特定字段。 - 支持
namePrefix、nameSuffix、commonLabels、commonAnnotations等全局变换。 - 覆盖层可以多层叠加,形成清晰的配置继承链。
- 通过
- 纯客户端操作,无集群依赖
- Kustomize 在客户端完成所有资源渲染,不向集群发送任何请求。
- 渲染结果可直接通过
kubectl apply -k或kustomize build输出。 - 适合离线环境、安全审计和 CI/CD 流水线。
常见误区:Kustomize 不是模板引擎,不要试图用它实现条件判断或循环逻辑。如果遇到“根据环境变量动态生成不同资源”的需求,应优先考虑 Helm 或直接使用脚本预处理。Kustomize 擅长的是 静态配置差异管理,而非动态逻辑。
1.4 典型目录结构
一个标准的多环境 Kustomize 项目通常遵循以下布局:
project-root/
├── base/ # 基准配置
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ └── configmap.yaml
├── overlays/ # 环境覆盖
│ ├── dev/
│ │ ├── kustomization.yaml
│ │ ├── replica-patch.yaml
│ │ └── env-configmap.yaml
│ ├── staging/
│ │ ├── kustomization.yaml
│ │ ├── replica-patch.yaml
│ │ └── ingress.yaml
│ └── prod/
│ ├── kustomization.yaml
│ ├── hpa-patch.yaml
│ └── pdb.yaml
└── README.md
这种结构使得每个环境的差异点一目了然,团队成员可以独立维护各自环境的覆盖层,而不会互相干扰。