对象存储、快存储、文件存储

    • 对象存储: 也就是通常意义的键值存储,其接口就是简单的 GET、PUT、DEL 和其他扩展,如 S3
    • 块存储: 裸盘,不能被操作系统应用直接访问,要格式化成文件系统(ext3, ext4, ntfs 等)后才能被访问;性能高、时延低,对共享访问的支持有限
    • 文件存储:支持 POSIX 接口,跟传统文件系统如 ext4 同类型,区别是分布式存储提供了并行化能力,如 CephFS

    使用场景,括号代表它在非分布式情况下的对应

    • 对象存储(KV 数据库):接口简单,全读全写,通常以大文件为主,要求足够 IO 带宽
    • 块存储(硬盘):类似硬盘的通用需求;容量大、热点明显;主要应付热点问题;要求延迟最低
    • 文件存储(文件系统):接口设计跟本地文件系统如 Ext4 一致,比块存储接口丰富,需要考虑目录、文件属性等支持

    文件存储 NAS (Network-Attached Storage)

    • 用户的服务器通过 NFS 或 SMB 等网络协议共享访问 NAS 存储。阿里云 NAS 分布式文件系统,基于 POSIX 文件接口,天然适配原生操作系统,共享访问,同时保证一致性和锁互斥,并且性能随容量线性扩展
    • 文件存储 NAS 和块存储 EBS 需要跟 ECS 绑定,并通过 POSIX 接口访问文件系统;差别在于 EBS 文件系统在 OS 本地,NAS 通过网络访问。

    k8s Volume

    • k8s 存储的持久化需求:不管 Pod 调度到哪个节点,都能挂同一个 Volume
    • k8s 持久化存储方案中,提供两种 API 资源方式:PV(集群资源)、PVC(对集群资源的请求);其中 PV 又分静态PV、动态PV
    • 动态 PV 引入了 StorageClass 概念
    • k8s 通过访问模式给存储分成3类:RWO(ReadWriteOnce)、ROX(ReadOnlyMany)、RWX(ReadWriteMany)
    • k8s 的存储分类跟块存储、文件存储、对象存储概念对应
    • 块存储通常 RWO,少数能 ROX;Ceph、vSAN 等,不适合容器场景(RWX 缺失)
    • 文件存储支持 RWO、ROX、RWX 三种模式,如 CephFS、GlusterFS(适合容器场景,性能问题突出)
    • 对象存储不需要 PV / PVC 做资源抽象,直接访问
    • k8s 社区前期对存储抽象较乱,重新设计了统一的存储接口层 CSI,所有的 Volume 都是通过 Volume Plugin 实现

    k8s PV 创建及挂载

    // TODO

    k8s 存储卷快照 (Volume Snapshot)

    // TODO


    容器存储接口 (CSI)

    CSI 为 容器编排引擎 和 存储系统 间建立一套标准的存储调用接口

    The Container Storage Interface (CSI) is a standard for exposing arbitary block and file storage systems to containerized workloads on Container Orchestration Systems (COs) like kubernetes. Using CSI third-party storage providers can write and deploy plugins exposing new storage systems in k8s without ever having to touch the core k8s code.

    [ CO ]  ---- gRPC ---> [ CSI ]
    ------                 -------
    k8s, mesos, etc.       plugins