您好,登錄后才能下訂單哦!
k8s通過ceph-csi接入存儲的實例分析,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
下面的分析是k8s通過ceph-csi接入ceph存儲(csi相關(guān)組件的分析以rbd為例進(jìn)行分析),對所涉及的k8s對象與組件進(jìn)行了簡單的介紹,以及對存儲進(jìn)行操作的流程分析,存儲相關(guān)操作包括了存儲創(chuàng)建、存儲擴(kuò)容、存儲掛載、解除存儲掛載以及存儲刪除操作。
ceph-csi套件分析目錄導(dǎo)航
持久存儲卷,集群級別資源,代表了存儲卷資源,記錄了該存儲卷資源的相關(guān)信息。
(1)retain:保留策略,當(dāng)刪除PVC的時候,PV與外部存儲資源仍然存在。
(2)delete:刪除策略,當(dāng)與pv綁定的pvc被刪除的時候,會從k8s集群中刪除PV對象,并執(zhí)行外部存儲資源的刪除操作。
(3)resycle(已廢棄)
available --> bound --> released
持久存儲卷聲明,namespace級別資源,代表了用戶對于存儲卷的使用需求聲明。
pending --> bound
定義了創(chuàng)建pv的模板信息,集群級別資源,用于動態(tài)創(chuàng)建pv。
下面先簡單介紹下涉及的組件與作用,后面會有單獨詳細(xì)的介紹各個組件的作用。
負(fù)責(zé)pv、pvc的綁定與生命周期管理,并根據(jù)需求進(jìn)行創(chuàng)建/刪除底層存儲的操作,并創(chuàng)建/刪除pv對象。
本次的分析為k8s通過ceph-csi來使用ceph存儲。本次分析中,創(chuàng)建/刪除底層存儲、創(chuàng)建/刪除pv對象的操作由external-provisioner來觸發(fā)完成,所以本次分析中的PV controller只負(fù)責(zé)pv、pvc的綁定與生命周期管理。
主要負(fù)責(zé)存儲設(shè)備的Attach/Detach操作(如創(chuàng)建、刪除VolumeAttachment對象,將數(shù)據(jù)卷掛載到特定node節(jié)點上等);以及更新node.Status.VolumesAttached。
本次的分析為k8s通過ceph-csi來使用ceph存儲。本次分析中,AD controller只創(chuàng)建/刪除VolumeAttachment對象,而不會真正的將數(shù)據(jù)卷掛載到節(jié)點/從節(jié)點上解除掛載;csi-attacer組件也不會做掛載/解除掛載操作,只是更新VolumeAttachment對象,真正的節(jié)點掛載/解除掛載操作由kubelet中的volume manager調(diào)用ceph-csi來完成。
主要是管理卷的Attach/Detach(與AD controller作用相同,通過kubelet啟動參數(shù)控制哪個組件來做該操作,后續(xù)會詳細(xì)介紹)、mount/umount等操作。
本次的分析為k8s通過ceph-csi來使用ceph存儲。本次分析中,volume manager的Attach/Detach操作只創(chuàng)建/刪除VolumeAttachment對象,而不會真正的將數(shù)據(jù)卷掛載到節(jié)點/從節(jié)點上解除掛載;csi-attacer組件也不會做掛載/解除掛載操作,只是更新VolumeAttachment對象,真正的節(jié)點掛載/解除掛載操作由kubelet中volume manager調(diào)用rc.operationExecutor.MountVolume/rc.operationExecutor.UnmountDevice方法時,調(diào)用ceph-csi來完成。
擴(kuò)展各種存儲類型的卷的管理能力,實現(xiàn)第三方存儲的各種操作能力與k8s存儲系統(tǒng)的結(jié)合。調(diào)用第三方存儲的接口或命令,從而提供數(shù)據(jù)卷的創(chuàng)建/刪除、attach/detach、mount/umount的具體操作實現(xiàn),可以認(rèn)為是第三方存儲的代理人。前面分析組件中的對于數(shù)據(jù)卷的創(chuàng)建/刪除、attach/detach、mount/umount操作,全是調(diào)用volume plugin來完成。
后續(xù)對volume plugin的詳細(xì)分析,以通過ceph-csi操作rbd為例進(jìn)行分析。
根據(jù)源碼所在位置,volume plugin分為in-tree與out-of-tree。
在k8s源碼內(nèi)部實現(xiàn),和k8s一起發(fā)布、管理,更新迭代慢、靈活性差。
代碼獨立于k8s,由存儲廠商實現(xiàn),有csi、flexvolume兩種實現(xiàn)。
本次的分析為k8s通過ceph-csi來使用ceph存儲。本次分析中的volume plugin是指ceph-csi及其相關(guān)組件,包括ceph-csi、external-provisioner、external-attacher、external-resizer等。
下面對每個操作的整體流程進(jìn)行分析,后面會對涉及的每個組件進(jìn)行源碼分析。
(1)用戶創(chuàng)建pvc對象;
(2)external-provisioner組件監(jiān)聽到pvc的新增事件,調(diào)用csi組件進(jìn)行存儲的創(chuàng)建;
(3)csi組件調(diào)用ceph創(chuàng)建底層存儲;
(4)底層存儲創(chuàng)建完成后,external-provisioner根據(jù)存儲信息,拼接pv對象,創(chuàng)建pv對象;
(5)pv controller監(jiān)聽pvc對象,尋找合適的pv對象,與pvc對象綁定。
(1)修改pvc對象,修改申請存儲大小;
(2)修改成功后,external-resizer監(jiān)聽到該pvc的update事件,發(fā)現(xiàn)pvc.Spec.Resources.Requests.storgage比pvc.Status.Capacity.storgage大,于是調(diào)csi controller端擴(kuò)容,進(jìn)行底層存儲擴(kuò)容,擴(kuò)容完畢后更新pv對象的.Spec.Capacity.storgage;
(3)kubelet的volume manager在reconcile()調(diào)諧過程中發(fā)現(xiàn)pv.Spec.Capacity.storage大于pvc.Status.Capacity.storage,于是調(diào)csi node端擴(kuò)容,對dnode上存儲對應(yīng)的文件系統(tǒng)擴(kuò)容,成功后kubelet更新pvc.Status.Capacity.storage。
kubelet啟動參數(shù)--enable-controller-attach-detach,該啟動參數(shù)設(shè)置為 true 表示啟用 Attach/Detach controller進(jìn)行Attach/Detach 操作,同時禁用 kubelet 執(zhí)行 Attach/Detach 操作(默認(rèn)值為 true)。實際上Attach/Detach 操作就是創(chuàng)建/刪除VolumeAttachment對象。
(1)kubelet啟動參數(shù)--enable-controller-attach-detach=true,Attach/Detach controller進(jìn)行Attach/Detach 操作
(2)kubelet啟動參數(shù)--enable-controller-attach-detach=false,kubelet端volume manager進(jìn)行Attach/Detach 操作
(1)用戶創(chuàng)建一個掛載了pvc的pod;
(2)AD controller或volume manager中的reconcile()發(fā)現(xiàn)有volume未執(zhí)行attach操作,于是進(jìn)行attach操作,即創(chuàng)建VolumeAttachment對象;
(3)external-attacher組件list/watch VolumeAttachement對象,更新VolumeAttachment.status.attached=true;
(4)AD controller更新node對象的.Status.VolumesAttached屬性值,將該volume記為attached;
(5)kubelet中的volume manager獲取node.Status.VolumesAttached屬性值,發(fā)現(xiàn)volume已被標(biāo)記為attached;
(6)于是volume manager中的reconcile()調(diào)用ceph-csi組件的NodeStageVolume與NodePublishVolume完成掛載。
(1)AD controller
(2)volume manager
(1)用戶刪除聲明了pvc的pod;
(2)AD controller或volume manager中的reconcile()發(fā)現(xiàn)有volume未執(zhí)行dettach操作,于是進(jìn)行dettach操作,即刪除VolumeAttachment對象;
(3)AD controller或volume manager等待VolumeAttachment對象刪除成功;
(4)AD controller更新新node對象的.Status.VolumesAttached屬性值,將標(biāo)記為attached的該volume從屬性值中去除;
(5)kubelet中的volume manager獲取node.Status.VolumesAttached屬性值,找不到相關(guān)的volume信息;
(6)于是volume manager中的reconcile()調(diào)用ceph-csi組件的NodeUnpublishVolume與NodeUnstageVolume完成解除掛載。
(1)用戶刪除pvc對象;
(2)pv controller發(fā)現(xiàn)與pv綁定的pvc對象被刪除,于是更新pv的狀態(tài)為released;
(3)external-provisioner watch到pv更新事件,并檢查pv的狀態(tài)是否為released,以及回收策略是否為delete;
(4)接下來external-provisioner組件會調(diào)用ceph-csi的DeleteVolume來刪除存儲;
(5)ceph-csi組件的DeleteVolume方法,調(diào)用ceph集群命令,刪除底層存儲;
(6)external-provisioner組件刪除pv對象。
關(guān)于k8s通過ceph-csi接入存儲的實例分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。