0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

開(kāi)源之夏總結(jié)runk:基于Rust的OCI runtime實(shí)現(xiàn)

jf_wN0SrCdH ? 來(lái)源:KataContainers ? 作者: 陳軼陽(yáng) ? 2022-11-29 15:00 ? 次閱讀

這是今年開(kāi)源之夏活動(dòng)中,陳軼陽(yáng)同學(xué)參加 runk 項(xiàng)目的總結(jié)文檔,主要介紹了 runk 的由來(lái),以及如何基于現(xiàn)有 kata agent 組件來(lái)實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)的 OCI runtime。

1. runk背景

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

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

目前,runk仍然是實(shí)驗(yàn)性質(zhì)的工具,有一部分功能還有待實(shí)現(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開(kāi)源夏令營(yíng)中新增實(shí)現(xiàn)的功能有l(wèi)ist/ps/exec/pause/resume子命令。

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

2.1 list

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

$ 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

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

2.2 ps

ps子命令用于列出容器內(nèi)的進(jìn)程信息。運(yùn)行效果如下:

$ 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

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

2.3 exec

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

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

運(yùn)行方式如下:

# --pid-file 用于輸出啟動(dòng)進(jìn)程的進(jìn)程號(hào),--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),可以?huà)炱鸹蛘呋謴?fù)cgroup集合中的進(jìn)程。

在cgroup_rs包中,已經(jīng)封裝好了對(duì)于freezer子系統(tǒng)的操作,目前支持cgroup v1和cgroup v2。核心代碼如下,可以很簡(jiǎn)單地改變?nèi)萜鞯膄reezer狀態(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. 遇到的特殊問(wèn)題

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

4. 測(cè)試

目前,runk除了rust自帶的單元測(cè)試外,還添加了集成測(cè)試。集成測(cè)試的目的是驗(yàn)證runk的功能是否正常,以及runk與containerd的交互是否正常。集成測(cè)試的代碼在kata-containers/tests倉(cāng)庫(kù)的integration/containerd/runk/runk-tests.sh文件。測(cè)試會(huì)利用containerd自帶的調(diào)試工具ctr來(lái)調(diào)用runk,比如典型的容器啟動(dòng)命令如下:

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

5. 總結(jié)展望

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

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

6. 個(gè)人介紹

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

審核編輯:湯梓紅

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

    關(guān)注

    0

    文章

    503

    瀏覽量

    22248
  • OCI
    OCI
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    9035
  • runtime
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    2231
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    6777

原文標(biāo)題:開(kāi)源之夏總結(jié) runk:基于 Rust 的 OCI runtime 實(shí)現(xiàn)

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    Rust GUI實(shí)踐Rust-Qt模塊

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

    Rust 語(yǔ)言中的 RwLock內(nèi)部實(shí)現(xiàn)原理

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

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

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

    關(guān)于Runtime的應(yīng)用

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

    如何構(gòu)建可以支持Runtime模塊的自定義Substrate鏈

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

    2022 開(kāi)源|EMQ 三大開(kāi)源項(xiàng)目開(kāi)發(fā)圓滿(mǎn)收官

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

    橋CAM開(kāi)源硬件

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

    如何在同步的Rust方法中調(diào)用異步代碼呢?

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

    rust語(yǔ)言基礎(chǔ)學(xué)習(xí): 智能指針Cow

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

    基于Rust語(yǔ)言的高可靠、開(kāi)源嵌入式Hypervisor

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

    runtime 的一些對(duì)比選型和應(yīng)用

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

    谷歌開(kāi)源內(nèi)部Rust Crate審計(jì)結(jié)果

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

    開(kāi)源2023】聊?聊開(kāi)源以及項(xiàng)目的進(jìn)展(rt-thread上用CI來(lái)驗(yàn)證軟件包的編譯情況)

    前言 開(kāi)源是什么? ?先來(lái)簡(jiǎn)單介紹?下開(kāi)源。? 開(kāi)源
    的頭像 發(fā)表于 08-24 20:05 ?1134次閱讀

    如何在同步的 Rust 方法中調(diào)用異步代碼 | Tokio 使用中的幾點(diǎn)教訓(xùn)

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

    AI推理框架軟件ONNX Runtime正式支持龍架構(gòu)

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

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品