Kustomize 需将 YAML 拆为 Base+Overlay 结构,Base 删除硬编码 namespace/image,改用占位符;Overlay 用 patchesStrategicMerge 和 images 字段精准覆盖副本、资源、镜像等,避免 vars 拼接;kustomization.yaml 仅含 resources/commonLabels,禁用 apiVersion/kind;务必用 kustomize build + dry-run 验证。

Kustomize 不是给 Golang 项目“加个依赖”就能用的工具,它管理的是 YAML 配置,不是 Go 代码本身。你真正要做的,是把 goctl 或手动写的 Kubernetes YAML 拆成 Base + Overlay 结构,并让镜像、探针、副本数这些变量能被安全替换。
Base 目录里不能有硬编码的 namespace 和 image
goctl kube deploy 默认输出的 YAML 带 namespace: production 和 image: registry.example.com/user-service:v1.0.0 —— 这类字段必须删掉或替换成占位符,否则无法复用到 dev/staging 环境。
- 删掉
metadata.namespace字段,交给 overlay 的namePrefix或集群默认命名空间处理 - 把
image改成image: ${IMAGE_REPO}/user-service:${IMAGE_TAG},后续用images字段注入真实值 -
livenessProbe.httpGet.path这类路径建议写死在 Base(如/healthz),除非真有环境差异需求,否则别 patch
Overlay 中用 patchesStrategicMerge 覆盖 replicas、resources 等字段
不要在 overlay 的 kustomization.yaml 里重复写整个 Deployment,只写补丁文件,Kustomize 会精准合并到对应位置。
- 例如
prod/replicas.yaml只需两行:spec:和replicas: 5,它会被 merge 到 Base Deployment 的spec下 - 同理,
dev/limits.yaml可以只写:spec:→template:→spec:→containers:→- name: app→resources:→limits:→memory: "256Mi" - 补丁文件必须保持缩进对齐,YAML 缩进错一位就 merge 失败,报错类似
json: cannot unmarshal object into Go struct field Patch.content of type string
镜像版本必须用 images 字段统一替换,别靠 vars 字符串拼接
很多人想用 vars 把 ${IMAGE_REPO} 和 ${IMAGE_TAG} 注入到 image 字段里,但 Kustomize 的 vars 已被弃用(v4.5+),且字符串拼接易出错——比如漏了斜杠、冒号,或 tag 含 + 导致解析失败。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 正确做法是在 overlay 的
kustomization.yaml中使用images:字段:- name: registry.example.com/user-service→newTag: v1.2.3 - Base 中的
image值只需写registry.example.com/user-service:latest(tag 值不重要,会被覆盖) - 这样既避免 shell 层面的字符串错误,又兼容 kubectl apply -k 的原生行为
kustomization.yaml 最小结构只有 resources 和 commonLabels(或 namePrefix)
别往 kustomization.yaml 里塞 apiVersion 或 kind —— 它不是资源定义,只是生成器配置。写多了反而报错,比如 error: raw message decode error。
- Base 的
kustomization.yaml至少要有:resources:(列出deployment.yaml、service.yaml)和commonLabels:(如app: user-service) - Overlay 的
kustomization.yaml必须包含:resources: [../base],再加patchesStrategicMerge:或images: - 如果用了
namePrefix,记得 Base 里的资源名别带环境后缀(比如别叫user-service-prod),否则 prefix 会叠成prod-user-service-prod
最容易被忽略的一点:Kustomize 不校验 YAML 语义是否合法,它只做字段合并。Base 里 Deployment 缺 selector,或者 patch 文件缩进错位,kubectl apply -k 时可能直接报错创建失败,但提示信息非常模糊。建议每次写完先跑 kustomize build overlay/prod | kubectl apply --dry-run=client -f - 验证输出结构。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










