日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

技术解析系列 | PouchContainer volume机制解析

發布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 技术解析系列 | PouchContainer volume机制解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PouchContainer 是阿里巴巴集團開源的高效、輕量級企業級富容器引擎技術,擁有隔離性強、可移植性高、資源占用少等特性。可以幫助企業快速實現存量業務容器化,同時提高超大規模下數據中心的物理資源利用率。已助力阿里巴巴集團實現在線業務 100% 容器化,雙 11 容器規模達到百萬級。

PouchContainer volume是專門用來解決容器的數據持久化的機制,想要了解volume的機制,就需要了解PouchContainer的鏡像機制。PouchContainer,和Docker一樣,實現了鏡像的分層機制。所謂鏡像分層機制,是指容器的鏡像實際上是由多個只讀的鏡像層(layer)疊加而成,這樣不同的鏡像就可以復用鏡像層,大大加快了鏡像分發的效率,同時也減少了容器啟動時間。當容器需要啟動時,pouchd(下文中提到的pouchd均指PouchContainer daemon)會在啟動鏡像的最上層添加一個讀寫層,后續容器所有的讀寫操作就會記錄在這個讀寫層中。這樣也引入了一個問題,那就是容器數據的持久化。假如我們將容器刪除,再次通過該鏡像啟動時,容器之前所做的修改都丟失了,這對于有狀態的應用(如數據庫)是致命的。

volume繞過了鏡像機制,讓容器中的數據以正常的文件或者目錄的形式存在于宿主機上,當容器停止或刪除時,并不會影響到volume中的數據,從而實現了數據的持久化,而且volume數據可以在不同的container之間共享。

1. PouchContainer volume整體架構

該部分內容可能涉及PouchContainer的volume源碼實現。

PouchContainer volume整體架構目前主要由以下幾部分構成:

  • VolumeManager:該結構是volume相關操作的入口。

  • Core:Core是volume的核心模塊,包含了volume操作的業務邏輯

  • Store:負責存儲volume元數據,目前元數據存儲在本地的boltdb文件中。

  • Driver:volume driver接口,抽象了volume相關驅動的基本功能

  • Modules:具體的volume driver,目前存在local, tmpfs, volume plugin, ceph四種volume驅動

VolumeManager是PouchContainer中的存儲組件(其他組件包括ContainerManager, ImageManager、NetworkManager等),它是所有volume操作的入口,目前提供了Create/Remove/List/Get/Attach/Detach接口。Core包含了volume操作的核心邏輯,向下負責調用底層具體的volume driver,實現volume的創建、刪除、attach、detach等操作,同時調用Store,實現volume元數據管理。Store模塊專門負責volume的元數據管理,volume的相關狀態都會通過Store進行存儲,之所以將元數據管理專門作為一個模塊,是為了將來方便擴展,目前volume元數據是存儲在boltdb,未來也可能存入etcd等。Driver抽象了volume driver需要實現的接口,一個具體的volume driver需要實現如下接口:

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. PouchContainer支持的volume類型

目前,PouchContainer支持三種具體的volume類型,即local, tmpfs和ceph,還通過volume plugin這種通用的存儲插件機制支持更多的第三方存儲。

2.1 local volume

local volume是PouchContainer默認的volume類型,適合存儲需要持久化的數據,它的生命周期獨立于容器的生命周期。

當你創建一個volume時,假如沒有指定driver類型,則默認local為driver類型。local volume本質上,是pouchd到/var/lib/pouch/volume目錄下創建的一個子目錄。相較于docker,PouchContainer的local volume擁有更多的實用特性,包括:

  • 指定掛載目錄創建volume

  • 可以指定volume大小

首先我們可以指定目錄創建一個local volume。該特性在生產中非常實用。對于某些應用,如數據庫,我們需要掛載專門的塊設備,用于存儲數據庫數據,例如運維人員將塊設備格式化后,掛載到/mnt/mysql_data目錄。執行以下命令,我們就創建了一個掛載在/mnt/mysql_data的volume,然后可以將該volume掛載到容器指定目錄,啟動容器。

pouch?volume?create?--driver?local?--option?mount=/mnt/mysql_data??--name?mysql_data

其次,我們可以限制volume的大小。該功能依賴于底層文件系統提供的quato功能,目前支持的底層文件系統為ext4和xfs,同時對內核版本也有要求。

pouch?volume?create?--driver?local?--option?size=10G?--name?test_quota

2.2 tmpfs volume

tmpfs volume的數據并不會持久化到硬盤中去,只存儲于內存中 (若內存不足,則存入swap),訪問速度快,但當容器停止運行時,該volume里面的所有信息都會消失,因此tmpfs volume只適合保存一些臨時和敏感的數據。

tmpfs volume默認存儲/mnt/tmpfs目錄下,你也可以通過?-o mount?指定其掛載路徑。不過指定tmpfs的掛載路徑沒有什么意義,因為tmpfs內容直接存儲在內存中。

pouch?volume?create?--driver?tmpfs?--name?tmpfs_test

2.3 ceph volume

ceph是一種比較特殊的volume類型,ceph volume是將數據存儲到ceph集群(ceph rbd 存儲)中,因此可以實現volume跨物理機的遷移。

目前外界暫時不能使用ceph volume。從PouchContainer volume架構圖可知,ceph driver和driver層之間還有一層alibaba storage controller(注意:alibaba storage controller只是一個代稱),這是阿里巴巴內部的一套容器存儲管理平臺,后面對接了ceph/pangu/nas等諸多存儲方案。PouchContainer通過與該容器存儲管理平臺對接,可以直接利用ceph提供volume。后期我們可能開源該容器存儲管理平臺。

2.4 volume plugin

volume plugin是一種通用性的volume,準確來說它是一種volume的擴展機制。目前docker通過插件機制可以管理諸多的第三方存儲,PouchContainer也實現了該volume plugin機制,可以無縫對接原先docker已經存在的volume plugin。

作為一個volume plugin,必須實現volume plugin protocol。volume plugin其實本質上是一個web server,該web server實現了如下服務,所有請求均為POST請求。

/VolumeDriver.Create??????????//?Volume創建服務/VolumeDriver.Remove??????????//?Volume刪除服務/VolumeDriver.Mount???????????//?Volume掛載服務/VolumeDriver.Path????????????//?Volume掛載路徑服務/VolumeDriver.Unmount?????????//?Volume卸載服務/VolumeDriver.Get?????????????//?Volume?Get服務/VolumeDriver.List????????????//?Volume?List服務/VolumeDriver.Capabilities????//?Volume?Driver能力服務

3. bind mounts與volumes

PouchContainer目前支持兩種數據持久化的方式,除了上述的volumes,還可以利用bind mounts。bind mounts,顧名思義,指的是直接將宿主機的目錄掛載到容器里面。

pouch?run?-d?-t?-v?/hostpath/data:/containerpath/data:ro?ubuntu?sh

上述這條命令就將宿主機上的/hostpath/data目錄已只讀的方式掛載到容器的/containerpath/data目錄下。

bind mounts依賴于宿主機文件系統目錄結構,而volume,在PouchContainer中有專門的機制進行管理。volumes相對于bind mounts,有以下優勢:

  • volumes相對于bind mounts,更容易進行備份和管理;

  • PouchContainer提供了專門的CLI和API,用來管理volumes;

  • volumes適合在多個容器之間安全地共享;

  • volumes提供了插件機制,可以更加方便地對接第三方存儲。

4. PouchContainer volume未來的發展

CSI,即Container Storage Interface(該項目定義了容器調度層和容器之間的存儲接口),目前已發布了v0.2版本。Pouch未來可能增加一種通用類型的driver,用于對接已實現CSI接口的存儲系統。

5. 總結

本文介紹了PouchContainer的volume機制, volume機制主要是為了解決容器數據持久化的問題。PouchContainer目前支持local,tmpfs,ceph三種driver,同時支持以volume plugin的形式對接更多的第三方存儲。

總結

以上是生活随笔為你收集整理的技术解析系列 | PouchContainer volume机制解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。