CSI 基礎
CSI隻支援PV、PVC方式,不支援Volume方式;
官方資料:
https://kubernetes-csi.github.io/docs/How to Write CSI Plugin:
https://arslan.io/2018/06/21/how-to-write-a-container-storage-interface-csi-plugin/目前版本資訊:
Kubernetes | CSI Version | CSI Status |
---|---|---|
v1.9 | v0.1 | Alpha |
v1.10 | v0.2 | Beta |
v1.11 | v0.3 | |
v1.12 | ||
v1.13 | v1.0.0 | GA |
CSI基礎架構:
下圖是典型的資料卷生命周期流程圖,一般塊存儲都是按照這個流程執行;
PV-Controller
Controller Manager的一部分,主要做卷的provision/delete,pv、pvc綁定;
PV Controller通過監聽API Server中的PV,PVC,SC三類資源更新,當監聽到這些資源的建立、删除、修改時,PV Controller做建立、删除、綁定、回收。
PV Controller 會調用注冊的Provisioner完成存儲卷的建立,然後建立PV對象,并與PVC進行綁定;
AD-Controller
Controller Manager的一部分,主要從事塊裝置的attach/detach(例如:rbd,ebs塊裝置需要在mount之前先attach 到主機上)
非必選: attach/detach可以通過kubelet的volume manager驅動,Controller Manager提供配置可以禁用。
通過在kubelet中--enable-controller-attach-detach,設定是否通過AD Controller來管理配置設定到本節點的pod volume AD;
--enable-controller-attach-detach=true:通過AD-Controller做AD,kubelet禁用;
--enable-controller-attach-detach=false:通過kubelet做AD,AD-Controller對本節點禁用;
作用:當API Server中pod(配置了pvc)與node間的關系發生變化時,通過調用存儲插件将這個pod關聯的PV Attach/Detach到對應node上. 完成後通知其它關聯元件(kubelet)。
Volume Manager
運作在kubelet裡,主要完成attach/detach/mount/unmount;
mount/unmount操作是可選的,通過kubelet配置的enable-controller-attach-detach參數确定;
當pod排程到這個node上後才會有卷的相應操作,是以它的觸發端是:kubelet根據Pod Manager裡pod spec裡的存儲配置來觸發卷的挂載操作;
Kubelet會監聽到排程到該節點上的pod,把pod緩存到Pod Manager中;
VolumeManager通過Pod Manager擷取PV/PVC的狀态,并分析出具體的attach/detach、mount/umount操作,然後調用plugin進行相應的業務處理;
External-Provisioner
監聽 Kubernetes PVC 對象,并觸發對 CSI Plugin的 CreateVolume 和DeleteVolume 操作;
CreateVolume成功後,建立PV對象;
External-Attacher
監聽 VolumeAttachment 對象,觸發 ControllerPublish 和 ControllerUnPublish 操作,通過 CSI endpoint 觸發;
Driver-Register
向 Kubelet注冊 CSI Plugin 程式,并将 NodeId 添加到 Kubernetes Node 對象的 annotation 裡面。
Volume Plugin
存儲提供的擴充接口, 包含了各類存儲提供者的plugin實作;
會調用CSI Plugin的NodeStageVolume、NodePublishVolume接口實作格式化、挂載等功能。