◎Kustomize 核心定位

Kustomize 是 Kubernetes 原生的声明式配置管理工具,专门用于定制和管理 Kubernetes YAML 清单文件。自 Kubernetes 1.14 起,它被内置到 kubectl 中(kubectl apply -k)。

解决核心问题:如何在保持上游配置不变的前提下,为不同环境(开发、测试、生产)定制 Kubernetes 资源?

遵循 DRY(Don't Repeat Yourself) 原则,通过"基础配置 + 环境差异层"的架构来管理多环境部署。

◈核心概念体系

Base(基础配置)

  • 存放原始的、可复用的 Kubernetes YAML 清单
  • 不特定于任何环境
  • 通常包含 Deployment、Service、ConfigMap 等资源

Overlay(覆盖层)

  • 针对特定环境的定制配置
  • 通过引用 Base 并应用差异来生成最终配置
  • 不同环境(dev/staging/prod)各自拥有独立的 Overlay 目录

Kustomization 文件

每个目录通过 kustomization.yaml 定义对该目录下资源如何处理。

▣功能矩阵

功能说明
resources引用的原始 YAML 文件
commonLabels为所有资源添加统一标签
commonAnnotations为所有资源添加统一注解
namePrefix / nameSuffix批量修改资源名称前缀 / 后缀
namespace为所有资源指定命名空间
images批量替换镜像名和标签
replicas修改副本数量
configMapGenerator / secretGenerator动态生成 ConfigMap / Secret
patches精细修改资源的任意字段
transformers自定义转换逻辑

◉实际使用示例

典型的目录结构:

myapp/
├── base/
│   ├── kustomization.yaml
│   ├── deployment.yaml
│   └── service.yaml
└── overlays/
    ├── dev/
    │   └── kustomization.yaml
    └── prod/
        └── kustomization.yaml

开发环境 Overlay 使用 namePrefix、images 替换和 patches 修改副本数。

生产环境 Overlay 使用不同的镜像标签和更大的副本数。

构建最终配置:

kustomize build overlays/prod

或直接应用:

kubectl apply -k overlays/prod

◆Patches 技术详解

Kustomize 支持两种 Patch 格式:

  1. Strategic Merge Patch — 通过 patchesStrategicMerge 引用
  2. JSON Patch(RFC 6902) — 更精确,支持任意字段修改

◇Kustomize vs Helm 对比

维度KustomizeHelm
理念配置覆盖与转换模板化与参数化
语法纯 YAML,无逻辑代码Go Template(含条件、循环)
学习曲线低(会 YAML 即可)较高(需学模板语法)
包管理无(Git 子目录引用)有(Charts 仓库、版本、依赖)
动态生成有限(Generator)强大(模板函数)
生态Kubernetes 原生成熟的 Charts 生态
发布管理不管理支持升级、回滚

选择建议:配置差异较小、团队偏好声明式、需要严格版本控制时选择 Kustomize;复杂应用分发、需要参数化时选择 Helm。两者也可以结合使用。

✦高级特性

ConfigMap / Secret 生成器

  • configMapGenerator 和 secretGenerator 动态生成资源
  • Kustomize 自动为生成的资源名添加哈希后缀,触发关联 Pod 滚动更新

组件(Components)

Kustomize v2.1.0+ 支持将通用修改封装为可复用组件,通过 components 字段在 Overlay 中引用。

✶典型使用场景

1

多环境部署

dev / staging / prod 共享基础配置,各自 Overlay 差异

2

多租户隔离

为不同客户 / 团队定制 namespace、标签、资源限制

3

GitOps 工作流

与 ArgoCD、Flux 配合实现声明式持续交付

4

第三方资源定制

Fork 上游配置,通过 Overlay 添加 sidecar、修改镜像

⌘常用命令速查

  • kustomize build <dir>
  • kubectl apply -k <dir>
  • kustomize cfg tree
  • kustomize edit set image nginx=mynginx:v2

Kustomize 的优势在于简单、透明、Kubernetes 原生——不引入新的模板语言,完全基于 YAML 的叠加和变换。如果团队已经在使用 YAML 管理 K8s 资源,且主要需求是"同一套配置在不同环境有微小差异",Kustomize 是最轻量、最符合 Kubernetes 哲学(声明式、版本可控)的选择。