Kustomize实战:PV/PVC多环境管理
Kustomize 管理 PV/PVC 实战:标准化、多环境复用
Kustomize 是 Kubernetes 原生的配置管理工具,核心优势是无需模板语法,通过 “基础配置 + 覆盖补丁” 实现多环境复用,尤其适合管理 PV、PVC 这类需要在开发 / 测试 / 生产环境中差异化配置的资源。本文结合 PV/PVC 的使用场景,讲解 Kustomize 的核心用法、目录结构设计和实战案例。
一、核心概念(Kustomize 基础)
在管理 PV/PVC 前,先明确 Kustomize 的 3 个核心概念,适配存储资源的多环境需求:
| 概念 | 作用 | 适配 PV/PVC 场景 |
|---|---|---|
| 基础目录(base) | 存放所有环境共用的 “基准配置”(如 PVC 名称、基础访问模式) | 定义 PV/PVC 的通用字段(如 accessModes: ReadWriteMany、PVC 名称前缀) |
| 覆盖目录(overlay) | 存放特定环境的 “差异化配置”(如容量、存储类、后端地址) | 开发环境用小容量(5Gi)、测试 / 生产用大容量(20Gi);生产环境用 Ceph 存储类,开发用 NFS |
| kustomization.yaml | 核心配置文件,声明资源、补丁、变量等 | 聚合 PV/PVC/Pod 资源,指定环境差异化补丁(如替换存储容量、存储类名称) |
二、目录结构设计(推荐最佳实践)
针对 PV/PVC 的多环境管理,建议采用「基础目录 + 多覆盖目录」的结构,清晰区分通用配置和环境差异:
storage/
├── base/ # 基础配置(所有环境共用)
│ ├── pvc-base.yaml # PVC 基础配置(通用访问模式、名称)
│ ├── pod-base.yaml # Pod 基础配置(通用挂载路径、容器镜像)
│ └── kustomization.yaml # 聚合基础资源
└── overlays/ # 环境覆盖配置(差异化部分)├── dev/ # 开发环境│ ├── patch-pvc.yaml # PVC 差异化(容量5Gi、NFS存储类)│ └── kustomization.yaml├── test/ # 测试环境│ ├── patch-pvc.yaml # PVC 差异化(容量10Gi、NFS存储类)│ └── kustomization.yaml└── prod/ # 生产环境├── pv-prod.yaml # 生产环境专属 PV(Ceph后端,管理员手动创建)├── patch-pvc.yaml # PVC 差异化(容量20Gi、Ceph存储类)└── kustomization.yaml
三、实战:用 Kustomize 管理多环境 PV/PVC
步骤 1:编写基础配置(base 目录)
基础目录存放所有环境共用的配置,避免重复编写。
1.1 基础 PVC 配置(pvc-base.yaml)
定义通用字段(访问模式、PVC 名称前缀),差异化字段(容量、存储类)留到 overlay 中覆盖:
# base/pvc-base.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: app-storage-pvc # 所有环境共用的 PVC 名称
spec:accessModes:- ReadWriteMany # 通用访问模式(多节点读写)# 容量、storageClassName 留到 overlay 中定义(环境差异化)resources:requests:storage: 5Gi # 基础容量(可被覆盖)
1.2 基础 Pod 配置(pod-base.yaml)
定义 Pod 与 PVC 的绑定关系(通用挂载路径、容器镜像):
# base/pod-base.yaml
apiVersion: v1
kind: Pod
metadata:name: app-pod # 所有环境共用的 Pod 名称
spec:containers:- name: app-containerimage: nginx:alpine # 通用镜像volumeMounts:- name: app-storagemountPath: /data # 通用容器内挂载路径volumes:- name: app-storagepersistentVolumeClaim:claimName: app-storage-pvc # 引用基础 PVC 名称(与 pvc-base.yaml 一致)
1.3 基础 kustomization.yaml
聚合基础资源,声明需要管理的 PV/PVC/Pod:
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization# 声明基础资源(PVC + Pod)
resources:- pvc-base.yaml- pod-base.yaml
步骤 2:编写环境覆盖配置(overlays 目录)
每个环境通过「补丁文件」覆盖基础配置的差异化字段,无需修改基础文件。
2.1 开发环境(overlays/dev)
开发环境用小容量(5Gi)、NFS 动态存储(StorageClass 为 nfs-sc):
补丁文件(patch-pvc.yaml):覆盖容量和存储类
# overlays/dev/patch-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: app-storage-pvc # 必须与基础 PVC 名称一致(目标补丁对象) spec:resources:requests:storage: 5Gi # 开发环境容量(小容量)storageClassName: "nfs-sc" # 开发环境存储类(NFS 动态供给)开发环境 kustomization.yaml:引用基础目录和补丁
# overlays/dev/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization
引用基础配置(继承 base 中的所有资源)
bases:
- ../../base # 相对路径指向 base 目录
应用环境差异化补丁(覆盖 PVC 的容量和存储类)
patches:
- path: patch-pvc.yaml # 指向当前目录的补丁文件
#### 2.2 测试环境(overlays/test)
测试环境用中等容量(10Gi)、同样使用 NFS 动态存储:
- 补丁文件(patch-pvc.yaml):仅修改容量```yaml# overlays/test/patch-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: app-storage-pvcspec:resources:requests:storage: 10Gi # 测试环境容量(中等容量)storageClassName: "nfs-sc" # 同开发环境的 NFS 存储类
- 测试环境 kustomization.yaml:与开发环境结构一致,仅补丁内容不同
# overlays/test/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization
bases:
- ../../base
patches:
- path: patch-pvc.yaml
plaintext
#### 2.3 生产环境(overlays/prod)
生产环境用大容量(20Gi)、Ceph 存储(静态 PV,管理员手动创建):
- 生产环境专属 PV(pv-prod.yaml):管理员提前创建的 Ceph 后端 PV```yaml# overlays/prod/pv-prod.yamlapiVersion: v1kind: PersistentVolumemetadata:name: prod-ceph-pv # 生产环境专属 PV 名称spec:capacity:storage: 20Gi # 生产环境容量(大容量)accessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retain # 生产环境保留数据(手动回收)storageClassName: "ceph-sc" # 生产环境存储类(Ceph)cephfs: # Ceph 存储后端配置(根据实际集群调整)monitors:- 192.168.1.200:6789- 192.168.1.201:6789path: /prod/app-storageuser: adminsecretRef:name: ceph-admin-secret # Ceph 认证密钥(需提前创建)
生产环境 PVC 补丁(patch-pvc.yaml):匹配 PV 的容量和存储类
yaml
# overlays/prod/patch-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: app-storage-pvc spec:resources:requests:storage: 20Gi # 与 PV 容量一致storageClassName: "ceph-sc" # 与 PV 存储类一致(静态绑定)生产环境 kustomization.yaml:不仅引用基础配置,还添加专属 PV 资源
yaml
# overlays/prod/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization
引用基础配置
bases:
- ../../base
添加生产环境专属资源(PV)
resources:
- pv-prod.yaml # 生产环境需要手动创建的 PV
应用 PVC 差异化补丁
patches:
- path: patch-pvc.yaml
### 步骤3:应用 Kustomize 配置(部署到不同环境)
Kustomize 无需提前构建,可直接通过 `kubectl apply -k` 部署指定环境的配置(自动合并基础配置和补丁)。#### 3.1 部署开发环境
```bash
# 切换到开发环境 overlay 目录,或直接指定路径
kubectl apply -k overlays/dev# 验证资源(PVC 容量5Gi,存储类nfs-sc;Pod 正常运行)
kubectl get pvc app-storage-pvc
kubectl get pod app-pod
kubectl get pv # 动态供给会自动创建 PV(名称含 nfs-sc-app-storage-pvc-xxx)
3.2 部署测试环境
kubectl apply -k overlays/test# 验证(PVC 容量10Gi,存储类nfs-sc)
kubectl get pvc app-storage-pvc
3.3 部署生产环境
# 生产环境需先确保 Ceph 密钥存在(提前创建)
kubectl apply -f ceph-admin-secret.yaml# 部署生产环境资源(自动创建 PV + 合并 PVC 补丁 + 部署 Pod)
kubectl apply -k overlays/prod# 验证(PV 为 prod-ceph-pv,PVC 绑定成功)
kubectl get pv prod-ceph-pv
kubectl get pvc app-storage-pvc
步骤 4:查看 / 调试 Kustomize 合并结果
如果想提前确认基础配置和补丁的合并效果,可使用 kubectl kustomize 命令输出最终配置(不部署):
# 查看开发环境最终配置(合并 base 和 dev 补丁)
kubectl kustomize overlays/dev# 查看生产环境最终配置(合并 base + prod PV + prod 补丁)
kubectl kustomize overlays/prod
四、进阶用法:优化 PV/PVC 管理效率
1. 变量替换(避免硬编码)
通过 Kustomize 的 configMapGenerator 或 secretGenerator 管理存储后端地址、密钥等变量,避免在配置中硬编码:
# base/kustomization.yaml 中添加变量
configMapGenerator:- name: storage-configliterals:- NFS_SERVER=192.168.1.100 # NFS 服务器地址(可在 overlay 中覆盖)
在 PV 中引用变量(需结合 patchesJson6902 或 Helm 模板,Kustomize 原生不支持直接引用,推荐用补丁覆盖)。
2. 批量管理多个 PV/PVC
如果需要管理多个存储资源(如应用需要数据存储 + 日志存储),可在 base 目录中添加多个 PVC,在 overlay 中分别补丁:
base/
├── pvc-data.yaml # 数据存储 PVC
├── pvc-log.yaml # 日志存储 PVC
└── kustomization.yaml # 聚合两个 PVC
3. 环境隔离(通过命名空间)
在 overlay 中指定命名空间,实现不同环境的资源隔离:
# overlays/dev/kustomization.yaml
namespace: dev-namespace # 开发环境命名空间
bases:- ../../base
patches:- path: patch-pvc.yaml
