研發測試場景下,一般追求的是一鍵快速起環境,橫向動態複製,一人一套,隨起隨用,用完即走。作為使用方,其不用關心實際的物理資源是怎樣的,環境起在哪裡,只要宣告自己的使用需求即可。但作為方案構建者以及infrastructure支撐,我們卻深知,要想提供更好的解決方案,箇中問題還有很多,且頗為不易。
比如在過去,筆者就曾一度困擾於如何優雅的放開本地物理盤給業務使用這個問題,尤其是本地HDD資料盤。
這裡有個背景,我們的Kubernetes研發測試叢集是用線上退下來的過保機器搭建,然後七牛又搞雲端儲存,所以我們的機器中很多那種多盤位的儲存密集型機器(比如掛12塊4T的盤)。所以如何更好的利用這些磁碟,就是個問題。
方案之一是把這些盤組成網路儲存,然後通過七牛自身的雲服務或者ceph等系統提供出去,這當然是可行的。不過有些業務其實就想單純使用物理盤,那該怎麼辦呢?
縱觀Kubernetes目前原生提供的幾種方案,筆者發現都不完美:
筆者以為,理想中的本地磁碟使用方案,應當是按需申請,空間隔離,且自動化生命週期管理。這樣才能既方便終端使用者使用,也能減少運維支撐,提高效率。這裡的關鍵技術點有三個:
綜合以上三點,我們會發現基於 LVM或分割區技術+CSI 的實現,當是比較符合上述使用者體驗的,而TopoLVM就是這樣一個專案。
TopoLVM是基於LVM的Kubernetes在地化磁碟方案,以CSI形式提供給使用者使用。目前主要支援以下功能:
整體架構如下:
值得注意的是,在早期版本,為了能夠動態感知節點上的剩餘儲存容量,TopoLVM設計了個自定義擴充套件排程器(上圖topolvm-scheduler部分),方便在Scheduling階段為Pod繫結合適的Node。而在Kubernetes 1.21之後,Kubernete已經原生支援了 Storage Capacity Tracking的能力,這塊的實現整體就變的優雅很多,topolvm-Scheduler也就不再需要了。
當然,要想認知到TopoLVM的核心原理,除了瞭解CSI編寫規範外,最重要的就是需要了解LVM相關技術。而正是因為通過LVM能夠動態建立LV,動態擴縮容,TopoLVM才能支援動態Provisioning相關的能力。
不過,雖然作為開源專案TopoLVM已基本夠用,但豐富度略顯不足。而博雲近期也開源了他們的雲原生本地磁碟管理方案Carina,看起來更完善一些。
Carina除了提供基於LVM的方案外,還支援裸盤分割區方式,以及IOPS限制等,功能更加豐富。程式碼組織規範也更貼合雲原生社群的方式,整體非常值得一探。
參考連結