雲端容器化技術與資源調度

容器化技術發展

虛擬化

指透過任何手段在一個既有環境(稱為Host)來模擬出 作業系統儲存裝置網路設備等…。被模擬出來的東西,稱為 Guest。

虛擬化的需求及發展,其實早從1960年代起就開始了,當時就是為了要解決在大型主機 (Mainframe) 上面如何隔離應用系統的問題。

虛擬化的實作

virtualization level

硬體層虛擬化

將 Host CPU / Memory / 網卡等既有的硬體資源隔離。例如:

  • Host 有一個 2 核心 CPU,經過硬體虛擬化之後,隔離成為兩個 1 核心的 Guest CPU
  • Host 有 16G RAM,經過硬體虛擬化之後,隔離成為兩個 8G 的 Guest RAM

VMWare、Virtual PC、Xen 等技術都是硬體層虛擬化的例子

作業系統層虛擬化

將 Host OS 的 Process / Library / File System 進行隔離,在一個 Host OS 上模擬出多個 Guest OS。然而 Guest OS 仍是共享同一套 Host Kernel。

作業系統層虛擬化當中 Guest OS 就是大家一直再說的 容器 (Container)。

Jail, LXC, Docker 等技術都是作業系統層虛擬化的例子

chroot (Jail)

chroot

  • 1982 的 Unix 內建了 chroot 的指令,可以讓該 Unix 環境當中,虛擬化另一個完全隔離的沙箱環境出來,這個環境就稱為容器。
  • 1991年,William Cheswick 開發出第一個蜜罐程式,來監視入侵駭客的行動。他使用了chroot來進行實作,這是chroot最早被用於開發程式的先例,也因此,chroot創造出的根目錄空間,之後被人稱為軟體監獄(chroot jail)。

駭客非正規方法以及漏洞來突破 chroot 的管制區,這種行為就是大家說熟知的『越獄』(JB)。

LXC (Linux Container)

在 Linux Kernel 中,提供了 cgroups 功能,來達成資源的區隔化。

它同時也提供了名稱空間區隔隔離的功能,使應用程式看到的作業系統環境被區隔成獨立區間,包括Process Tree,網路,使用者id,以及掛載的檔案系統。

LXC 利用 cgroups 與名稱空間的功能,提供應用軟體一個獨立的作業系統環境。

$ lxc-create -t download -n my-container
$ lxc-start -n my-container -d
$ lxc-attach -n my-container
# ...
my-container$

Docker Container

Docker Container = LXC + AUFS (Advanced Multi-Layered Unification Filesystem)

Docker 將 LXC 結合上 Layered FS 的觀念,進而催生了 Docker Image 的概念。使得容器化技術,在隔離的目的之上,多了一個 繼承 的功能。

lxc and docker

Image 本身紀錄了一個容器的靜態檔案狀態,是不可變動的。如果像要改變檔案,則要透過透過層層的堆疊來達成,當然,每變動一次,Image 都會多一層,體積都會變大些:

layers