容器化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 |
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. 和 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 实现远程调用,编程逻辑更清晰
支持双工和流式,提供双向交互和实时交互
service Controller {
rpc CreateVolume (CreateVolumeRequest)
returns (CreateVolumeResponse) {}
……
rpc RequiresFSResize (RequiresFSResizeRequest)
returns (RequiresFSResizeResponse) {}
rpc ControllerResizeVolume (ControllerResizeVolumeRequest)
returns (ControllerResizeVolumeResponse) {}
}
service Node { rpc NodeStageVolume (NodeStageVolumeRequest)
returns (NodeStageVolumeResponse) {}
……
rpc NodeResizeVolume (NodeResizeVolumeRequest)
returns (NodeResizeVolumeResponse) {}
}
type ExpandableVolumePlugin interface {
VolumePlugin
ExpandVolumeDevice(spec *Spec, newSize resource.Quantity, oldSize resource.Quantity) (resource.Quantity, error)
RequiresFSResize() bool
}
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 次, 过程高效平滑。
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