kustomize是管理go应用多环境部署最轻量可控的方式,基于base(通用配置如端口、探针、标签)与overlay(环境差异化补丁)分层管理,通过patchesstrategicmerge精准修改、generator动态生成secret/configmap,并依赖kubectl kustomize验证输出确保部署可靠性。

Kustomize 是目前管理 Go 应用多环境部署最轻量、最可控的方式——它不引入模板语法,不依赖外部工具链,所有变更都落在原生 YAML 上,且自 Kubernetes 1.14 起已深度集成进 kubectl,kubectl apply -k 就能直接部署。
Base 目录必须只放真正通用的 Go 应用资源
Base 不是“随便扔点 YAML 的地方”,而是所有环境(dev/staging/prod)都绝对一致的部分。对 Go 应用来说,典型内容包括:
-
deployment.yaml中的容器端口(containerPort: 8080)、探针路径(/healthz)、标签选择器(app: go-app) -
service.yaml的 ClusterIP 类型、端口映射、selector 字段 -
configMap.yaml中的非敏感、跨环境一致配置,比如日志格式或调试开关(LOG_FORMAT=json) -
kustomization.yaml里只声明resources,不加任何patches、configMapGenerator或namePrefix
常见错误:把镜像版本、副本数、资源限制写进 Base —— 这些恰恰是环境差异点,硬塞进去会导致 Overlay 补丁失效或覆盖冲突。
Overlay 中用 patchesStrategicMerge 替代 json6902 补丁
Go 应用对资源敏感度高,补丁必须精准、可读、易维护。patchesStrategicMerge 是首选,它基于字段路径合并,天然适配 Go 应用常见的结构化修改:
- 开发环境调低资源请求:
overlays/dev/patch-resources.yaml内容为:apiVersion: apps/v1 kind: Deployment metadata: name: go-app spec: replicas: 1 template: spec: containers: - name: go-app resources: requests: cpu: "50m" memory: "128Mi" - 生产环境升级镜像并加注解:
apiVersion: apps/v1 kind: Deployment metadata: name: go-app annotations: deploy.kubernetes.io/revision: "20260921-prod" spec: template: spec: containers: - name: go-app image: registry.example.com/go-app:v1.12.3 - 避免用
json6902补丁:它写法冗长(需完整 JSON Pointer 路径),Go 应用常有嵌套深、字段多的特点,极易写错索引或漏掉-符号导致 patch 失效
Secret 和 ConfigMap 必须用 generator 分离生成逻辑
Go 应用常依赖环境变量(如 DB_URL、REDIS_ADDR)启动,这些值不能硬编码在 Base 或 Overlay 的 YAML 里,而应由 Kustomize 动态生成:
- 在
overlays/dev/kustomization.yaml中写:configMapGenerator: - name: app-config literals: - DB_URL=postgres://localhost:5432/devdb - LOG_LEVEL=debug secretGenerator: - name: app-secrets literals: - API_KEY=dev-fake-key-123
- 在
base/deployment.yaml中通过envFrom引用:envFrom: - configMapRef: name: app-config - secretRef: name: app-secrets - 关键点:generator 生成的资源名会自动加哈希后缀(如
app-config-8m2f9g4h),所以 Base 中的引用必须用envFrom,不能写死valueFrom: configMapKeyRef—— 否则找不到具体 key
应用前必须用 kubectl kustomize 验证输出
Go 应用一旦部署失败,常因 HTTP 探针失败或环境变量缺失导致 CrashLoopBackOff,但错误日志未必暴露 YAML 问题。每次提交 Overlay 前,务必本地验证生成结果:
- 运行
kubectl kustomize overlays/dev,检查输出中:replicas是否为 1、image是否含:latest、envFrom引用的 ConfigMap 名是否带哈希、是否有重复字段报错(如两个 patch 同时改replicas) - 注意
kubectl apply -k overlays/dev和kubectl kustomize overlays/dev | kubectl apply -f -行为一致,但后者能让你看到真实 YAML,是排障唯一可靠手段 - 容易忽略的坑:如果 Base 中用了
namePrefix,Overlay 的 patch 必须匹配加了前缀后的资源名(如dev-go-app),否则 patch 完全不生效 —— 这类问题只能靠kustomize输出肉眼确认











