您好,登錄后才能下訂單哦!
容器化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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。