如何为多版本应用创建通用Kustomize配置以复用资源?
Kustomize多版本配置复用实现方案
核心思路
把所有版本共用的资源(如Deployment、Service)和补丁放到base目录集中管理,每个版本的特有配置(如镜像标签、版本专属补丁)放在独立的overlays子目录下,通过Kustomize的resources字段让每个版本的配置继承base的通用内容,彻底消除重复代码。
调整后的目录结构
app-deploy/ ├── base/ │ ├── kustomization.yaml │ ├── deployment.yaml │ ├── service.yaml │ └── common-patches.yaml └── overlays/ ├── v1.0.0/ │ ├── kustomization.yaml │ └── v1.0.0-specific-patch.yaml └── v1.1.5/ ├── kustomization.yaml └── v1.1.5-specific-patch.yaml
关键文件配置示例
base目录通用配置
base/kustomization.yaml 集中定义所有版本共用的资源和补丁:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization # 通用资源清单 resources: - deployment.yaml - service.yaml # 所有版本共用的补丁 patchesStrategicMerge: - common-patches.yaml
base/deployment.yaml 编写通用的Deployment模板(不要包含版本相关的镜像标签):
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app-image:latest # 用占位标签,后续在overlay中替换 ports: - containerPort: 8080
版本专属配置(以v1.0.0为例)
overlays/v1.0.0/kustomization.yaml 继承base并添加版本特有内容:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization # 引用base目录的通用配置 resources: - ../../base # 版本v1.0.0专属补丁(如调整资源配额、环境变量) patchesStrategicMerge: - v1.0.0-specific-patch.yaml # 替换镜像标签为当前版本 images: - name: my-app-image newTag: v1.0.0
overlays/v1.0.0/v1.0.0-specific-patch.yaml 编写该版本独有的配置修改:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: spec: containers: - name: my-app env: - name: APP_VERSION value: "v1.0.0"
v1.1.5版本的配置只需修改images字段的newTag为v1.1.5,并编写对应的专属补丁即可。
构建与部署命令
构建指定版本的配置:
kustomize build overlays/v1.0.0
直接部署到集群:
kubectl apply -k overlays/v1.0.0
常见错误排查
- 路径引用错误:确保overlay中
resources指向base的相对路径正确(如../../base,根据实际目录层级调整) - 资源定义冲突:避免base和overlay中出现同名同类型的完整资源定义,overlay只需要写补丁或字段修改内容
- 版本兼容问题:确保使用的Kustomize版本支持
patchesStrategicMerge(v1beta1版本API已稳定,大部分主流版本都支持)
内容的提问来源于stack exchange,提问作者Shubham Dixit
相关产品推荐
相关产品推荐

