Kubernetes多Pod共享PVC后如何跨Pod访问挂载目录并拷贝文件
多Pod共享PVC访问方案
现有配置的挂载逻辑说明
你部署的两个Deployment都绑定了同一个PVC awesome-pvc,当前配置是将整个PVC的根目录分别挂载到两个容器的不同路径:
- deployment-one生成的Pod中,PVC根目录挂载到容器内的
/one路径 - deployment-two生成的Pod中,PVC根目录挂载到容器内的
/two路径
无需调整配置的访问方式
由于两个容器挂载的是同一个PVC的根目录,你在deployment-two的/two路径下写入的所有文件,本质都存储在PVC的根目录中,在deployment-one的/one路径下可以直接看到所有文件。如果需要执行拷贝操作,直接进入deployment-one的容器执行常规拷贝命令即可:
# 进入deployment-one对应的Pod容器 kubectl exec -it <deployment-one生成的Pod名称> -- /bin/bash # 执行拷贝操作(/one下包含deployment-two写入的所有文件) cp -r /one/<需要拷贝的文件名> /one/<目标存储路径>
这种方式的弊端是两个应用的存储文件都混在PVC根目录,不利于后续管理。
目录隔离+互相访问的优化配置
如果需要让两个应用的存储目录互相隔离,同时支持跨Pod访问,建议调整volumeMount配置增加subPath字段,将PVC内的不同子目录分别挂载到两个容器对应的路径,同时在第一个Pod内挂载整个PVC根目录用于访问另一个应用的文件:
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-one spec: selector: matchLabels: app: one template: metadata: labels: app: one spec: containers: - name: one image: some_username/container_one:latest volumeMounts: # 挂载PVC的one子目录到容器的/one路径 - name: volume-one mountPath: /one subPath: one # 挂载整个PVC根目录到容器的/all-pvc路径,用于访问其他子目录 - name: volume-one mountPath: /all-pvc volumes: - name: volume-one persistentVolumeClaim: claimName: awesome-pvc --- apiVersion: apps/v1 kind: Deployment metadata: name: deployment-two spec: selector: matchLabels: app: two template: metadata: labels: app: two spec: containers: - name: two image: some_username/container_two:latest volumeMounts: # 挂载PVC的two子目录到容器的/two路径 - name: volume-two mountPath: /two subPath: two volumes: - name: volume-two persistentVolumeClaim: claimName: awesome-pvc
调整配置重新部署后,进入deployment-one的容器,就可以通过/all-pvc/two访问到deployment-two写入/two目录的所有文件,拷贝命令为:
cp -r /all-pvc/two/* /one/
注意事项
- 确保你的PV访问模式为
ReadWriteMany,支持多节点多Pod同时读写,如果是ReadWriteOnce模式,两个Pod调度到不同节点时会出现挂载失败的问题。 - 多Pod同时读写同一个文件时需要自行加锁,避免出现文件脏写、数据丢失的问题。
内容的提问来源于stack exchange,提问作者msrumon
相关产品推荐
相关产品推荐

