OpenEBS是一种模拟了AWS的EBS、阿里云的云盘等块存储实现的基于容器的存储开源软件。OpenEBS是一种基于CAS(Container Attached Storage)理念的容器解决方案,其核心理念是存储和应用一样采用微服务架构,并通过k8s来做资源编排。其架构实现上,每个卷的Controller都是一个单独的Pod,且与应用的Pod在同一个节点,卷的数据使用多个Pod进行管理。
image.png
OpenEBS有很多组件,可以分为以下几类:

  • 控制平面组件:管理OpenEBS卷容器,通常会用到容器编排软件的功能
  • 数据平面组件:为应用程序提供数据存储,包含Jiva和cStor两个存储后端
  • 节点磁盘管理器:发现、监控和管理连接到k8s节点的媒体
  • 与云原生工具的整合:与Prometheus、Grafana、Fluentd和Jaeger进行整合

控制平面

OpenEBS集群的控制平面通常被称为Maya,控制平面负责供应卷、相关的卷操作,如快照、制作克隆、创建存储策略、执行存储策略、导出卷指标供Prometheus/Grafana消费等

OpenEBS控制平面Maya实现了创建超融合的OpenEBS,并将其挂载到如k8s调度引擎上,用来扩展特定的容器编排系统提供的存储功能;OpenEBS的控制平面也是基于微服务的,通常不同的组件实现存储管理功能、监控、容器编排插件等功能。
image.png
OpenEBS提供了一个动态供应器,它是标准的k8s外部存储插件。OpenEBS PV供应器的主要任务是向应用Pod发起卷供应,并实现k8s的PV规范。

m-apiserver暴露了存储 REST API,并承担了大部分的卷策略处理和管理。

控制平面和数据平面之间的连接采用k8s sidecar模式。有如下几个场景,控制平面需要与数据平面进行通信。

  • 对于IOPS、吞吐量、延迟等卷统计-通过volume-exporter sidecar实现
  • 用于通过卷控制器Pod执行卷策略,以及通过卷复制Pod进行磁盘/池管理-通过卷管理sidecar实现

下面对上述控制平面的组成进行详细说明:

OpenEBS PV Provisioner

image.png
该组件作为一个Pod运行,并做出供应决策。它的使用方式是开发者用所需的卷参数构建一个请求,选择合适的存储类,并在YAML规范上调用kubelet。OpenEBS PV动态供应器与maya-apiserver交互,在适当的节点上为卷控制器Pod和卷复制Pod创建部署规范。可以使用PVC规范中的注解来控制容量Pod(控制器/副本)的调度。

目前,OpenEBS供应器只支持一种类型的绑定,即iSCSI。

Maya-Apiserver

image.png
m-apiserver作为一个Pod运行,主要是用来暴露OpenEBS REST APIs。

m-apiserver还负责创建卷Pod所需的部署规范文件,在生成这些规范文件后,它调用kube-apiserver来相应的调度pods。在OpenEBS PV供应器的卷供应的卷供应结束时,会创建一个k8s对象PV,并挂载在应用Pod上,PV由控制器Pod托管,控制器Pod由一组位于不同节点的副本Pod支持,控制器Pod和副本Pod是数据平面的一部分。

m-apiserver的另一个重要任务是卷策略管理。OpenEBS提供了非常细化的规范来表达策略,m-apiserver解释这些YAML规范,将其转换为可执行的组件,并通过卷管理sidecar来执行。

Maya Volume Exporter

image.png