如何在Kubernetes多个命名空间之间共享EFS存储卷
问题排查与解决方案
一、storageclass.storage.k8s.io "efs-sc" not found报错修复
首先确认集群中是否存在对应StorageClass,执行命令:kubectl get storageclasses.storage.k8s.io
StorageClass属于集群级资源,只要创建成功所有命名空间均可直接调用,不存在命名空间无法识别的情况。出现该报错的唯一原因是集群中未成功创建名为efs-sc的StorageClass,或配置时名称拼写错误。
正确的EFS StorageClass配置示例如下:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: efs-sc provisioner: efs.csi.aws.com parameters: provisioningMode: efs-ap fileSystemId: 替换为你的EFS文件系统ID directoryPerms: "700" reclaimPolicy: Retain volumeBindingMode: Immediate
创建完成后再次执行kubectl get sc确认efs-sc处于正常状态即可。
二、跨多命名空间共享EFS的两种实现方案
无需为每个命名空间创建独立StorageClass或PV,推荐以下两种成熟方案:
方案1:预创建共享PV,多命名空间直接绑定
适合需要所有命名空间访问同一份EFS数据的场景:
- 先创建全局共享PV,配置示例:
apiVersion: v1 kind: PersistentVolume metadata: name: efs-shared-pv spec: capacity: storage: 100Gi # EFS为弹性容量,该值仅做配额标识不限制实际使用 volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: efs-sc csi: driver: efs.csi.aws.com volumeHandle: 替换为你的EFS文件系统ID
- 在任意需要使用EFS的命名空间中创建PVC,添加
volumeName字段绑定共享PV即可,PVC配置示例:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: efs-claim namespace: 替换为目标命名空间名称 spec: accessModes: - ReadWriteMany storageClassName: efs-sc volumeName: efs-shared-pv # 绑定预创建的共享PV resources: requests: storage: 5Gi
方案2:动态供给自动创建独立子目录
适合需要各命名空间数据逻辑隔离、但底层共用同一个EFS的场景:
确认EFS CSI驱动已配置正确的IAM权限后,直接在任意命名空间创建你原有格式的PVC即可,CSI驱动会自动在EFS下为每个PVC创建独立的访问点目录,所有目录底层均共用同一个EFS存储,你也可以直接登录EFS访问所有命名空间的目录实现跨命名空间数据共享。
三、错误认知纠正
你之前遇到的认证错误与多StorageClass配置无关,是EFS CSI驱动的IAM角色权限不足导致的。同一EFS支持绑定多个StorageClass,只是该场景下无创建多个StorageClass的必要。
内容的提问来源于stack exchange,提问作者Happy Machine
相关产品推荐
相关产品推荐

