如何在EKS的多个Deployment间共享EFS中的同一文件夹
解决EKS中EFS固定路径挂载问题
要让所有微服务都写入EFS的同一个固定目录(如/logs),避免自动生成带PVC ID的子目录,核心是调整EFS CSI驱动的挂载模式,以下是两种可行方案:
方案1:修改StorageClass为直接挂载模式(推荐)
你当前使用的provisioningMode: efs-ap(Access Point模式)会为每个PVC自动创建独立的Access Point,并在basePath下生成PVC ID命名的子目录。切换为直接挂载模式即可解决该问题:
修改后的StorageClass配置
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: dev-logs-efs-sc provisioner: efs.csi.aws.com parameters: provisioningMode: efs # 切换为直接挂载EFS文件系统模式 fileSystemId: fs-xxxxxxxxxxx basePath: "/logs" # 直接挂载此固定路径,无额外子目录
操作步骤
- 删除现有PVC和自动生成的PV:
kubectl delete pvc dev-logs-efs-pvc kubectl delete pv <自动生成的PV名称> - 应用修改后的StorageClass:
kubectl apply -f storageclass.yaml - 重新创建PVC:
kubectl apply -f pvc.yaml - 重启所有使用该PVC的Deployment,确保Pod挂载新的PV。
此方案下,所有Pod都会直接挂载EFS的/logs目录,重启、扩缩容时路径保持不变,所有微服务的日志会直接写入该目录。
方案2:使用静态PV绑定固定路径
如果需要更严格的路径控制,可以创建静态PV直接指向EFS的/logs路径,所有PVC绑定该PV:
静态PV配置
apiVersion: v1 kind: PersistentVolume metadata: name: dev-logs-efs-pv spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: efs.csi.aws.com volumeHandle: fs-xxxxxxxxxxx:/logs # 直接指定EFS文件系统ID+固定路径
绑定静态PV的PVC配置
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: dev-logs-efs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi volumeName: dev-logs-efs-pv # 绑定上面的静态PV storageClassName: "" # 禁用动态Provisioning
操作步骤
- 删除现有动态生成的StorageClass、PVC、PV
- 应用静态PV和PVC配置
- 重启Deployment完成挂载
注意事项
- 确保EFS文件系统的
/logs目录已存在(CSI驱动会自动创建不存在的目录) - 所有微服务必须使用同一个PVC,才能共享该挂载路径
- 若之前有日志存于自动生成的
pvc-xxx子目录,需手动迁移至/logs目录
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

