您好,登錄后才能下訂單哦!
PouchContainer 是阿里巴巴集團開源的高效、輕量級企業(yè)級富容器引擎技術(shù),擁有隔離性強、可移植性高、資源占用少等特性??梢詭椭髽I(yè)快速實現(xiàn)存量業(yè)務(wù)容器化,同時提高超大規(guī)模下數(shù)據(jù)中心的物理資源利用率。已助力阿里巴巴集團實現(xiàn)在線業(yè)務(wù) 100% 容器化,雙 11 容器規(guī)模達到百萬級。
PouchContainer volume是專門用來解決容器的數(shù)據(jù)持久化的機制,想要了解volume的機制,就需要了解PouchContainer的鏡像機制。PouchContainer,和Docker一樣,實現(xiàn)了鏡像的分層機制。所謂鏡像分層機制,是指容器的鏡像實際上是由多個只讀的鏡像層(layer)疊加而成,這樣不同的鏡像就可以復(fù)用鏡像層,大大加快了鏡像分發(fā)的效率,同時也減少了容器啟動時間。當(dāng)容器需要啟動時,pouchd(下文中提到的pouchd均指PouchContainer daemon)會在啟動鏡像的最上層添加一個讀寫層,后續(xù)容器所有的讀寫操作就會記錄在這個讀寫層中。這樣也引入了一個問題,那就是容器數(shù)據(jù)的持久化。假如我們將容器刪除,再次通過該鏡像啟動時,容器之前所做的修改都丟失了,這對于有狀態(tài)的應(yīng)用(如數(shù)據(jù)庫)是致命的。
volume繞過了鏡像機制,讓容器中的數(shù)據(jù)以正常的文件或者目錄的形式存在于宿主機上,當(dāng)容器停止或刪除時,并不會影響到volume中的數(shù)據(jù),從而實現(xiàn)了數(shù)據(jù)的持久化,而且volume數(shù)據(jù)可以在不同的container之間共享。
PouchContainer volume整體架構(gòu)目前主要由以下幾部分構(gòu)成:
VolumeManager:該結(jié)構(gòu)是volume相關(guān)操作的入口。
Core:Core是volume的核心模塊,包含了volume操作的業(yè)務(wù)邏輯
Store:負責(zé)存儲volume元數(shù)據(jù),目前元數(shù)據(jù)存儲在本地的boltdb文件中。
Driver:volume driver接口,抽象了volume相關(guān)驅(qū)動的基本功能
Modules:具體的volume driver,目前存在local, tmpfs, volume plugin, ceph四種volume驅(qū)動
pouch_volume_arch.png | center | 747x624
VolumeManager是PouchContainer中的存儲組件(其他組件包括ContainerManager, ImageManager、NetworkManager等),它是所有volume操作的入口,目前提供了Create/Remove/List/Get/Attach/Detach接口。Core包含了volume操作的核心邏輯,向下負責(zé)調(diào)用底層具體的volume driver,實現(xiàn)volume的創(chuàng)建、刪除、attach、detach等操作,同時調(diào)用Store,實現(xiàn)volume元數(shù)據(jù)管理。Store模塊專門負責(zé)volume的元數(shù)據(jù)管理,volume的相關(guān)狀態(tài)都會通過Store進行存儲,之所以將元數(shù)據(jù)管理專門作為一個模塊,是為了將來方便擴展,目前volume元數(shù)據(jù)是存儲在boltdb,未來也可能存入etcd等。Driver抽象了volume driver需要實現(xiàn)的接口,一個具體的volume driver需要實現(xiàn)如下接口:
type Driver interface {
// Name returns backend driver's name.
Name(Context) string
// StoreMode defines backend driver's store model.
StoreMode(Context) VolumeStoreMode
// Create a volume.
Create(Context, *types.Volume, *types.Storage) error
// Remove a volume.
Remove(Context, *types.Volume, *types.Storage) error
// Path returns volume's path.
Path(Context, *types.Volume) (string, error)
}
2.1 local volume
local volume是PouchContainer默認的volume類型,適合存儲需要持久化的數(shù)據(jù),它的生命周期獨立于容器的生命周期。
當(dāng)你創(chuàng)建一個volume時,假如沒有指定driver類型,則默認local為driver類型。local volume本質(zhì)上,是pouchd到/var/lib/pouch/volume目錄下創(chuàng)建的一個子目錄。相較于docker,PouchContainer的local volume擁有更多的實用特性,包括:
指定掛載目錄創(chuàng)建volume
可以指定volume大小
首先我們可以指定目錄創(chuàng)建一個local volume。該特性在生產(chǎn)中非常實用。對于某些應(yīng)用,如數(shù)據(jù)庫,我們需要掛載專門的塊設(shè)備,用于存儲數(shù)據(jù)庫數(shù)據(jù),例如運維人員將塊設(shè)備格式化后,掛載到/mnt/mysql_data目錄。執(zhí)行以下命令,我們就創(chuàng)建了一個掛載在/mnt/mysql_data的volume,然后可以將該volume掛載到容器指定目錄,啟動容器。
pouch volume create --driver local --option mount=/mnt/mysql_data --name mysql_data
其次,我們可以限制volume的大小。該功能依賴于底層文件系統(tǒng)提供的quato功能,目前支持的底層文件系統(tǒng)為ext4和xfs,同時對內(nèi)核版本也有要求。
pouch volume create --driver local --option size=10G --name test_quota
2.2 tmpfs volume
tmpfs volume的數(shù)據(jù)并不會持久化到硬盤中去,只存儲于內(nèi)存中 (若內(nèi)存不足,則存入swap),訪問速度快,但當(dāng)容器停止運行時,該volume里面的所有信息都會消失,因此tmpfs volume只適合保存一些臨時和敏感的數(shù)據(jù)。
tmpfs volume默認存儲/mnt/tmpfs目錄下,你也可以通過 -o mount 指定其掛載路徑。不過指定tmpfs的掛載路徑?jīng)]有什么意義,因為tmpfs內(nèi)容直接存儲在內(nèi)存中。
pouch volume create --driver tmpfs --name tmpfs_test
2.3 ceph volume
ceph是一種比較特殊的volume類型,ceph volume是將數(shù)據(jù)存儲到ceph集群(ceph rbd 存儲)中,因此可以實現(xiàn)volume跨物理機的遷移。
目前外界暫時不能使用ceph volume。從PouchContainer volume架構(gòu)圖可知,ceph driver和driver層之間還有一層alibaba storage controller(注意:alibaba storage controller只是一個代稱),這是阿里巴巴內(nèi)部的一套容器存儲管理平臺,后面對接了ceph/pangu/nas等諸多存儲方案。PouchContainer通過與該容器存儲管理平臺對接,可以直接利用ceph提供volume。后期我們可能開源該容器存儲管理平臺。
2.4 volume plugin
volume plugin是一種通用性的volume,準確來說它是一種volume的擴展機制。目前docker通過插件機制可以管理諸多的第三方存儲,PouchContainer也實現(xiàn)了該volume plugin機制,可以無縫對接原先docker已經(jīng)存在的volume plugin。
作為一個volume plugin,必須實現(xiàn)volume plugin protocol。volume plugin其實本質(zhì)上是一個web server,該web server實現(xiàn)了如下服務(wù),所有請求均為POST請求。
/VolumeDriver.Create // Volume創(chuàng)建服務(wù)
/VolumeDriver.Remove // Volume刪除服務(wù)
/VolumeDriver.Mount // Volume掛載服務(wù)
/VolumeDriver.Path // Volume掛載路徑服務(wù)
/VolumeDriver.Unmount // Volume卸載服務(wù)
/VolumeDriver.Get // Volume Get服務(wù)
/VolumeDriver.List // Volume List服務(wù)
/VolumeDriver.Capabilities // Volume Driver能力服務(wù)
pouch run -d -t -v /hostpath/data:/containerpath/data:ro ubuntu sh
上述這條命令就將宿主機上的/hostpath/data目錄已只讀的方式掛載到容器的/containerpath/data目錄下。
bind mounts依賴于宿主機文件系統(tǒng)目錄結(jié)構(gòu),而volume,在PouchContainer中有專門的機制進行管理。volumes相對于bind mounts,有以下優(yōu)勢:
volumes相對于bind mounts,更容易進行備份和管理;
PouchContainer提供了專門的CLI和API,用來管理volumes;
volumes適合在多個容器之間安全地共享;
volumes提供了插件機制,可以更加方便地對接第三方存儲。
PouchContainer volume未來的發(fā)展
CSI,即Container Storage Interface(該項目定義了容器調(diào)度層和容器之間的存儲接口),目前已發(fā)布了v0.2版本。Pouch未來可能增加一種通用類型的driver,用于對接已實現(xiàn)CSI接口的存儲系統(tǒng)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。