華為云云原生鉆石集訓營 第五課:Kubernetes存儲架構原理深度剖析(下)
課程目標:
1.了解Kubernetes容器存儲發展歷程
2.了解StorageClass工作原理
3.了解CSI容器存儲接口架構
4.了解Kubernetes out-tree存儲兼容in-tree存儲的機制
目錄:
1. StorageClass工作原理分析
2. CSI容器存儲接口架構解讀
3.云原生存儲最佳實踐:從FlexVolume插件向CSI插件遷移
K8S初期為存算分離所做的解耦設計Volume,米用強耦合、滅活性.左HII-Tee保T工上種t橐收數)徳于業務功能設計。但這類存儲卷的生命周期是跟隨pod的,只能用作存儲臨時數據,無法做為最終數據使用。
隨著K8S的不斷成熟,為支持更多的應用場景,提供了一種脫離pod生命周期的、用戶可管理的存儲抽象設計低耦合、靈活性更強的PersistentVolume/PersistentVolumeClaim。
PV/PVC如何與Flexvolume/CSI的插件一起工作呢?那就是我們接下來要學習的StorageClass。
1. StorageClass工作原理分析
StorageClass工作原理解讀
StorageClass是存儲類,簡稱sc。 K8S平臺為存儲提供商提供存儲接入的一種聲明,通過sc和相應的存儲插件(csi/flexvolume)為容器應用提供動態分配存儲卷的能力。
sc用以指定存儲池的:
1.供應商的名字: everest-csi-provisioner
2.分配PV卷的回收策略:Delete/Retain
3.分配PV卷的綁定模式: lmmediate/WaitForFirstConsumer
4.存儲是否支持擴容: true/false
5.驅動名字: disk.csi.everest.io、.....
6.驅動類型:塊存儲、文件存儲、對象存儲........
StorageClass應用場景解讀
無論在資源管控嚴格還是資源管控敏捷的場景,資源管理員都希望通過創建k8s的存儲接口來管理容器存儲資源。
k8s通過存儲聲明(pvc)、存儲類(SC)和存儲抽件(ariver)從口L1P,滿足用戶一鍵式定義、創建存儲。
1.用戶在StatefulSet模板中定義對存儲的需要
2.StatefulSet控制器負責將claim模板轉換為pvc
3.結合自定的sc和sc中指定的driver,創建應用所需要的pv卷。
2.CSI容器存儲接口架構解讀
什么是云原生存儲?
云原生的理解:
1.從技術視角看:一種還在不斷演進中的設計思想,它主要是為了充分利用云計算的優勢、促進云計算技術發展而構建和運行應用的設計思想;
2.從用戶視角看:一種讓用戶從迭代慢、運維重、升級難的包袱中解脫出來,聚焦業務開展的設計思想。
云原生應用的理解:基于云原生技術構建、運行的應用程序,它具有:
1.行為可預測,快速彈性擴縮容;
2.持續交付,使研發流程更敏捷;
3.基于API構建,團隊協作更順暢;
4.獨立性強,促進DevOps的開展;
5.依賴少,輕量,故障恢復快速。
云原生存儲的理解:
1.從技術視角看:符合以應用為中心、可被聲明和組合實現、是API驅動和服務自治、具有敏捷等特性的存儲系統;
2.從用戶視角看:最大的是使能云原生應用特性的存儲系統。
CSI是容器存儲接口規范,被K8S選為存儲接入規范。
以CSI存儲架構為例,解讀容器存儲架構,如下圖所示:
1.控制接口A:K8S平臺通過控制接口調用存儲提供商發布的控制APl;
2.控制接口B:K8S平臺通過sideCar (external-provisioner/attacher等)調用存儲提供商發布的控制APl;
3.數據接口C:數據面,存儲通過文件系統、塊設備等方式為K8S平臺中運行的workload提供存儲讀寫等能力;
CSI存儲接口解讀
1.CSI接口可分為三類:identity、ControllerServer、nodeServer。
CSI服務共分為2類:
①NodeServer: kubelet對已經綁定到節點上的存儲卷的操作,如mount/umount.格式化等;
②ControllerServer:對存儲服務管理的操作,如創建/刪除、快照、擴容等
自研CSI插件的構建思路
1.CSI接口調用流程,我們以塊存儲為例,圖示接口調用,如右圖所示;
2.CSI插件的sideCar和node-driver之間的關系,如下圖所示:
控制面的sideCar與driver通過Deployment/StatefulSet部署;
數據面的sideCar與driver通過DaemonSet部署;
sideCar容器和driver容器在pod中通過UDS(unix domain socket)調用,完成卷的生命周期管理;
Kubelet與node-driver之間通過UDS調用,完成節點上卷的格式化、掛載給容器使用操作。
CSI架構中sideCar與driver之間是采用UDS(Unix Domain Socket)通訊的。
CSI插件注冊流程解讀:
CSI插件在kubernetes中的注冊流程:
1.Kubelet啟動后,plugin Manager不斷watch插件目錄:
/var/lib/kubelet/plugin_registry/,主要方法是:kubelet.getPluginsRegistrationDir()
2.通過DaemonSet部署的csi-driver,在節點啟動后:
①Drivers容器啟動后,創建gRPC server,并監聽csi.sock
②sideCar容器啟動后,也創建一個gRPC server,并監聽{driverName}.-reg.sock,node-driver-registrar通過UDS調用GetPluginInfo)向driver請求driver信息;
3.Kubelet pluginManager發現{driverName}.-reg.sock后,會納入插件管理里;csi VolumePlugin會向{driverName}.-reg.sock通過gRPC client向node-driver-registrar發送GetInfo()請求;
4.Kubelet csi VolumeManager向driver的csi.sock發送NodeGetlnfo()請求;
5.Kubelet根據收集到的信息,創建CSINode信息
6.Kubelet調用NotifyRegistrationStatus()通知node-driver-registrar注冊情況。
3.云原生存儲最佳實踐:從FlexVolume插件向CSI插件遷移
CSI存儲兼容in-tree插件存儲的方案解讀:
k8s社區里通過CSIMigration來實現in-tree的存儲插件向CSI插件“遷移”,或稱之為兼容,這部分兼容會逐步“日落”并下線。
CSIMigration,歸根到底就是起到一個轉換器作用,在保證北向API不改變的情況下進行轉換成CSI的持久卷,并能夠被CSI插件管理。
主要涉及到的組件有:
1. Kube-controller-manager:
添加支持CSIMigration的插件——appendAttachableLegacyProviderVolumes;
Dsw、AttachDetach控制器、expand控制器中添加CSIMigration的csiMigratedPluginManager和intreeToCSITranslator,負責將intree的volume配置信息轉換為CSI格式的配置信息,以供后續CSI插件調用;
2. Kubelet:
添加支持CSIMigration的插件———appendLegacyProviderVolumes
volumeManger中添加CSIMigration的csiMigratedPluginManager和intreeToCSITranslator,負責將intree的volume配置信息轉換為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/cce_01_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/
Kubernetes 云原生 容器
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。