容器存儲架構比較:Kubernetes、Docker和Mesos Compare
任何應用程序都需要數據支撐,這也是我們商業存在基石。最初,容器應運而生的主要目的之一也是為了解決無狀態服務。但短期時間內,隨著技術的不斷成熟,允許容器化應用程序直接訪問數據的需求也在不斷的增加。現代化的應用程序和傳統的應用程序都需要諸如文件、塊,或者工具化文件存儲對象、關系型數據庫、流媒體文件等這些不同類型的存儲。
虛擬機也可以管理應用程序,但是這種方法對硬件仿真有一定的要求,容器可以保證應用程序的可移植性遠大于虛擬化的實現。實際應用程序的可移植性的能力,還依賴于個容器編排工具的互操作性。對于當前的原生云應用程序,存儲也是一個很關鍵的組件,因為應用程序可以利用持久存儲平臺以及圍繞其特性進一步開發特性功能。
容器的協調者和運行時對存儲服務發起特定的請求,可以實現諸如創建/刪除、檢查/清單、附加/分離、安裝/卸載等操作。這是解決容器協調者之間存儲問題的一種獨特的嘗試,不過在行業中也是有分歧的。對外存儲編排請求API分為兩種情況:首先,是in-tree驅動程序,它是直接將原生代碼編譯到容器協調器;第二,是out-of-tree,借助于外部插件驅動。每一種方式都有自己的優缺點:in-tree驅動器受制于容器協調器的發布周期;而out-of-tree插件式驅動可能無法提供與容器協調器綁定的增強特性集。
Docker
Docker是在1.7的實驗版本中通過創建Docker Volume 驅動接口首次解決了外部存儲的問題。1.13版本中Docker又引入了插件模型,也就是Docker Store(http://t.cn/RCvBExq)。通過查找目錄/run/docker/plugins,Docker發現并可使用UNIX插件(.sock文件),這是一個使用out-of-tree模型的例子。
UNIX域套接字( Unix domain socket)文件必須在相同的Docker主機上運行。但如果指定了遠程訪問URL,插件也可以通過spec和json配置文件實現在不同的主機上運行。實現存儲功能的集中化,這也是插件職責之一。該接口接受JSON、RPC類型的HTTP請求。out-of-tree模型公開的接口提供了完整的Volume生命周期,也為Docker CLI提供了編排功能。但是,如快照或復制等高級存儲功能,還未提供暴露給Docker CLI。
Mesos
Mesos直到v0.23版本才開始支持本地存儲。Mesos-Module-Dvdi(https://github.com/codedellemc/mesos-module-dvdi)就是為這個問題而提出的方案,隨后它的特性被合并到Mesos,直到Mesos 1.0+版本方能使用。DVDCLI(https://github.com/codedellemc/dvdcli)是將Docker Volume Driver CLI打包封裝到Mesos中,允許在所有的Mesos容器內使用任何Docker Volume驅動,Mesos-Module-Dvdi就是利用正在實施中的DVDCLI實現了本地存儲。與Docker類似,框架與DVDCLI互聯通信支持JSON格式,并且也提供使用JSON/RPC通過HTTP與Docker Volume Driver Interface通信。
正如前面所提及的,由于它使用了Docker Volume 驅動,因此它是一個out-of-tree插件,并且具有和Docker CLI相同的Volume生命周期和限制。
Kubernetes
Kubernetes的獨特之處在于它既有in-tree又有out-of-tree驅動。我們已經在《Kubernetes存儲說明》(http://t.cn/RCvBDnV)和《Kubernetes 1.6版本中關于存儲的新功能》(http://t.cn/RCvrPrr)這兩篇文章中詳細說明,我們再次回顧下:
in-tree驅動來自于Kubernetes源碼,也是其標準發行版的一部分。通過這些驅動,可以根據Kubernetes提供的接口(如Mount/Umount、Create/Delete等)向其存儲平臺暴露API,Kubernetes執行所有功能,并向驅動程序執行特定的API調用,從而執行所需的操作。這也可以充分利用Kubernetes的特性,比如:動態供應的存儲類。這樣也是有缺點的,如果系統BUG或增加需要新增一些平臺特性,則依賴于Kubernetes的發布周期。發布周期可能意味著3-6個月的等待修復、持續維護、回合代碼等流程。
Out-of-tree驅動使用Flexvolume接口。Flexvolume允許用戶編寫自己的驅動程序,并在Kubernetes中添加對其Volume的支持。供應商的驅動應該被安裝在在每個Kubelet節點和主節點上,Volume插件的路徑:usr/libexec/kubernetes/kubelet-plugins/volume/exec/<vendor~driver>/。這使得驅動程序可以在核心的Kubernetes代碼之外運行,并且可以根據自己的時間節點表發布更新或者修復BUG。Flexvolume接口預期Volume的創建和刪除可以基于外部插件進行。因此,Flexvolume只使用Attach/Detach 和 Mount/Unmount功能,而不是整個Volume的生命周期。
當前總概
把所有的存儲功能結合在一起,我們可以看到這是一個非常碎片化的空間,以及三者之間各有千秋。
而所有這一切都意味著存儲供應商需要創建多層次封裝集成,從而支持整個容器生態系統。容器存儲接口(CSI)項目處于早期階段,但最終將會成為存儲和容器成功的關鍵因素。
與此同時,我們已經將所有的功能整合,并且集成了針對每一種容器協調者功能的存儲方法。我們深知當前和未來的容器化應用程序依賴存儲,而且這個解決方案適應每一個場景:Docker和Mesos中的REX-Ray,FlexREX和Kubernetes,Docker中的REX-RAY插件,Kubernetes的本地ScaleIO驅動程序。