目录

    1. 不同种类的存储

    1.1 文件存储

    文件存储是,基于文件的存储。在访问数据时,需要提供相应的查找路径。

    适用于,FTP、NFS 等服务。

    1.2 块存储

    块存储是,将数据拆分成块,并单独存储各个部分。在访问数据时,底层存储软件会将这些分散的数据组装起来。

    块存储,通常部署在存储区域网络(SAN)中,方便快速检索,易于使用和管理。

    适用于,磁盘阵列、硬盘等服务。

    1.3 对象存储

    对象存储是,将数据分解为对象的离散单元,保存在单个存储库。每个对象存储卷都是一个自包含式数据库,用户可以分布式的查找对象、元数据。

    对象存储要求一次性完整写入,无法修改对象。

    适用于,Ceph 等大容量的分布式存储。

    2. Ceph

    Ceph 是一种基于通用硬件设计的高可靠、可扩展的分布式存储系统,同时支持三种存储,文件存储、块存储、对象存储。

    Ceph 底层采用对象存储,其他存储类型是基于对象存储进行的二次封装。

    2.1 Ceph 的核心组件

    • Mo 监控,监控集群状态,维护展示集群状态的图表,例如 OSD Map、Monitor Map、PG Map 、CRUSH Map。
    • MDS (可选)元数据服务,保存文件系统的元数据,管理目录结构。
    • OSD 存储服务,负责存储、复制、平衡、恢复数据,与其他 OSD 进行心跳检查,通常一块硬盘对于一个 OSD。

    2.2 Ceph 的存储过程

    Ceph 底层采用 CRUSH 算法进行存储,如上图,下面是存储过程:

    第一步,将数据分割成多个 Object ,Object 是 Ceph 最小的存储单元。每个 Object 一个 Object id ,大小可设置,默认是 4 MB。 第二步,为了减少 Object 到 OSD 的索引表,引入 Placement Group (PG)进行管理。Object 通过 Hash ,映射到 PG ,每个 PG 包含多个 Object。 第三步,PG 再通过 CRUSH 算法,映射到 OSD。如果是多副本,每个 PG 会映射到多个 OSD。

    2.3 Ceph 部署

    ceph-deploy 是 Ceph 官方提供的部署工具。它通过 SSH 远程登录其他节点,然后执行命令完成部署过程。

    通常,部署一个 Ceph 集群需要如下步骤:

    1. 规划集群节点
    2. 配置用户、免密 ssh、Hosts
    3. 安装 ceph-deploy、ceph
    4. 部署 monitors、managers、MDS、OSD

    3. Kubernetes 中的 Ceph

    3.1 直接使用 PV/PVC 的问题

    关于 PV 和 PVC 的介绍,可以参考,PV、PVC

    管理员需要预先分配 PV。当用户创建 PVC 请求存储时,Kubernetes 将尝试用 PVC 与预分配的 PV 匹配。如果找到匹配项,则将 PVC 绑定到 PV ,提供给用户使用。

    在这种匹配策略下,管理员无法精确满足每个用户的需要,只有不断地调整 PV 的大小。这将给存储运维带来沉重的负担。

    为此,Kubernetes 1.6 版本中,引入了动态纳管、StorageClass、Provisioner 。管理员使用 Storage Class 来描述提供的存储。StorageClass 包含容量、IOPS 等一系列参数信息。存储供应商 Provisioner 根据 StorageClass 中设置的参数动态分配 PV。

    3.2 Provisioner

    当用户通过 PVC 对存储资源进行申请时, StorageClass 会使用 Provisioner 来自动创建用户所需的 PV。

    上图详细流程分析如下:

    (1)Pod 加载存储卷,请求 PVC

    (2)PVC 根据存储类型(此处为 rbd )找到存储类 StorageClass

    (3)Provisioner 根据 StorageClass 动态生成一个持久卷 PV

    (4)持久卷 PV 和 PVC 最终形成绑定关系

    (5)持久卷 PV 开始提供给 Pod 使用

    通过配置不同的 Provisioner,StorageClass 支持多种类型的存储卷。目前已经支支持很多种类,AWSElasticBlockStore、AzureFile、AzureDisk、Cinder、Flocker、GCEPersistentDisk、Glusterfs、PhotonPersistentDisk、Quobyte、RBD、VsphereVolume、PortworxVolume、ScaleIO、StorageOS 等。

    除了上面 Kubernetes 原生支持的类型,通过安装扩展插件,能够支持更多存储类型。例如,NFS 的 nfs-client-provisioner。

    Ceph 通过 RDB 的方式提供 Provisioner 给 StorageClass 创建 PV。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: fast
    provisioner: kubernetes.io/rbd
    parameters:
      monitors: 10.16.153.105:6789
      adminId: kube
      adminSecretName: ceph-secret
      adminSecretNamespace: kube-system
      pool: kube
      userId: kube
      userSecretName: ceph-secret-user
      userSecretNamespace: default
      fsType: ext4
      imageFormat: "2"
      imageFeatures: "layering"
    

    4. 参考