用途
Kustomize 用于以声明方式定制 Kubernetes 资源,无需使用模板化(templating)手段。它适合在以下场景使用:跨环境管理 Kubernetes 配置、在不修改原始文件的情况下为已有 manifest 打补丁、基于 base 创建配置变体、定制第三方 manifest,以及偏好声明式而非模板化方式时。
前提条件
- kubectl 1.14+(已内置 kustomize)
- 或使用独立的 kustomize CLI
- 具备基本的 Kubernetes manifest 知识
目录结构
典型结构由 base 与 overlays 组成:
myapp/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ └── configmap.yaml
└── overlays/
├── development/
│ ├── kustomization.yaml
│ └── replica-patch.yaml
├── staging/
│ ├── kustomization.yaml
│ └── namespace.yaml
└── production/
├── kustomization.yaml
├── replica-patch.yaml
└── resource-patch.yaml
基础配置(Base)
base 的 kustomization.yaml 通过 resources 引用清单文件,并使用 commonLabels、commonAnnotations 统一添加标签与注解。示例中 deployment.yaml 定义了 Deployment(含 replicas、selector、容器镜像、端口与资源 requests/limits)。
叠加层(Overlays)
开发环境叠加层通过 resources 引用 ../../base,并设置 namespace、namePrefix、commonLabels,以及 images 修改镜像 tag。生产环境叠加层额外配置 replicas 数量、images 的 newName/newTag,并通过 patches 引用补丁文件。
补丁(Patching)
- 策略合并补丁(Strategic Merge Patch):以资源清单形式声明需要覆盖的字段,例如修改容器资源 requests/limits。
- JSON Patch:通过 target 指定资源,使用 op/path/value 形式的操作进行替换或新增。
- 内联补丁(Inline Patches):在 patches 中直接写入 patch 内容并指定 target。
配置生成
- ConfigMap Generator:支持 literals、files、envs,并可通过 options.disableNameSuffixHash 控制名称后缀哈希。
- Secret Generator:支持 literals、files,并可指定 type(如 kubernetes.io/tls)。
镜像转换(Image Transformations)
可通过 images 修改 tag、替换镜像仓库(newName + newTag),或使用 digest 指定镜像摘要。
资源转换(Resource Transformations)
支持 namePrefix/nameSuffix、namespace、commonLabels、commonAnnotations,以及 replicas 指定各资源副本数。
组件(Components)
以 kind: Component 定义可复用组件(如 monitoring),在叠加层中通过 components 引用,用于添加可选功能。
远程资源
resources 可引用远程 Git 仓库(带 ref)或远程 URL 的清单文件。
常用命令
# Build and view output
kubectl kustomize overlays/production
# Apply to cluster
kubectl apply -k overlays/production
# Delete resources
kubectl delete -k overlays/production
# View diff
kubectl diff -k overlays/production
# Build with standalone kustomize
kustomize build overlays/production
# Build and apply
kustomize build overlays/production | kubectl apply -f -
Helm Chart 集成
通过 helmCharts 配置 name、repo、version、releaseName、namespace、valuesFile、includeCRDs。
变量替换
通过 replacements 从源(如 ConfigMap 的 data.APP_VERSION)取值并替换到目标资源的指定字段路径,可设置 delimiter 与 index。
常见问题
- 名称哈希冲突:ConfigMap 变更后资源未更新,可启用名称后缀哈希(默认)或使用 replacement。
- 补丁未生效:确认资源名称匹配,复杂变更可用 JSON Patch。
- 远程资源失败:检查 URL、ref/tag 是否存在以及网络访问。
- 标签选择器不匹配:commonLabels 可能破坏 selector,可使用 includeSelectors: false 或通过 labelExclusions.yaml 排除特定资源。
最佳实践
- 保持 base 清单与环境无关
- 用 overlays 承载环境专属配置
- 简单变更优先使用策略合并补丁
- 用 components 承载可选功能
- 固定远程资源版本
- 启用 ConfigMap/Secret 哈希后缀
- 在 README 中记录 overlay 结构
- 应用前先测试构建
相关技能
kubernetes-ops(K8s 基础)、helm-charts(Helm 替代方案)、argocd-gitops(GitOps 部署)。