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