容器化RDS:计算存储分离架构下的“Split-Brain”
容器化RDS:计算存储分离还是本地存储?
容器化RDS:你需要了解数据是如何被写"坏"的
容器化RDS:PersistentLocalVolumes和VolumeScheduling
现有 Kubernetes 存储插件系统问题
Container Storage Interface(CSI)
基于CSI 和分布式文件系统实现在 MySQL 的 Volume 动态扩展
对 CSI 的展望
原名 | 简称 |
容器编排系统 | CO. |
存储提供者 | SP. |
存储插件接口 | Volume Plugin Interface |
存储驱动 | Volume Driver |
容器存储接口 Container Storage Interface |
CSI |
可供选的容器编排系统(后面简称 CO.)不少,除去 Kubernetes 还有 Mesos、Swarm、Cloud Foundry。以 Kubernetes 为例,其通过 PersistentVolume 抽象对以下存储的支持:
GCEPersistentDisk
AWSElasticBlockStore
AzureFile
AzureDisk
FC(Fibre Channel)**
FlexVolume
Flocker
NFS
iSCSI
RBD(Ceph Block Device)
CephFS
Cinder(OpenStack block storage)
GlusterFS
VsphereVolume
Quobyte Volumes
HostPath
VMware Photon
Portworx Volumes
ScaleIO Volumes
StorageOS
VolumePlugin
PersistentVolumePlugin
DeletableVolumePlugin
ProvisionableVolumePlugin
ExpandableVolumePlugin
Provisioner
Deleter
需要在 Kubernetes 中给各个 SP. 赋权以便他们能够提交代码到仓库;
Volume Driver 由各个 SP. 提供,Kubernetes 的开发者并不了解每个细节,导致这些代码难于维护和测试;
Kubernetes 的发布节奏和各位 SP. Volume Driver 的节奏并不一致,随着支持的 SP. 增多,沟通、维护、测试成本会越来越高;
这些 SP. Volume Driver 并不是 Kubernetes 本身需要的。
提交一个新特性或者修复 bug,都需要提交代码到 Kubernetes 仓库,在本地编译 Kubernetes 的都知道,这个过程是很痛苦的,这对 SP. 而言是完全不必要的成本。
基于这些问题和挑战,CO 厂商提出 Container Storage Interface 用来定义容器存储标准,它独立于 Kubernetes Storage SIG,由 Kubernetes、Mesos、Cloud Foundry 三家一起推动。个人理解它有如下2个核心目标:
提供统一的 CO. 和 SP. 都遵循的容器存储接口。
一旦 SP. 基于 CSI 实现了自身的 Volume Driver,即可在所有支持 CSI 的 CO 中平滑迁移。
Controller Plane、Kubelet 不再直接与 Volume Driver 交互,引入 external-provisioner 和 external-attacher 完成该工作;
SP. Volume Driver 会由独立的容器运行;
为了实现 external-provisioner、external-attacher 和 SP. Volume Driver 的交互引入 gRPC 协议(标红箭头)。
在 Kubernetes 端 引入新的对象:
CSIPersistentVolumeSource:该类型 PV 由 CSI Driver 提供
VolumeAttachment:同步 Attach 和 Dettach 信息
引入新的名称:
mount/umount:NodePublishVolume/NodeUnpublishVolume
attach/dettach:ControllerPublishVolume/ControllerUnpublishVolume
扩展 CSI Spec
扩展 CSI Plugin
基于 CSI Spec 实现 Storage Driver
演示
其他
基于 protobuf 定义强类型结构,便于阅读和理解
通过 stub 实现远程调用,编程逻辑更清晰
支持双工和流式,提供双向交互和实时交互
CSI Driver 实现如下所有接口:
CreateVolume
DeleteVolume
ControllerPublishVolume
ControllerUnpublishVolume
ValidateVolumeCapabilities
ListVolumes
GetCapacity
ControllerGetCapabilities
RequiresFSResize
ControllerResizeVolume
定义 CSI 对应的 StorageClass,并设置 allowVolumeExpansion 为 true
启用 Feature Gates:ExpandPersistentVolumes
新增 Admission Control:PersistentVolumeClaimResize
……
通过键值更新和查询
批量数据加载数据
读数一:MySQL QPS 在正常波动范围内;
读数二:持续批量加载数据,MySQL 文件系统容量不断变大;
读数三:在20分钟内,在线动态扩容 Volume 和 Filesystem 2 次, 过程高效平滑。
目前 CSI 已发展到 0.2.0,0.3.0 也发布在即。
0.3.0 中呼声最高的特性是 Snapshot。借助该功能,可以实现备份和异地容灾。但是为了实现该功能,在 Kubernetes 现有的 Control-Plane 上还要添加新的 Controller,客观上,复杂度会进一步提高。
https://github.com/kubernetes/kubernetes/blob/afa68cc28749c09f8655941b111e46d85689daf8/pkg/volume/plugins.go#L95
https://github.com/container-storage-interface/spec/blob/master/spec.md
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md
https://github.com/container-storage-interface/spec/blob/master/csi.proto
https://docs.google.com/document/d/1kVrNwA2f4ite8_9QvCy-JQA_00hxGGMdER3I84dUDqQ/edit?usp=sharing
| 作者简介
熊中哲,沃趣科技产品及研发负责人
曾就职于阿里巴巴和百度,超过10年关系型数据库工作经验,目前致力于将云原生技术引入到关系型数据库服务中。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。