云原生存储作为云原生堆栈中容器化操作的底层架构之一,将底层存储服务暴露给容器和微服务,可以聚合来自不同介质的存储资源,通过提供持久卷使有状态的工作负载能够在容器内运行。云原生计算基金会(CNCF)对云原生存储的定义:一般包括三点,第一是运行在 K8s 上,即其本身是容器形态;第二是使用 K8s 对象类,主要是自定义资源(CRD);第三也是最重要的一点,必须使用容器存储接口 (CSI)。
云原生存储是针对新的云原生环境而量身定制的:传统存储硬件与基础设施紧密绑定,不同数据中心也可能使用不同的存储接口,存储置备也难以自动操作;而云原生架构极具流动性、灵活性和弹性,容器化应用程序会不断地创建和删除,容器运行的物理位置也会发生变化,这些变化都对存储方案提出了新的要求:
云原生存储需要使用云原生兼容的容器存储接口,并且可以自动进行置备,消除人为操作瓶颈,实现自动缩放和自我修复。在 K8s 环境下,云原生存储使用提供标准 API 的容器存储接口(CSI)提供存储服务。因此可以看出云原生存储重点强调存储方案对云原生环境和接口标准化的支持特性,而并不区分存储类型、存储架构、部署环境、支持的应用负载等。
云原生存储的关键特性
高可用
在系统故障情况下访问数据的能力。这就要求存储具备以下几个要素:
在其它存储设备上,维护数据的复制副本。
在任何故障情况下,冗余设备都会处理故障转移。
故障组件可以修复和恢复。
以下几个是衡量高可用性的指标:恢复时间目标 (RTO)、恢复点目标 (RPO)、正常运行时间百分比、平均故障间隔时间 (MTBF)、平均恢复时间 (MTTR)
可扩展性
云原生存储可以轻松灵活扩展。一般从 4 个维度来定义:
客户端可扩展性:有能力增加访问存储系统的客户端和用户的强度。
吞吐量可扩展性:能够以更高的吞吐量运行。
容量可扩展性:具有在单次部署中增加存储系统的存储容量的能力。
集群可扩展性:可以根据需要通过添加更多组件来增加存储组件。
存储性能
衡量存储的性能通常有两个标准:
一致性
存储服务的一致性是指在提交新数据或更新数据后,访问这些新数据的能力;根据数据一致性的延迟效果,可以将存储分为:“最终一致”和“强一致”存储。
系统“强一致性”:修改数据返回完成后,从客户端读取立马能够读取最新的数据,相比弱一致性。
系统“最终一致性”:修改数据返回完成后,从客户端读取可能不是读取最新的数据,要过一会可能才能读取到最新的数据。
不同的服务对存储一致性的敏感度是不一样的,像数据库这类对底层数据准确性和时效性要求非常高的应用,对存储的要求是具有强一致性的能力。
耐用性
云原生存储应该是持久的,需要保护数据免受任何丢失。不仅仅是可访问性,存储系统要确保数据可以长期存储。一些因素会影响存储系统的耐用性:
数据保护层,例如可用的多个数据副本。
冗余级别——本地冗余、远程站点冗余、公有云可用区冗余以及区域冗余。
存储介质的耐用特性——例如 SSD、旋转磁盘、磁带。
系统能够检测由于组件故障、流量溢出等导致的损坏,并自动重建或恢复损坏的数据。
动态部署
动态部署是云原生存储系统的最终理想标准,可以根据需要快速部署或配置,也可以通过多种方式进行部署和实例化,其中包括:
硬件部署:部署在数据中心的物理存储设备。使用此部署模型来构建标准化组件,这些组件无需特殊配置即可添加到集群中、需要时进行交换和删除。
软件部署:存储组件被定义为软件组件部署在硬件、设备或云实例上。无论是本地环境还是云环境,云原生软件解决方案通常都可以安装。一些软件定义的存储系统被构建为容器,并且可以使用容器编排自动部署。
云服务:这些云服务可以由公有云提供商管理并作为服务交付,抽象了底层存储实现。用户可以通过使用 Web 界面或 API,配置新实例或额外存储。