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 的三大核心优势使其在云原生社区迅速获得广泛采用:

  1. 无模板,原生 Kubernetes
    • 不引入 Go 模板、Jsonnet 等额外语法,所有配置都是标准 Kubernetes YAML。
    • 编辑器、CI/CD 工具、代码审查工具无需特殊插件即可理解配置内容。
    • 减少因模板语法错误导致的调试成本。
  2. 声明式覆盖(Overlay)
    • 通过 patches、patchesStrategicMerge、patchesJson6902 等机制,精准修改特定字段。
    • 支持 namePrefix、nameSuffix、commonLabels、commonAnnotations 等全局变换。
    • 覆盖层可以多层叠加,形成清晰的配置继承链。
  3. 纯客户端操作,无集群依赖
    • Kustomize 在客户端完成所有资源渲染,不向集群发送任何请求。
    • 渲染结果可直接通过 kubectl apply -k 或 kustomize build 输出。
    • 适合离线环境、安全审计和 CI/CD 流水线。
Kustomize 核心架构:Base + Overlay 模式 Base(基准层) deployment.yaml service.yaml kustomization.yaml Overlay(覆盖层) patches/ kustomization.yaml (引用 base) kustomize build 输出完整 YAML 多环境覆盖示例 dev/overlay staging/overlay prod/overlay
常见误区: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

这种结构使得每个环境的差异点一目了然,团队成员可以独立维护各自环境的覆盖层,而不会互相干扰。