0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

開源之夏總結runk:基于Rust的OCI runtime實現(xiàn)

jf_wN0SrCdH ? 來源:KataContainers ? 作者: 陳軼陽 ? 2022-11-29 15:00 ? 次閱讀

這是今年開源之夏活動中,陳軼陽同學參加 runk 項目的總結文檔,主要介紹了 runk 的由來,以及如何基于現(xiàn)有 kata agent 組件來實現(xiàn)一個標準的 OCI runtime。

1. runk背景

kata-agent是在虛擬機 (VM) 中運行的進程,作為管理容器和在這些容器中運行的進程的主管。換句話說,kata-agent是 VM 內部的一種“低級”容器運行時,因為agent根據(jù) OCI 運行時規(guī)范生成和運行容器。但是,kata-agent沒有運行時規(guī)范中定義的 OCI 命令行界面 (CLI)。kata-runtime提供了Kata Containers運行時組件的 CLI 部分,但kata-runtime是一個容器運行時,用于創(chuàng)建在主機上運行的硬件虛擬化容器。

ManaSugi[1]發(fā)起了實驗性質的runk項目。runk是一個基于 Rust 的標準 OCI 容器運行時,它管理傳統(tǒng)的容器。runk旨在成為現(xiàn)有 OCI 兼容容器運行時的替代方案之一。kata-agent具有容器運行時所需的大部分功能,并且由于使用 Rust 語言實現(xiàn),因此具有高性能和低內存占用的特點。runk利用kata-agent的機制來避免重新發(fā)明輪子。

目前,runk仍然是實驗性質的工具,有一部分功能還有待實現(xiàn)。根據(jù) ManaSugi 提交的Proposal[2],截止到目前,runk支持的功能如下:

Feature Status
crictl
Docker
Podman
OCI commands (state/create/start/kill/delete)
runcommand
speccommand
execcommand
listcommand
pscommand
pause/resumecommands
updatecommand
eventscommand
initcommand
checkpoint/restorecommands (CRIU)
Foreground terminal mode See therunc modes[3].
Cgroups v1
Cgroups v2
Systemd Cgroups
Namespaces
no pivot_root kata-agent支持該功能,但是runk還不支持。
Capabilities
Seccomp
AppArmor WIP on#2227[4]
SELinux
Rlimit
Readonly path
Masked path
Hooks
Rootless

我在這次CCF開源夏令營中新增實現(xiàn)的功能有l(wèi)ist/ps/exec/pause/resume子命令。

2. 新增子命令的作用和實現(xiàn)

2.1 list

list子命令用于列出當前運行的容器,列出的基本信息包括容器ID、進程PID、狀態(tài)、Bundle、創(chuàng)建時間、所有者。運行效果如下:

$ sudo runk list container1
ID  PID  STATUS   BUNDLE                                    CREATED                            OWNER
k1  0    stopped  /home/cyyzero/workspace/test/runk/bundle  2022-11-04 07:41:47.489394784 UTC  root

實現(xiàn)方式是遍歷root目錄下的所有子目錄,然后讀取state.json文件,解析出容器的基本信息并打印輸出。

2.2 ps

ps子命令用于列出容器內的進程信息。運行效果如下:

$ sudo runk ps container1
  PID TTY          TIME CMD
    1 ?        00:00:00 sh
    2 ?        00:00:00 sleep
    3 pts/0    00:00:00 ps

實現(xiàn)方式是首先通過cgroup來獲取容器內所有的pid;然后利用ps -ef命令搜集操作系統(tǒng)上所有進程的信息。最后通過pid的比對,將容器進程相關的信息打印出來。

2.3 exec

exec子命令用于在容器內執(zhí)行一個新的進程,它允許指定啟動進程的命令行參數(shù)、環(huán)境變量、cwd等信息。新進程會通過setns系統(tǒng)調用來加入到容器的namesapce中,同時也會加入容器所在的cgroup進程集合。

它與已實現(xiàn)的create和run命令類似,依賴rustjail包里的LinuxContainer類。LinuxContainer類是agent啟動容器的核心類,針對每個容器會生成一個LinuxContainer實例,并通過這個對象來管理整個容器的生命周期,包括創(chuàng)建、啟動、停止、刪除等一系列操作。runk也依賴LinuxContainer類來啟動容器進程。目前只在兩個場景下使用:創(chuàng)建初始容器進程(對應create/run命令)和在已創(chuàng)建的容器中再啟動額外進程(對應exec命令)。針對這兩種啟動進程的方式,我抽象出了兩個類,InitContainer和ActivatedContainer,它們能夠生成ContainerLauncher類的對象來啟動進程。

運行方式如下:

# --pid-file 用于輸出啟動進程的進程號,--env用于指定環(huán)境變量,--cwd用于指定工作目錄
$ sudo runk exec --pid-file container1.pid --env ENV1=test --cwd / container1 ls -l

2.4 pause/resume

pause/resume利用了cgroup的freezer子系統(tǒng),可以掛起或者恢復cgroup集合中的進程。

在cgroup_rs包中,已經(jīng)封裝好了對于freezer子系統(tǒng)的操作,目前支持cgroup v1和cgroup v2。核心代碼如下,可以很簡單地改變容器的freezer狀態(tài)。

pub fn freeze(cgroup: &cgroups::Cgroup, state: FreezerState) -> Result<()> {
    let freezer_controller: &FreezerController = cgroup
        .controller_of()
        .ok_or_else(|| anyhow!("failed to get freezer controller"))?;
    match state {
        FreezerState::Frozen => {
            freezer_controller.freeze()?;
        }
        FreezerState::Thawed => {
            freezer_controller.thaw()?;
        }
        _ => return Err(anyhow!("invalid freezer state")),
    }
    Ok(())
}

3. 遇到的特殊問題

在cgroup v1,處于frozen狀態(tài)的進程無法處理信號,所以對于kill命令,需要先將容器解除frozen狀態(tài),然后再發(fā)送信號。詳情可以參考runc倉庫的討論[5]。

4. 測試

目前,runk除了rust自帶的單元測試外,還添加了集成測試。集成測試的目的是驗證runk的功能是否正常,以及runk與containerd的交互是否正常。集成測試的代碼在kata-containers/tests倉庫的integration/containerd/runk/runk-tests.sh文件。測試會利用containerd自帶的調試工具ctr來調用runk,比如典型的容器啟動命令如下:

# --runc-binary 用于指定runk的路徑,從而使用runk而非默認的runc作為 OCI runtime
sudo ctr run --pid-file ${PID_FILE} --rm -d --runc-binary ${RUNK_BIN_PATH}  ${CONTAINER_ID}

5. 總結展望

在runk開發(fā)的過程中,我學習到了安全容器的基本架構,閱讀了一些容器相關的源碼(kata agent/runc/youki),并輔以動手編碼,加深了對 OCI runtime 細節(jié)的了解。在參與 ·kata· 社區(qū)的定期周會以及 GitHub issue 討論中,我學習到了開源社區(qū)的工作模式,也體驗到了開源社區(qū)的友好氛圍。在未來,我希望能夠繼續(xù)參與kata社區(qū)的開發(fā),為kata社區(qū)的發(fā)展做出貢獻。短期目標來看,我會繼續(xù)專注runk,補全其他特性的開發(fā),并持續(xù)跟進runk的測試,最終讓runk成為一個完善的 OCI runtime。

最后,感謝一直以來給予指導和review代碼的劉斌導師(@liubin)和Manabu Sugimoto(@ManaSugi)。

6. 個人介紹

我是來自中國科學院計算機網(wǎng)絡信息中心的研究生陳軼陽,研究方向是超算環(huán)境的容器應用。機緣巧合下從隔壁軟件所舉辦的開源之夏活動中知道了kata社區(qū),并最終參加了GLCC開源夏令營,并做了一點微小的工作。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 容器
    +關注

    關注

    0

    文章

    490

    瀏覽量

    21986
  • OCI
    OCI
    +關注

    關注

    0

    文章

    14

    瀏覽量

    8988
  • runtime
    +關注

    關注

    0

    文章

    17

    瀏覽量

    2155
  • Rust
    +關注

    關注

    1

    文章

    226

    瀏覽量

    6497

原文標題:開源之夏總結 runk:基于 Rust 的 OCI runtime 實現(xiàn)

文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Rust GUI實踐Rust-Qt模塊

    Rust-Qt 是 Rust 語言的一個 Qt 綁定庫,它允許 Rust 開發(fā)者使用 Qt 框架來創(chuàng)建跨平臺的圖形界面應用程序。Qt 是一個跨平臺的應用程序框架,它提供了一系列的工具和庫,可以幫助
    的頭像 發(fā)表于 09-30 16:43 ?1375次閱讀

    Rust 語言中的 RwLock內部實現(xiàn)原理

    中的 RwLock 的內部實現(xiàn)原理、常用接口的使用技巧和最佳實踐。 RwLock 的內部實現(xiàn)原理 基本概念 RwLock 是一種讀寫分離的鎖,允許多個線程同時讀取共享數(shù)據(jù),但只允許一個線程寫入數(shù)據(jù)。通過這種方式,可以避免讀寫操作之間的競爭,從而提高并發(fā)性能。 在
    的頭像 發(fā)表于 09-20 11:23 ?697次閱讀

    如何在STM32 (Cortex M3)和GD32(RISC-V)上用Rust開發(fā)

    RUST HAL 實現(xiàn)剛好是華科本科生寫的,恰好我也是華科的研究生,太巧了 ;)所以用 rust 開發(fā)嵌入式不需要重復實現(xiàn)相同的功能,使用開源
    發(fā)表于 06-21 10:38

    關于Runtime的應用

    可以參看Apple開源Runtime代碼 和Rumtime編程指南 。 本文總結一些其常用的方法。 1 新建測試Demo 我們先創(chuàng)建一個測試Demo如下圖,其中TestClass是一個測試類
    發(fā)表于 09-25 15:10 ?0次下載
    關于<b class='flag-5'>Runtime</b>的應用

    如何構建可以支持Runtime模塊的自定義Substrate鏈

    substrate和并發(fā)runtime模塊是用rust開發(fā)的,rust是一種靜態(tài)類型語言,具有內存安全特性,提供速度和可靠性。 這是一個在區(qū)塊鏈開發(fā)中經(jīng)常被忽視的主題,但對于采用是至關重要
    發(fā)表于 09-18 10:15 ?727次閱讀

    2022 開源|EMQ 三大開源項目開發(fā)圓滿收官

    今年暑假,EMQ 攜手開源,與高校學生開展了一場精彩紛呈的開源之旅。開源
    的頭像 發(fā)表于 11-23 16:02 ?671次閱讀
    2022 <b class='flag-5'>開源</b><b class='flag-5'>之</b><b class='flag-5'>夏</b>|EMQ 三大<b class='flag-5'>開源</b>項目開發(fā)圓滿收官

    橋CAM開源硬件

    電子發(fā)燒友網(wǎng)站提供《橋CAM開源硬件.zip》資料免費下載
    發(fā)表于 02-03 09:21 ?0次下載
    <b class='flag-5'>夏</b>橋CAM<b class='flag-5'>開源</b>硬件

    如何在同步的Rust方法中調用異步代碼呢?

    在同步的 Rust 方法中調用異步代碼經(jīng)常會導致一些問題,特別是對于不熟悉異步 Rust runtime 底層原理的初學者。
    的頭像 發(fā)表于 03-17 09:18 ?1914次閱讀

    rust語言基礎學習: 智能指針Cow

    Rust中與借用數(shù)據(jù)相關的三個trait: Borrow, BorrowMut和ToOwned。理解了這三個trait之后,再學習Rust中能夠實現(xiàn)寫時克隆的智能指針Cow。
    的頭像 發(fā)表于 05-22 16:13 ?2659次閱讀

    基于Rust語言的高可靠、開源嵌入式Hypervisor

    Rust-Shyper 是北京航空航天大學計算機學院王雷教授團隊設計開發(fā)的虛擬機監(jiān)控器,該系統(tǒng)基于 Rust 語言,實現(xiàn)了一個高可靠、嵌入式 Hypervisor。2023 年 2 月 15 日
    的頭像 發(fā)表于 05-24 16:31 ?1620次閱讀
    基于<b class='flag-5'>Rust</b>語言的高可靠、<b class='flag-5'>開源</b>嵌入式Hypervisor

    runtime 的一些對比選型和應用

    ? 01 概述 盡管 Tokio 目前已經(jīng)是 Rust 異步運行時的事實標準,但要實現(xiàn)極致性能的網(wǎng)絡中間件還有一定距離。為了這個目標,CloudWeGo Rust Team 探索
    的頭像 發(fā)表于 05-26 15:48 ?516次閱讀
    <b class='flag-5'>runtime</b> 的一些對比選型和應用

    谷歌開源內部Rust Crate審計結果

    Rust 可以輕松地將代碼封裝和共享到 crate 中,crate 是可重用的軟件組件,就像其他語言中的包一樣。我們擁抱廣泛的開源 Rust crate 生態(tài)系統(tǒng),既利用了谷歌以外編寫的 crates,也發(fā)布了我們自己的幾個
    的頭像 發(fā)表于 05-29 11:10 ?705次閱讀

    開源2023】聊?聊開源以及項目的進展(rt-thread上用CI來驗證軟件包的編譯情況)

    前言 開源是什么? ?先來簡單介紹?下開源。? 開源
    的頭像 發(fā)表于 08-24 20:05 ?899次閱讀

    如何在同步的 Rust 方法中調用異步代碼 | Tokio 使用中的幾點教訓

    在同步的 Rust 方法中調用異步代碼經(jīng)常會導致一些問題,特別是對于不熟悉異步 Rust runtime 底層原理的初學者。
    的頭像 發(fā)表于 12-24 16:23 ?1084次閱讀

    AI推理框架軟件ONNX Runtime正式支持龍架構

    近日,知名AI推理框架開源社區(qū)ONNX Runtime正式發(fā)布支持龍架構的版本1.17.0。
    的頭像 發(fā)表于 03-12 12:23 ?457次閱讀
    AI推理框架軟件ONNX <b class='flag-5'>Runtime</b>正式支持龍架構