1.什么是 Kustomize?
Kustomize 是 Kubernetes 原生的配置管理工具,采用 "Base + Overlay(基础 + 覆盖)" 的非侵入式设计。
与 Helm 的"模板参数替换"不同,Kustomize 不引入模板语法(如 {``{ .Values }}),而是直接操作合法的 Kubernetes YAML 文件,通过声明式叠加(Patch) 来生成不同环境的配置。
核心优势:
-
无模板、无 DSL:所有文件都是标准 K8s YAML,
kubectl可直接识别 -
原生集成:
kubectl apply -k直接支持 Kustomize,无需安装额外工具 -
GitOps 友好:天然适合与 ArgoCD、Flux 等 GitOps 工具配合
2.核心概念
-
kustomization.yaml 文件:是 Kustomize 的核心配置文件,定义了如何生成最终的 Kubernetes 资源文件。
-
Resources :在 kustomization.yaml 文件中定义的 Kubernetes 资源列表,可以是文件、目录或者 远程仓库中的资源。
-
Generators:如 configMapGenerator 和 secretGenerator,它们可以根据文件或字面值生成 ConfigMap 或 Secret。
-
Patches :用于修改现有资源的字段。Kustomize支持策略性合并补丁(patchesStrategicMerge) 和JSON补丁(patchesJson6902)。
- patchesStrategicMerge 补丁方式使用 YAML 文件来定义,它允许直接编辑资源的YAML 结构, 等同于编辑原始资源文件,直观且易于理解,适合于熟悉Kubernetes资源配置的人。
- patchesJson6902 使用的是 JSON 补丁(JSON Patch)的方式,这是一种更为灵活和强大的补丁应用方式。JSON补丁遵循 JSON Patch 规范(RFC 6902),允许执行更复杂的操作,如添加、 删除、替换、测试等。
- Kustomize 将配置分为两层:
|-----------------|--------------|-----------------------------------------------|
| 概念 | 定义 | 存放内容 |
| Base(基础) | 所有环境共享的公共配置 | Deployment、Service、ConfigMap 的骨架(资源定义、标签、端口等) |
| Overlay(覆盖) | 针对特定环境的差异化配置 | 镜像 Tag、副本数、资源限制、环境变量等按环境变化的字段 |
3.目录结构示例:

4.准备Base目录
Base 的定位 :存放所有环境一致的"最小公共结构"。
关键原则 :Base 里不要写死带环境语义的配置(如 :develop、:prod 镜像 Tag),否则 overlay 漏覆盖时会跑错版本。
步骤:
1.准备资源文件(base/deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 1 # base 写默认值,overlay 再覆盖
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx # 注意容器名必须与 overlay 匹配[reference:11]
image: nginx # 不带 Tag,留给 overlay 指定
ports:
- containerPort: 80
2.准备 Base 的 Kustomization 文件(base/kustomization.yaml)
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources: # 声明 base 包含哪些资源文件
- deployment.yaml
- service.yaml
commonLabels: # 自动为所有资源添加公共标签
app: myapp
namespace: default
5.准备Overlay目录
Overlay 的定位 :引用 Base,并通过补丁(Patch) 覆盖环境差异。
1.创建开发环境 Overlay(overlays/dev/kustomization.yaml)
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base # 引用 base 目录
patches: # 声明补丁文件
- path: deployment-patch.yaml
2.编写补丁文件(overlays/dev/deployment-patch.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 2 # 开发环境 2 个副本
template:
spec:
containers:
- name: nginx # 注意:必须与 base 中的容器名完全一致[reference:18]
image: nginx:dev # 开发环境用 dev Tag
3.创建生产环境 Overlay(overlays/prod/kustomization.yaml)
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
- grafana-depl.yaml # 生产环境可额外增加资源[reference:20]
patches:
- target: # 也可使用 JSON 6902 补丁格式[reference:21]
kind: Deployment
name: web-deployment
patch: |
- op: replace
path: /spec/replicas
value: 5
6.验证Overlay成果
发布前必须先验证,避免将错误配置推送到集群。
渲染并检查最终yaml文件:
# 渲染开发环境配置,检查镜像 Tag、副本数、容器名
kustomize build overlays/dev | grep -A 6 'containers:'
# 或保存为文件详细检查
kustomize build overlays/dev > /tmp/dev-rendered.yaml
需要验证镜像Tag、容器名、副本数三项关键内容。
| 检查项 | 要看的内容 | 常见问题 |
|---|---|---|
| 镜像 Tag | image: 是否是目标环境 Tag |
生产环境漏覆盖,继续使用开发 Tag |
| 容器名 | overlay 的 containers[].name 是否匹配 base |
写错 name 会追加第二个容器 |
| 副本数 | replicas 是否符合环境预期 |
base 默认值被误用到正式环境 |
执行 Dry-Run 校验 Schema:
# 校验 YAML 语法和 K8s Schema 是否正确
kustomize build overlays/dev | kubectl apply --dry-run=client -f -
7.发布开发环境
验证通过后,将渲染后的配置应用到集群。
两种方式:
#方式一:kustomize build + kubectl apply(最推荐)
kustomize build overlays/dev | kubectl apply -f -
#方式二:kubectl 原生支持(-k 参数)
kubectl apply -k overlays/dev
8.总结与补充
1.完整的工作流程

2.一个描述上的细节
Kustomization" 通常指 kustomization.yaml 这个核心文件及其承载的配置声明,而 "Kustomize" 才是执行工具。