Kubernetes ceph是一个开源的分布式存储,它支持对象、块、文件三种存储类型,常用做kubernetes底层共享存储使用 在kubernetes中,为了解耦存储使用的问题,抽象了PV(PersistentVolume)和PVC(PersistentVolumeClaim),从而让使用者不用关心具体的基础设施,当需要存储资源的时候,只要像CPU和内存一样,声明要多少即可
    • PV:PV描述的是持久化存储卷,主要定义的是一个持久化存储在宿主机上的目录,比如一个NFS的挂载目录
    • PVC:PVC描述的是Pod所希望使用的持久化存储的属性,比如,Volume存储的大小、可读写权限等等
    Kubernetes管理员设置好网络存储的类型,提供对应的PV描述符配置到Kubernetes,使用者需要存储的时候只需要创建PVC,然后在Pod中使用Volume关联PVC,即可让Pod使用到存储资源,它们之间的关系如下图所示

    Kubernetes存储使用的一个错误认知 - 图1

    使用PV和PVC方法虽然能实现屏蔽底层存储,但是PV创建比较复杂,Kubernetes解决这个问题的方法是提供动态配置PV的方法,可以自动创PV。管理员可以部署PV配置器(provisioner),然后定义对应的StorageClass,这样开发者在创建PVC的时候就可以选择需要创建存储的类型,PVC会把StorageClass传递给PV provisioner,由provisioner自动创建PV。如CCE就提供csi-disk、csi-nas、csi-obs等StorageClass,在声明PVC时加上StorageClassName,就可以自动创建PV,并自动创建底层的存储资源 简单交代一下kubernetes中存储的几个基本知识点,来说一下使用误区 前面说到PV,PV是集群中的一块网络存储,它有三种访问模式,分别是:
    • **<font style="color:rgb(1, 1, 1);">ReadWriteOnce</font>**(RWO):是最基本的方式,可读可写,但只支持被单个节点挂载。
    • **<font style="color:rgb(1, 1, 1);">ReadOnlyMany</font>**(ROX):可以以只读的方式被多个节点挂载。
    • **<font style="color:rgb(1, 1, 1);">ReadWriteMany</font>**(RWX):这种存储可以以读写的方式被多个节点共享。
    说的误区就是这里,在网上很多的文档中,都说ceph的块存储不支持ReadWriteMany(RWX),也就一直在这样的错误认知中,还很胸有成竹的认定ceph的块不支持RWX,无法多节点共享,直到大佬把官方说明甩过来

    ceph官方截图

    实际上是否支持RWX或者RWO,有一个关键参数,是volumeMode,通常使用,大多时候是filesystem,也就是以文件的形式挂载到pod内进行使用,而底层如果是块存储,是支持block方式挂载,只要上层pod可以使用block就可以 通过以下实验看下: 底层ceph块存储和<font style="color:rgb(0, 0, 0);">StorageClass</font>提前已经装好了,通过创建pv、pvc,使用不同的accessmodes和volumeMode实验

    storageclass

    ceph 块存储集群

    先创建一个基于块的<font style="color:rgb(0, 0, 0);">PersistentVolumeClaim</font>,它利用上面创建的基于ceph-csi的<font style="color:rgb(0, 0, 0);">StorageClass</font>,可以使用以下 YAML 从csi-rbd-sc StorageClass请求原始块存储
    1. apiVersion: v1
    2. kind: PersistentVolumeClaim
    3. metadata:
    4. name: raw-block-pvc
    5. spec:
    6. accessModes:
    7. - ReadWriteOnce
    8. volumeMode: Block
    9. resources:
    10. requests:
    11. storage: 1Gi
    12. storageClassName: csi-rbd-sc

    <font style="color:rgb(0, 0, 0);">accessModes</font>是RWO,<font style="color:rgb(0, 0, 0);">volumeMode</font>是block,看一下是否能成功创建

    RWO-block创建成功

    可以看到,状态是Bound,正常创建成功 接着用上面创建的基于ceph-csi的<font style="color:rgb(0, 0, 0);">StorageClass</font>创建基于文件系统的<font style="color:rgb(0, 0, 0);">PersistentVolumeClaim</font> yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: rbd-pvc spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 1Gi storageClassName: csi-rbd-sc <font style="color:rgb(0, 0, 0);">accessMode</font>还是RWO,<font style="color:rgb(0, 0, 0);">volumeMode</font>是filesystem,看是否创建成功

    RWO-filesystem创建成功

    可以看到状态是bound,正常创建成功 接着试下RWX 先试试用block的<font style="color:rgb(0, 0, 0);">volumeMode</font> yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: raw-block-pvc-rwx spec: accessModes: - ReadWriteMany volumeMode: Block resources: requests: storage: 1Gi storageClassName: csi-rbd-sc 看下是否能正常bound

    RWX-block创建成功

    可以看到,基于块存储,RWX模式也是可以正常bound的 接着再试下filesystem的<font style="color:rgb(0, 0, 0);">volumeMode</font> yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: rbd-pvc-rwx spec: accessModes: - ReadWriteMany volumeMode: Filesystem resources: requests: storage: 1Gi storageClassName: csi-rbd-sc apply看下是否正常bound

    RWX-filesystem无法创建成功

    可以看到<font style="color:rgb(0, 0, 0);">accessModes</font>是RWX的情况下,<font style="color:rgb(0, 0, 0);">volumeMode</font>为filesystem是不支持的,无法创建成功,而如果ceph是文件存储的类型时,<font style="color:rgb(0, 0, 0);">accessModes</font>是RWX,<font style="color:rgb(0, 0, 0);">volumeMode</font>是filesystems才可以创建成功。 总结:块存储或文件存储是否支持RWX或RWO,不单取决于它是块还是文件,还取决于上层pvc的<font style="color:rgb(0, 0, 0);">accessModes</font>,以及<font style="color:rgb(0, 0, 0);">volumeMode</font>