前面讲到过Docker的volume机制,容器进程被创建之后,尽管已经开启了Mount Namespace,但是根目录挂载(chroot /var/lib/docker/aufs/mnt/[可读写层id])之前,容器仍然可以看到整个宿主机的文件系统,此时是可以将宿主机的目录挂载到容器的。
docker run -v /home:/test
将宿主机目录挂载到容器目录:
Volume volume = VolumeBuilder().withName(“唯一id”).withNewHostPath().withPath(“宿主机目录”).endHostPath().build();
VolumeMount volumeMount = VolumeMountBuilder().withName(“唯一id”).withMountPath(“容器目录”).build();
将obs桶子目录挂载到容器目录:
创建pvc
首先需要创建持久卷pv,pv是资源,pvc是对pv的使用请求。
kubelet根据pv的对象描述将远端obs桶mount到当前节点的根文件系统。具体地,节点本地需要安装存储插件,插件封装了s3fs,obsfs文件系统,能够处理kubelete下发的mount指令。
obs对象桶静态pv:
1. apiVersion:v1
2. kind:PersistentVolume
3. metadata:
4. name:obs-bucket-pv
5. annotations:
6. pv.kubernetes.io/provisioned-by: everest-csi-provisioned
7. spec:
8. accessModes:
9. - ReadWriteMany
10. capacity:
11. storage: 10G
12. csi:
13. driver: obs.csi.everest.io
14. fsType: s3fs
15. volumeAttributes:
16. everest.io/obs-volume-type: STANDARD #标准桶
17. everest.io/region: cn-north-3 #region id
18. storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioned
19. volumeHandle: obs-bucket-name #桶名
20. persistentVolumeReclaimPolicy: retain #保留pv
21. storageClassname: customized-obs-csi #用于扩展自定义存储类,可以自定义需要增加的mount参数(比如在spec下增加一个新的参数),也可关联集群自带的
绑定obs对象桶创建pvc:
1. apiVersion:v1
2. kind:PersistentVolumeClaim
3. metadata:
4. name:obs-bucket-pvc
5. namespace: default
6. annotations:
7. volume.beta.kubernetes.io/storage-provisioned: everest-csi-provisioned
8. csi.storage.k8s.io/fsType: s3fs
9. everest.io/obs-volume-type: STANDARD
10. spec:
11. accessModes:
12. - ReadWriteMany
13. resources:
14. request:
15. storage: 10G
16. volumeName: obs-bucket-pv #对应pv名称
17. storageClassname: customized-obs-csi #保持和pv一致
挂载子目录到容器目录
Volume volume = VolumeBuilder().withName(“唯一id”).withNewPersistentVolumeClaim().withClaimName(“pvc名称”).endPersistentVolumeClaim().build();
VolumeMount volumeMount = VolumeMountBuilder().withName(“唯一id”).withSubPath(“子目录”)withMountPath(“容器目录”).build();