
<a href="http://dockone.io/article/1123">[LXD 2.0系列開篇:是時候讨論LXD的一切了]</a>
<a href="http://dockone.io/article/1125">[LXD 2.0系列之一:LXD簡介]</a>
<a href="http://dockone.io/article/1146">[LXD 2.0系列之二:LXD安裝和配置]</a>
<a href="http://dockone.io/article/1310">[LXD 2.0系列之三:你的第一個LXD容器]</a>
[LXD 2.0系列之四:資源管理]
[LXD 2.0系列之五:鏡像管理]
[LXD 2.0系列之六:遠端主機和容器遷移]
[LXD 2.0系列之七:LXD中的Docker]
[LXD 2.0系列之八:LXD中的LXD]
[LXD 2.0系列之九:線上遷移]
[LXD 2.0系列之十:LXD和Juju]
[LXD 2.0系列之十一:LXD和OpenStack]
[LXD 2.0系列之十二:調試和改進LXD]
LXD 2.0系列的第一篇博文,關于LXD的一些常見的問題。
簡單來說,LXD是一個守護程序,為LXC容器的管理提供一組REST API。主要目标是提供一種類虛拟機的使用者體驗,當然用的是Linux容器而不是硬體虛拟化。
這個是我們收到最多的問題,是以讓我們趕緊把它解釋清楚。LXD着重在于系統容器,也叫基礎設施容器。即一個LXD容器上運作了一個完整的Linux系統,和它跑在實體機或者虛拟機上面時幾乎一模一樣。這些容器基于一個幹淨的發行版鏡像,長期運作。傳統的配置管理和部署工具都可以和LXD容器一起使用,這和你在虛拟機、雲執行個體或者實體機上面使用時一樣。差別在于,Docker關注點在臨時的、無狀态的、最小化容器上面,通常不會更新或重新配置,而是整個被替換掉。這使得Docker及相關的項目,不同于機器管理工具,而更接近于軟體發行版的某些機制。當然,這兩種模式并不是互相排斥的。可以肯定的是,你可以使用LXD為你的使用者提供一個完整的Linux系統,然後又可在LXD容器之上安裝Docker,來運作他們需要的軟體。
我們在LXC上做了很多年。LXC的重要價值在于它提供了一套完整的底層工具庫集來建立和管理容器。但是這套底層工具集使用起來并不是很友善。因為需要一些基本的知識,來了解能拿它來做什麼且怎麼使用。加上對老版容器和部署方法要進行向後相容,使得LXC無法預設開啟某些安全功能,這導緻使用者需要進行很多的手工配置。LXD就是這樣一個機會來解決這些缺陷。利用長期運作的守護程序來解決LXC的很多限制,例如動态資源限制,容器有效的線上遷移,借助于這個守護程序,我們就能提供一個新的安全的使用者體驗,這也是很多使用者所關注的。
這些主要的元件,在LXD代碼目錄結構中,以指令行用戶端和API結構的形式呈現。
LXD容器的組成
根檔案系統
配置選項,包括資源限制,環境,安全選項等等
裝置,像硬碟,字元/塊Unix裝置,網絡接口
容器的配置組
某些特征(容器的體系結構,非持久或持久性,容器名)
某些運作時狀态(當使用CRIU來做恢複)
容器快照,也是容器,除了一個事實,即它們是不可變的,可以被重命名、銷毀或恢複,但不能以任何方式修改。值得注意的是,由于允許存儲容器的運作時狀态,實際上給我們帶來一個“有狀态”快照的概念,即快照的復原也包括CPU和記憶體的狀态。
LXD是基于鏡像的,所有的LXD容器都來自鏡像。這裡的鏡像,類似于用作虛拟機或雲執行個體的幹淨Linux發行版鏡像。“釋出”容器是可行的,通過容器的鏡像生成,然後被本地或遠端LXD主機使用。鏡像是由唯一的SHA256哈希值辨別,并可引用全部或部分的哈希值。因為長的哈希值不是特别人性化,鏡像可用任意的長度來辨別,并允許通過鏡像商店進行簡單的搜尋。别名可用來設定一對一的映射,即在對使用者友好的唯一字元串和鏡像的哈希值之間的映射。LXD會預先配置三個遠端鏡像伺服器:
Ubuntu:提供穩定的Ubuntu鏡像
ubuntu-daily:提供Ubuntu每天的build
images:是一個社群運作的鏡像伺服器,使用上遊的LXC模闆提供其他Linux發行版鏡像。
遠端鏡像由LXD守護程式自動緩存,自上次使用開始到過期之前,保持若幹天(預設為10)。額外地,LXD也會自動更新得到遠端鏡像(除非另有說法),這樣在本地也能保證鏡像的最新版本。
配置組是預先定義好的一組容器的配置和裝置,然後将它應用到任何數量的一組容器上。由于容器還可以應用多個不同的配置檔案,是以當建構最終的容器配置(稱為擴充過的配置)時,配置組将根據定義好的次序來依次應用,當出現彼此相同的鍵值或裝置時按優先級覆寫。由于本地容器配置檔案優先級最高,是以來自于配置組的檔案會被覆寫。LXD附帶兩個預先定義好的配置組:
“預設”自動應用于所有容器,除非使用者提供了另一個配置組。目前這個配置組隻做一件事,為容器定義了一個“eth0”網絡裝置。
“Docker”該配置組可以應用到那些允許運作Docker的容器。它要求LXD加載一些必需的核心子產品,打開容器嵌套,并設定了一些裝置條目。
正如我前面提到的, LXD是一個網絡守護程序。是以,指令行用戶端,可以與多個遠端LXD伺服器,以及鏡像伺服器互動。預設情況下,LXD指令行用戶端自帶的定義如下:
local:預設,通過unix套接字和本地的LXD守護程序互動
Ubuntu:Ubuntu鏡像伺服器提供穩定的build
ubuntu-daily:Ubuntu鏡像伺服器提供每天的build
images:images.linuxcontainers.org鏡像伺服器
這些遠端伺服器的任意組合,均可以通過指令行用戶端使用。您還可以添加任意數量的已配置網絡監聽的遠端LXD主機。若公共鏡像伺服器,可以匿名;若遠端管理容器時,則要通過身份驗證。這種遠端機制,可以通過與遠端鏡像伺服器的互動來複制或遷移主機之間的容器。
這是LXD的核心設計,即保證盡可能的安全性,同時又能使現代Linux發行版可以不做任何修改直接運作。通過使用LXC庫,LXD獲得主要的安全功能包括:
核心命名空間。特别是使用者的命名空間,以此來保證容器所做的一切和系統隔離開來。 LXD預設使用使用者命名空間(這和LXC不同),并允許使用者按單個容器(标記為“特權”的容器 )來進行關閉。
Seccomp:篩選出具有潛在危險的系統調用。
AppArmor:對挂載,套接字,ptrace的和檔案通路提供額外的限制,特别是限制跨容器通信。
Capabilities:以防止容器加載核心子產品,改變主機系統的時間等等。
CGroup:限制資源使用和防止對主機的DoS攻擊。
在LXC中,這些功能會直接暴露給客戶。而我們已經建立了這種抽象,提供更人性化的配置語言。例如,一看就知道LXD傳遞哪個主機裝置到容器中,而無需另外查找其主/次編号,手動更新該cgroup政策。LXD自身的通信,均使用TLS 1.2,且僅支援有限的密碼組。當處理的主機的系統證書不屬于合法頒發機構時, LXD會提示使用者遠端驗證指紋(SSH的方式) ,然後将其緩存以供将來使用。
LXD做的一切都通過它的REST API完成。用戶端與守護程式之間沒有其他的通信方式。該REST API可以通過本地Unix套接字的通路,隻需要進行身份驗證,或者通過HTTPS套接字使用用戶端證書進行驗證。當需要更複雜的通信機制時,LXD将會使用WebSockets進行互動。這種方式會用于互動式控制台會話,容器遷移和事件通知。随着LXD 2.0帶來穩定的/1.0 API,我們不會打破/1.0 API的向後相容性,但是會通過額外的API擴充來增加新的功能。
雖然LXD提供了一個很好的指令行用戶端,但是有了該用戶端,并不意味着可以在多台主機上管理成千上萬的容器。對于這種用例,我們建議使用nova-lxd,這是一個OpenStack的插件,用管理虛拟機的方式,來管理OpenStack上的LXD容器。當然這需要在大量主機上大規模部署LXD,并使用OpenStack API來管理網絡,存儲和負載平衡。
IRC聊天室: #lxcontainers, irc.freenode.net
==================================================
譯者介紹
原文釋出時間為:2016-03-15
本文作者:henrysher
本文來自雲栖社群合作夥伴DockerOne,了解相關資訊可以關注DockerOne。
原文标題:LXD 2.0系列之一:LXD簡介