Oracle發布開源容器工具集:含使用Rust編寫的新容器運行時環境
Oracle 發布了三個開源的容器工具集,包括 Smith,遵循開放容器計劃(Open Container Initiative,OCI)鏡像規范的容器構造器,它能創建只包含可執行內容及其依賴的“微容器(microcontainer)”;Crashcart,微容器調試工具,它允許運維人員將 Linux 二進制文件的鏡像旁加載(sideload)到已有的容器中;Railcar,基于 Rust 的容器運行環境,它實現了 OCI 運行時規范。
Vish Abrams 在 Oracle 開發人員博客的一篇文章上寫道,Oracle 目前正在使用容器運行其云服務的很多組件。在開發和運維生產環境的這些容器時,他們學到了很多的經驗,并相應地創建了一些工具,現在它們基于 Universal Permissive Licence 1.0和 Apache License 2.0雙重協議進行了開源,代碼可以從 GitHub 上得到。
作為發布這些工具的前奏,Abrams 在 Oracle 開發人員博客上還寫過一篇額外的文章,名為“ Microcontainer Manifesto 以及完成任務的合適工具”,他認為容器的標準構建流程“對于開發人員非常理想,但是所形成的容器鏡像使運維人員的工作非常困難”。當 Oracle 兩年前開始在容器技術方面進行投資時,他們定義了提升運行時容器“穩定性和安全性”的核心目標。盡管這是 Oracle 第一次官方宣布其容器技術,但是博客中提到自從這項工作開展以來,他們容器實現的穩定性和安全性得到了大幅度的提升。
Abrams 討論了 Docker 容器在構建時將整個 Linux 操作系統(OS)放到容器鏡像中所帶來的問題。具體來講,這會導致:較大的鏡像,變成這么龐大的鏡像只是為了引入必要的層,使其變得可管理;權限封裝——讓應用運行在整個 Linux 用戶空間中,這樣會帶來潛在攻擊的風險;漏洞管理——標準的構建流程讓我們很難確定某個容器是否需要升級,因為容器實際使用的依賴文件難以確定。需要注意的是,這里面所述的很多問題在現有的容器系統中已經解決了,比如使用特定 OS 的容器以及 scratch 容器;啟用用戶命名空間(User Namespace)以及 Linux 核心安全模塊,比如 AppArmor;對容器鏡像使用靜態漏洞掃描器進行安全掃描,比如使用 CoreOS 的 Clair。
Oracle 為了解決在生產環境下所面臨的問題,定義了名為微容器的概念(Iron.io 和 JBoss 業已使用過這個術語,不要與其混淆)。具體來講,微容器:
- 只包含一個可執行文件及其依賴,沒有 shell 和 init 進程
- 使用只讀的 root 文件系統運行,沒有分層和 Overlayfs(寫入是隔離的,通過卷 mount 來進行處理)
- 所有的臨時文件放在/run 中,所有的持久化寫入(日志文件和數據文件)放到/write 中
- 需要針對每個容器修改的配置文件放到/read 中,它可以通過卷 mount 或 Kubernetes configmap 來修改
- 沒有用戶和組文件系統所有權的功能——所有的內容都歸一個用戶擁有和讀取
- 沒有文件系統時間戳(timestamp)和功能(capabilities)
- 可以重復生成,每次都會生成相同的鏡像
- 能夠部署到不同的節點上,沒有特定的鏡像倉庫的概念。
為了簡化微容器的構建,Oracle 發布了 Smith,這是一個使用 Golang 編寫的容器構建工具。這個工具可以通過 yum 倉庫和(可選)RPM 文件來構建微容器。另外,它還可以“微化(micro-ize)”已有的 Docker 容器,在開發階段,開發人員能夠使用非常友好的 Docker 工具來構建容器,而在生產部署的時候,Smith 能夠將這個容器轉換為微容器。Smith 按照標準 OCI 格式來構建鏡像,但是它也可以通過 Docker 倉庫上傳和下載鏡像。
微容器在針對生產環境的使用執行完微小化操作之后,對運維人員來說診斷和修復問題會變得很有挑戰性,這主要是因為缺少 OS 工具。大多數的調試可以通過宿主機器完成,但有時需要以容器的視角來查看文件系統。針對這種使用場景,Oracle 創建了 Crashcart。Crashcart 允許旁加載(side-loading)一組 Linux 二進制文件到正在運行的容器中,這樣做的目的主要是探查和調試。關于旁加載二進制文件為何如此困難,以及 Crashcart 如何克服這些困難的,可以參考"Hardcore Container Debugging"這篇博客文章。
Oracle 發布的第三個工具是 Railcar,基于 Rust 的 OCI 運行時規范實現。它非常類似于參考實現 runc,但是它完全是使用 Rust 實現的,為了“內存安全,避免垃圾收集或多線程帶來的損耗”。Abrams 指出盡管 Go 在構建系統工具和 CLI 方面很有用,但是“Go 對于容器運行時來說卻并不是好的可選語言”,其中的問題包括與命名空間的交互(在最近的 Weaveworks 博客文章上有所提及)。關于 Railcar 開發的更多信息可以參見 Oracle 開發人員博客"使用 Rust 構建容器運行時環境"。
這些工具發布的更多信息可以參考 Oracle 開發人員博客和 Oracle 的 GitHub 賬號。
來自: InfoQ