LXD2.0系列(一):LXD入門
簡單地說,LXD 就是一個提供了 REST API 的 LXC 容器管理器,LXD 最主要的目標就是使用 Linux 容器而不是硬體虛擬化向使用者提供一種接近虛擬機器的使用體驗。
這是一個最常被問起的問題,現在就讓我們直接指出其中的不同吧。LXD 聚焦於系統容器,通常也被稱為架構容器。這就是說 LXD 容器實際上如在裸機或虛擬機器上執行一般執行了一個完整的 Linux 作業系統。
這些容器一般基於一個乾淨的釋出映象並會長時間執行。傳統的配置管理工具和部署工具可以如在虛擬機器、雲例項和物理機器上一樣與 LXD 一起使用。
相對的, Docker 關注於短期的、無狀態的、最小化的容器,這些容器通常並不會升級或者重新配置,而是作為一個整體被替換掉。這就使得 Docker 及類似專案更像是一種軟體釋出機制,而不是一個機器管理工具。
這兩種模型並不是完全互斥的。你完全可以使用 LXD 為你的使用者提供一個完整的 Linux 系統,然後他們可以在 LXD 內安裝 Docker 來執行他們想要的軟體。
我們已經持續開發並改進 LXC 好幾年了。 LXC 成功的實現了它的目標,它提供了一系列很棒的用於建立和管理容器的底層工具和庫。
然而這些底層工具的使用介面對使用者並不是很友好。使用它們需要使用者有很多的基礎知識以理解它們的工作方式和目的。同時,向後相容舊的容器和部署策略也使得 LXC 無法預設使用一些安全特性,這導致使用者需要進行更多人工操作來實現本可以自動完成的工作。
我們把 LXD 作為解決這些缺陷的一個很好的機會。作為一個長時間執行的守護程式, LXD 可以繞開 LXC 的許多限制,比如動態資源限制、無法進行容器遷移和高效的線上遷移;同時,它也為創造新的預設體驗提供了機會:預設開啟安全特性,對使用者更加友好。
LXD 是由幾個主要元件構成的,這些元件都出現在 LXD 目錄結構、命令列客戶端和 API 結構體裡。
LXD 中的容器包括以下及部分:
- 根檔案系統(rootfs)
- 配置選項列表,包括資源限制、環境、安全選項等等
- 裝置:包括磁碟、unix 字元/塊裝置、網路介面
- 一組繼承而來的容器配置檔案
- 屬性(容器架構、暫時的還是持久的、容器名)
- 執行時狀態(當用 CRIU 來中斷/恢復時)
容器快照和容器是一回事,只不過快照是不可修改的,只能被重新命名,銷燬或者用來恢復系統,但是無論如何都不能被修改。
值得注意的是,因為我們允許使用者儲存容器的執行時狀態,這就有效的為我們提供了“有狀態”的快照的功能。這就是說我們可以使用快照回滾容器的狀態,包括快照當時的 CPU 和記憶體狀態。
LXD 是基於映象實現的,所有的 LXD 容器都是來自於映象。容器映象通常是一些純淨的 Linux 發行版的映象,類似於你們在虛擬機器和雲例項上使用的映象。
所以可以「釋出」一個容器:使用容器製作一個映象並在本地或者遠端 LXD 主機上使用。
映象通常使用全部或部分 sha256 雜湊碼來區分。因為輸入長長的雜湊碼對使用者來說不方便,所以映象可以使用幾個自身的屬性來區分,這就使得使用者在映象商店裡方便搜尋映象。也可以使用別名來一對一地將一個使用者好記的名字對映到某個映象的雜湊碼上。
LXD 安裝時已經配置好了三個遠端映象伺服器(參見下面的遠端一節):
- “ubuntu”:提供穩定版的 Ubuntu 映象
- “ubuntu-daily”:提供 Ubuntu 的每日構建映象
- “images”: 社群維護的映象伺服器,提供一系列的其它 Linux 釋出版,使用的是上游 LXC 的模板
LXD 守護程式會從映象上次被使用開始自動快取遠端映象一段時間(預設是 10 天),超過時限後這些映象才會失效。
此外, LXD 還會自動更新遠端映象(除非指明不更新),所以本地的映象會一直是最新版的。
配置檔案是一種在一個地方定義容器配置和容器裝置,然後將其應用到一系列容器的方法。
一個容器可以被應用多個配置檔案。當構建最終容器配置時(即通常的擴充套件配置),這些配置檔案都會按照他們定義順序被應用到容器上,當有重名的配置鍵或裝置時,新的會覆蓋掉舊的。然後本地容器設定會在這些基礎上應用,覆蓋所有來自配置檔案的選項。
LXD 自帶兩種預配置的配置檔案:
“default”配置是自動應用在所有容器之上,除非使用者提供了一系列替代的配置檔案。目前這個配置檔案只做一件事,為容器定義 eth0 網路裝置。
“docker”配置是一個允許你在容器裡執行 Docker 容器的配置檔案。它會要求 LXD 載入一些需要的核心模組以支援容器巢狀並建立一些裝置。
如我之前提到的, LXD 是一個基於網路的守護程式。附帶的命令列客戶端可以與多個遠端 LXD 伺服器、映象伺服器通訊。
預設情況下,我們的命令列客戶端會與下面幾個預定義的遠端伺服器通訊:
- local:預設的遠端伺服器,使用 UNIX socket 和本地的 LXD 守護程式通訊
- ubuntu:Ubuntu 映象伺服器,提供穩定版的 Ubuntu 映象
- ubuntu-daily:Ubuntu 映象伺服器,提供 Ubuntu 的每日構建版
- images:images.linuxcontainers.org 的映象伺服器
所有這些遠端伺服器的組合都可以在命令列客戶端裡使用。
你也可以新增任意數量的遠端 LXD 主機,並配置它們監聽網路。匿名的開放映象伺服器,或者通過認證可以管理遠端容器的映象伺服器,都可以新增進來。
正是這種遠端機制使得與遠端映象伺服器互動及在主機間複製、移動容器成為可能。
我們設計 LXD 時的一個核心要求,就是在不修改現代 Linux 發行版的前提下,使容器儘可能的安全。
LXD 通過使用 LXC 庫實現的主要安全特性有:
核心名字空間。尤其是使用者名稱字空間,它讓容器和系統剩餘部分完全分離。LXD 預設使用使用者名稱字空間(和 LXC 相反),並允許使用者在需要的時候以容器為單位關閉(將容器標為“特權的”)。 Seccomp 系統呼叫。用來隔離潛在危險的系統呼叫。 AppArmor。對 mount、socket、ptrace 和檔案訪問提供額外的限制。特別是限制跨容器通訊。 Capabilities。阻止容器載入核心模組,修改主機系統時間,等等。 CGroups。限制資源使用,防止針對主機的 DoS 攻擊。
為了對使用者友好,LXD 構建了一個新的配置語言把大部分的這些特性都抽象封裝起來,而不是如 LXC 一般直接將這些特性暴露出來。舉了例子,一個使用者可以告訴 LXD 把主機裝置放進容器而不需要手動檢查他們的主/次裝置號來手動更新 CGroup 策略。
和 LXD 本身通訊是基於使用 TLS 1.2 保護的鏈路,只允許使用有限的幾個被允許的金鑰演算法。當和那些經過系統證書認證之外的主機通訊時, LXD 會提示使用者驗證主機的遠端指紋(SSH 方式),然後把指紋快取起來以供以後使用。
LXD 的工作都是通過 REST 介面實現的。在客戶端和守護程式之間並沒有其他的通訊渠道。 REST 介面可以通過本地的 unix socket 訪問,這隻需要經過使用者組認證,或者經過 HTTP 套接字使用客戶端認證進行通訊。 REST 介面的結構能夠和上文所說的不同的元件匹配,是一種簡單、直觀的使用方法。 當需要一種複雜的通訊機制時, LXD 將會進行 websocket 協商完成剩餘的通訊工作。這主要用於互動式終端會話、容器遷移和事件通知。 LXD 2.0 附帶了 1.0 版的穩定 API。雖然我們在 1.0 版 API 新增了額外的特性,但是這不會在 1.0 版 API 端點裡破壞向後相容性,因為我們會宣告額外的 API 擴充套件使得客戶端可以找到新的介面。
雖然 LXD 提供了一個很好的命令列客戶端,但是這個客戶端並不能管理多個主機上大量的容器。在這種使用情況下,我們可以使用 OpenStack 的 nova-lxd 外掛,它可以使 OpenStack 像使用虛擬機器一樣使用 LXD 容器。 這就允許在大量的主機上部署大量的 LXD 容器,然後使用 OpenStack 的 API 來管理網路、儲存以及負載均衡。
LXD 的 IRC 頻道: #lxcontainers on irc.freenode.net
本文轉自Linux就該這麼學部落格園部落格,原文連結:http://www.cnblogs.com/linuxprobe/p/5814290.html,如需轉載請自行聯絡原作者
相關文章
- LXD 2.0 系列(一):LXD 入門
- MyBatis系列(一):MyBatis入門MyBatis
- Mysql系列一:SQL入門MySql
- Docker 入門系列一:docker 命令Docker
- Shell 入門系列 (一): 變數變數
- XGBoost入門系列第一講
- webpack 快速入門 系列 —— 實戰一Web
- Azure Storage 系列(一)入門簡介
- RocketMQ系列一:入門級使用演示MQ
- lxd容器
- shell入門系列
- go微服務系列(一) go micro入門Go微服務
- 【Ionic2系列】 一、入門介紹
- 小程式從入門到實戰系列(一)
- Webpack4系列教程(一) 基礎入門Web
- 深入Weex系列(一)之Weex入門準備
- PHP框架Yii系列教程(一):入門例項PHP框架
- 入門1~4:A系列
- 一分鐘sed入門(一分鐘系列)
- Spring Boot系列(一):Spring Boot 入門篇Spring Boot
- 深入淺出Mybatis原始碼系列(一)---Mybatis入門MyBatis原始碼
- Gradle入門系列(一)——groovy基礎語法Gradle
- 計算機視覺入門系列(一) 綜述計算機視覺
- [Android systrace系列] systrace入門第一式Android
- 小豬的C語言快速入門系列(一)C語言
- 爬蟲入門系列(一):快速理解HTTP協議爬蟲HTTP協議
- 爬蟲入門系列(一):快速理解 HTTP 協議爬蟲HTTP協議
- MongoDB入門系列(一):基礎概念和安裝MongoDB
- Serilog文件翻譯系列(一) - 入門指南
- [入門到吐槽系列] Webix 10分鐘入門 一 管理後臺製作Web
- Docker 快速入門系列(引子)Docker
- 《xhtml入門系列》之四HTML
- 入門系列-依賴注入依賴注入
- MySQL入門系列:檢視MySql
- MySQL入門系列:MySQL概述MySql
- vue 快速入門 系列 —— 模板Vue
- webpack 快速入門 系列 —— 效能Web
- redis系列1-入門Redis