學習筆記 華為云云原生王者之路集訓營-黃金階段(中)
954
2025-04-06
聲明:本篇文章部分資料來自《華為云云原生鉆石課程》黃金課程集訓營第5課,本課程為鉆石課程的第五課,由云原生存儲解決方案Everest2.0的架構設計專家Jabin主講,跟隨K8S的存儲演進史,進一步了解容器存儲的架構設計。
學完本課程后,您將能夠了解到:
了解Kubernetes容器存儲發展歷程
了解StorageClass工作原理
了解CSI容器存儲接口架構
了解Kubernetes out-tree存儲兼容in-tree存儲的機制
本文將會分為三個部分講解:
1.StorageClass工作原理分析
2.CSI容器存儲接口架構解讀
3.云原生存儲最佳實踐:從FlexVolume插件向CSI插件遷移
1.StorageClass工作原理分析
1.1 StorageClass工作原理解讀
StorageClass是存儲類,簡稱sc。
可以理解為K8S平臺為存儲提供商提供存儲接入的一種聲明,通過sc和相應的存儲插件
(csi/flexvolume)為容器應用提供動態分配存儲卷的能力。
從圖1.1可以看出pod 使用 pvc ,pvc會指定 StorageClass 要使用哪一個 driver來提供存儲,再通過 driver 來創建一個 pv 來與 pvc 進行綁定,最終為 pod 服務
圖1.1
sc用以指定存儲池的:
1.供應商的名字:everest-csi-provisioner
2.分配PV卷的回收策略:Delete/Retain
3.分配PV卷的綁定模式:Immediate/WaitForFirstConsumer
4.存儲是否支持擴容:true/false 5 驅動名字:disk.csi.everest.io、…
5. 驅動名字:disk.csi.everest.io、…
6.驅動類型:塊存儲、文件存儲、對象存儲…
1.2 ?StorageClass應用場景解讀
無論在資源管控嚴格還是資源管控敏捷的場景,資源管理員都希望通過創建 k8s的存儲接口來管理容器存儲資源。
k8s通過存儲聲明(pvc)、存儲類(sc)和存儲插件(driver)聯合工作,來滿足用戶一鍵式定義、創建存儲。
1.用戶在StatefulSet模板中定義對存儲的需要
2.StatefulSet控制器負責將claim模板轉換為pvc
3.結合自定的sc和sc中指定的driver,創建應用所需要的pv卷。
1.3有狀態應用使用動態PV卷示例
1.定義一個有狀態應用:etcd;
2.在workload模板中定義volumeClaimTemplates來使用動態PV卷;
3.使用kubectl指令創建應用;
4.查詢sts、pods、pvc如下:
2.CSI容器存儲接口架構解讀
2.1Kubernetes中存儲相關的組件解讀
2.2什么是云原生存儲
既然談到了csi就不免了解一下云原生存儲
云原生的理解:
1.從術視角看:一種還在不斷演進中的設計思想,它主要是為了充分利用云計算的優勢、促進云計算技術發展而構建和運行應用的設計思想;
2.從戶視角看:一種讓用戶從選代慢、運維重、升級難的包袱中解脫出來,聚焦業務開展的設計思想。
云原生應用的理解:
基于云原生技術構建、運行的應用程序,它具有:
1.行為可預測,快速彈性擴縮容;
2.持續交付,使研發流程更敏捷;
3.基于API構建,團隊協作更順暢;
4.獨立性強,促進DevOps的開展;
5.依賴少,輕量,故障恢復快速。
云原生存儲的理解:
1.從技術視角看:符合以應用為中心可被聲明和組合實現、是API驅動和服務自治、
具有敏捷等特性的存儲系統; Container Orchestrators;
2.從用戶視角看:最大的是使能云原生應用特性的存儲系統。
以CSI存儲架構為例,解讀容器存儲架構,如下圖1所示:
1.控制接口A:K8S平臺通過控制接口調用存儲提供商發布的控制API;
2.控制接口B:K8S平臺通過sideCar(external-provisioner/attacher等)調用存儲提供商發布的控制API;
3.數據接口C:數據面,存儲通過文件系統、塊設備等方式為K8S平臺中運行的 workload提供存儲讀寫等能力。
圖2.1
2.3 CSI存儲架構解讀
2.4 CSI存儲接口解讀
CSI接口共分為3類:
1.identity
2.nodeServer
3. controllerServer
CSI服務共分為2類:
1. NodeServer:kubelet對已經綁定到節點上的存儲卷的操作,如mount/umount格式化等;
2.ControllerServer:對存儲服務管理的操作,如創建/刪除、快照、擴容等
2.5 自研CSI插件的構建思路
CSI接口調用流程,我們以塊存儲為例,圖示接口調用,如圖5.1所示;
CSI插件的sideCar和node-driver之間的關系,如圖5.2所示:
1.控制面的sideCar與driver通過Deployment/StatefulSet部署;
2.數據面的sideCar與driver通過DaemonSet部署;
3.sideCar容器和driver容器在pod中通過UDS(unixdomain socket)調用,完成卷的生命周期管理
4.Kubelet與node-driver之間通過UDS調用,完成節點上卷的格式化、掛載給容器使用操作。
csi接口調用流程圖2.5.1
圖2.5.2
2.6 ?CSI插件注冊流程解讀
CSI插件在kubernetes中的注冊流程:
1.Kubelet啟動后,plugin Manager不斷watch插件目錄:
/var/lib/kubelet/plugin registry/,主要方法是:
kubelet.getPluginsRegistrationDir()
2.通過DaemonSet部署的csi-driver,在節點啟動后:
2.1 ?Drivers容器啟動后,創建gRPCserver,并監聽csi.sock
2.2 sideCar容器啟動后,也創建一個gRPCserver,并監聽{driverName).-reg.sock,node-driver-registrar通過UDS調用 GetPlugininfo0向driver請求driver信息;
3.Kubelet pluginManager發現{driverName}.-reg.sock后,會納入插件管理里;
csi VolumePlugin會向{driverName}.-regsock通過gRPCclient向node-driver registrar發
送Getlnfo()請求;
4.Kubelet csi VolumeManager向driver的csisock發送NodeGetInfo()請求;
5.Kubelet根據收集到的信息,創建CSINode信息;
6.Kubelet調用NotifyRegistrationStatus()通知node-driver-reqistrar注冊情況。
3. 云原生存儲最佳實踐:從FlexVolume插件向CSI插件遷移
3.1 CSI插件和Flexvolume插件對比
1.Flexvolume 插件是以二進制發布,并且集成在kube-controller-manager和?kubelet的插件目錄下:/usr/libexec/kubernetes/kubelet-plugins/volume/exec;
2.控制面:以二進制的形式集成到kube-controller-manager容器中;
3.數據面:以DaemonSet的形式部署,安裝到node插件目錄下,然后驅動插件向kubelet注冊;
#Is /usr/libexec/kubernetes/kubelet-plugins/volume/exec
huawei.com~fuxiefs huawei.com~fuxinfs huawei.com~fuxiobs huawei.com~fuxivol
4.功能:創建/刪除、掛載/卸載、綁定/去綁定操作。
1.CSI插件以全容器形式部署,通過sideCar+driver構建完整的解決方案;
2.控制面:以Deployment或StatefulSet部署在用戶集群中,通過訂閱pvc、va等k8s對象,實現存儲卷的生命周期管理;
3.數據面:以DaemonSet的形式部署,通過kubeletgRPC(UDS)調用實現本節點上的存儲與容器的綁定操作管理;
4. 功能:創建/刪除、掛載/卸載、綁定/去綁定,以及增強功能擴容、快照等。
3.2 CSI存儲兼容in-tree插件存儲的方案解讀
k8s社區里通過CSIMigration來實現in-tree的存儲插件向CSI插件“遷移”,或稱之為兼容,這部分兼容會逐步“日落”并下線。
CSIMigration,歸根到底就是起到一個轉換器作用,在保證北向API不改變的情況下進行轉換成CSI的持久卷,并能夠被CSI插件管理。
主要涉及到的組件有:
1.Kube-controller-manager:
1.1.添加支持CSIMigration的插件--appendAttachableLegacyProviderVolumes;
1.2.DSW、AttachDetach控制器、expand控制器中添加CSIMigration的csiMigratedPluginManager和intreeToCSITranslator,負責將intree的volume配置信息轉換為CSI格式的配置信息,以供后續CSI插件調用;
2.Kubelet:
2.1.添加支持CSIMigration的插件--appendLegacyProviderVolumes
2.2.volumeMange中添CSIMigration的csiMigratedPluginManager和intreeToCSITranslator,負責將intree的volume配置信息轉換為CSI格式的配置信息,以供后續CSI插件調用;
3.3 csi-migration-lib庫解讀
3.4 CCE服務中CSI存儲兼容Flexvolume持久卷的方案解讀
華為CCE服務為了能夠讓用戶使用CSI存儲插件中提供的增強能力,在K8S1.15版本中提供了兼容Flexvolume PV存儲的CSI插件。
總結
在本文的最后呢,做一下總結,另外在最后還提供了參考鏈接,有想基于csi開發存儲插件的的可以看一下官方的文檔,介紹的比較詳細一些。
名稱
簡介
StatefulSet
簡稱sts,有狀態應用,一種k8s為用戶提供一組具有有序、唯一、穩定的應用實例集合。
Volume
卷,k8s為存算分離所做的解耦設計,讓用戶更加專注于業務功能設計。它在k8s中是依托于pod而使用的。
PersistentVolume
簡稱pv,持久化存儲,是k8s為云原生應用提供一種擁有獨立生命周期的用戶可管理的存儲抽象設計。
PersistentVolumeClaim
簡稱pvc,持久化存儲聲明,是K8S為解耦云原生應用和數據存儲而設計的通過pvc可以讓資源管控更細更靈活、團隊職責分離、應用模板更通用,進一步解除了用戶被云平臺鎖定的顧慮。
StorageClass
簡稱sc,存儲類,是K8S平臺為存儲提供商提供存儲接入的一種聲明,通過sc和相應的存儲插件(csi/flexvolume)為容器應用提供動態分配存儲卷的能力。
參考鏈接:
1.相關內容的華為云官網鏈接:
https://support.huaweicloud.com/usermanual-cce/cce01 0042.html
2.CCE云容器引擎官方首頁:
https://www.huaweicloud.com/product/cce.html
3.Kubernetes CSI官方文檔:
https://kubernetes-csi.github.io/docs/introduction.html
4.Kubernetes官方文檔:
StatefulSet:
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Storage:
https://kubernetes.io/docs/concepts/storage/
本文整理自華為云社區【內容共創】活動第13期。
https://bbs.huaweicloud.com/blogs/330939
任務22.
華為云云原生鉆石課程05:Kubernetes存儲架構原理深度剖析(下)
Kubernetes 云原生
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。