根本原因是kustomization.yaml未正确声明resources或bases,或路径错误;kustomize不自动递归扫描,所有资源须显式列出,路径须相对于当前文件。

为什么 kustomize build 时 overlay 的资源没生效
根本原因通常是 kustomization.yaml 里没正确声明 resources 或 bases,或者路径写错了。Kustomize 不会自动递归扫描子目录,所有要纳入构建的 YAML 文件都得显式列出来。
常见错误现象:kustomize build overlays/prod 输出里完全看不到 base 中的 Deployment,或者 patch 没应用——其实压根没加载 base。
- 确保
overlays/prod/kustomization.yaml中用的是resources(Kustomize v4+ 推荐),而不是已废弃的bases - 路径必须相对于当前
kustomization.yaml文件,比如../base是对的,./base或base很可能报unable to find or read file - 如果 base 本身也含
kustomization.yaml,它会被当作一个“合成资源”整体加载;不要把它拆开塞进resources列表
patchStrategicMerge 和 patchesJson6902 怎么选
二者都能打补丁,但行为完全不同:前者靠字段名和语义合并(比如往 env 列表追加变量),后者靠精确匹配 API 组、版本、种类、名称来定位对象再改字段——后者更稳,尤其在 patch 多个同类型资源时。
使用场景:想给所有 Deployment 加一个 toleration?用 patchesJson6902;只想改某一个 deployment 的镜像?用 patchStrategicMerge 更简洁。
立即学习“Python免费学习笔记(深入)”;
YothCMS是由 石家庄优斯科技有限公司开发的一套完全开源建站系统,主要面向企业进行快速的建造简洁,高效,易用,安全的公司企业网门户站,稍具技术的开发人员就能够使用本系统以最低的成本、最少的人力投入在最短的时间内架设一个功能齐全、性能优越的公司企业网站。YothCMS是基于ASP+Access开发的一款轻巧高效的网站内容管理系统,提供了新闻管理模块,产品管理模块,文件管理模块。在使用过程中可以轻
-
patchStrategicMerge容易踩坑:如果 base 里用了envFrom,你再用它往env里加变量,Kubernetes 可能忽略其中一部分——因为 strategic merge patch 对某些字段有预设合并策略,不是简单覆盖 -
patchesJson6902必须写全target字段,漏掉group(如apps/v1)或拼错name,patch 就静默失效,且不报错 - 示例中别写
patch: |-后直接跟缩进的 JSON——YAML 解析器会把换行当空字符串,导致 JSON 格式损坏;建议用|-+ 顶格写 JSON
Python 脚本怎么安全地生成或校验 overlay
纯 Kustomize 不支持条件逻辑或变量计算,比如“prod 环境副本数 = CPU 核数 × 2”,这时候就得用 Python 脚本预处理 kustomization.yaml 或生成 patch 文件,但要注意别破坏 Kustomize 的声明式链条。
关键不是“能不能用 Python”,而是“改完之后还能不能被 kustomize build 正常消费”。很多团队在这一步引入了隐式依赖,比如脚本生成的 patch 文件名硬编码在 kustomization.yaml 里,但没加到 Git —— 下次别人拉代码就构建失败。
- 脚本输出的文件(如
generated-patch.yaml)必须出现在kustomization.yaml的patches或resources列表中,且路径固定 - 避免在脚本里直接修改 base 目录下的文件;overlay 应该只读 base,所有变更留在 overlay 层内
- 如果脚本需要读取集群状态(如 ConfigMap 内容),别让它成为
kustomize build的前置步骤——构建应离线可重现;这类逻辑应移到 CI 阶段或 operator 中
多环境 overlay 共享 patch 时的命名冲突
当你把同一个 add-istio-injection.yaml 放进 staging/ 和 prod/ 的 patches 列表,Kustomize 会各自加载,没问题;但如果这个 patch 本身用了相对路径引用外部文件(比如 secretGenerator 指向 ../secrets/tls.crt),而 staging 和 prod 的工作目录不同,路径解析就会错乱。
本质是 Kustomize 解析路径时以当前 kustomization.yaml 为基准,不是以执行命令的位置为准。很多人在 Makefile 里写 cd overlays/staging && kustomize build,却忘了 patch 文件里的路径还是按 overlays/staging/kustomization.yaml 位置算的。
- 所有 patch 文件内部用的路径(如
secretGenerator.files、configMapGenerator.files)必须是相对于它所在 overlay 目录的,不要跨层引用上级目录的敏感文件 - 共享 patch 最好只做纯结构修改(如加 annotation、改 replicas),不带文件引用;涉及文件的内容,用
literal方式写死或通过环境变量注入 - CI 中运行
kustomize build前,务必确认当前工作目录就是 overlay 目录,否则../base这类路径会偏移
真正难的不是写对一个 overlay,而是让十个人在不同时间、不同机器上跑出完全一致的输出——路径、版本、隐式依赖,任何一个松动,都会让“声明式”变成“玄学式”。









