Oracle發布開源容器工具集:含使用Rust編寫的新容器運行時環境

jopen 7年前發布 | 19K 次閱讀 Oracle

Oracle發布開源容器工具集:含使用Rust編寫的新容器運行時環境

Oracle 發布了三個開源的容器工具集,包括 Smith,遵循開放容器計劃(Open Container Initiative,OCI)鏡像規范的容器構造器,它能創建只包含可執行內容及其依賴的“微容器(microcontainer)”;Crashcart,微容器調試工具,它允許運維人員將 Linux 二進制文件的鏡像旁加載(sideload)到已有的容器中;Railcar,基于 Rust 的容器運行環境,它實現了 OCI 運行時規范

Vish AbramsOracle 開發人員博客的一篇文章上寫道,Oracle 目前正在使用容器運行其云服務的很多組件。在開發和運維生產環境的這些容器時,他們學到了很多的經驗,并相應地創建了一些工具,現在它們基于 Universal Permissive Licence 1.0Apache 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.ioJBoss 業已使用過這個術語,不要與其混淆)。具體來講,微容器:

  • 只包含一個可執行文件及其依賴,沒有 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,基于 RustOCI 運行時規范實現。它非常類似于參考實現 runc,但是它完全是使用 Rust 實現的,為了“內存安全,避免垃圾收集或多線程帶來的損耗”。Abrams 指出盡管 Go 在構建系統工具和 CLI 方面很有用,但是“Go 對于容器運行時來說卻并不是好的可選語言”,其中的問題包括與命名空間的交互(在最近的 Weaveworks 博客文章上有所提及)。關于 Railcar 開發的更多信息可以參見 Oracle 開發人員博客"使用 Rust 構建容器運行時環境"。

這些工具發布的更多信息可以參考 Oracle 開發人員博客和 Oracle 的 GitHub 賬號

來自: InfoQ

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!