如何跨Kubernetes命名空间共享StorageClass及AWS EFS存储
存储资源级别划分
- 集群级资源(不隶属于任何命名空间,全集群全局可见,不可重复创建同名资源):
StorageClass、PersistentVolume (PV) - 命名空间级资源(仅在所属命名空间内生效,不同命名空间可创建同名资源):
PersistentVolumeClaim (PVC)、业务Pod
异常原因说明
你遇到的两个提示的根因如下:
- 跨命名空间部署相同PV/PVC失败:PV是集群级全局唯一资源,你已经在集群中创建过名为
efs-pv的PV,无法重复创建同名PV,和StorageClass的可见性无关(StorageClass本身是全集群可见的,你遇到的无法找到StorageClass的提示大概率是重复创建PV失败后的关联报错,可检查报错详情确认) - 删除时的集群级资源警告:PV不属于任何命名空间,你在指定了命名空间参数的场景下删除PV资源,就会触发该提示,属于正常的操作告警。
多命名空间共享EFS配置方案
AWS EFS本身支持多客户端同时挂载,你已经配置了Retain回收策略,推荐使用静态PV共享方案,配置逻辑如下:
- 确保已部署的EFS StorageClass配置正确,不需要绑定任何命名空间,集群全局可用
- 整个集群仅需创建1次
efs-pvPV资源,不要在每个命名空间下重复创建PV,PV的spec.accessModes需设置为ReadWriteMany适配多挂载场景 - 每个需要使用该EFS存储的命名空间,各自创建独立的PVC即可:PVC的
spec.storageClassName填写你部署的EFS StorageClass名称,spec.volumeName填写已创建的PV名称efs-pv,PVC的spec.accessModes要和PV配置保持一致,存储请求容量需小于等于PV的配置容量
如果需要不同命名空间的数据隔离,可在EFS根目录下提前创建不同子目录,每个子目录对应创建一个独立的PV,各命名空间的PVC绑定对应子目录的PV即可。
如果不需要提前固定PV配置,也可以使用动态供给方案:无需手动创建PV,直接在各业务命名空间创建指定了对应EFS StorageClass的PVC,EFS CSI驱动会自动创建匹配的PV并完成绑定。
资源部署位置说明
- StorageClass、PV:集群级别部署,创建时不要填写
namespace参数 - PVC:部署到对应需要使用存储的业务命名空间下,创建时必须指定
namespace参数
内容的提问来源于stack exchange,提问作者Happy Machine
相关产品推荐
相关产品推荐

