0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开源之夏总结runk:基于Rust的OCI runtime实现

jf_wN0SrCdH 来源:KataContainers 作者: 陈轶阳 2022-11-29 15:00 次阅读

这是今年开源之夏活动中,陈轶阳同学参加 runk 项目的总结文档,主要介绍了 runk 的由来,以及如何基于现有 kata agent 组件来实现一个标准的 OCI runtime。

1. runk背景

kata-agent是在虚拟机 (VM) 中运行的进程,作为管理容器和在这些容器中运行的进程的主管。换句话说,kata-agent是 VM 内部的一种“低级”容器运行时,因为agent根据 OCI 运行时规范生成和运行容器。但是,kata-agent没有运行时规范中定义的 OCI 命令行界面 (CLI)。kata-runtime提供了Kata Containers运行时组件的 CLI 部分,但kata-runtime是一个容器运行时,用于创建在主机上运行的硬件虚拟化容器。

ManaSugi[1]发起了实验性质的runk项目。runk是一个基于 Rust 的标准 OCI 容器运行时,它管理传统的容器。runk旨在成为现有 OCI 兼容容器运行时的替代方案之一。kata-agent具有容器运行时所需的大部分功能,并且由于使用 Rust 语言实现,因此具有高性能和低内存占用的特点。runk利用kata-agent的机制来避免重新发明轮子。

目前,runk仍然是实验性质的工具,有一部分功能还有待实现。根据 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开源夏令营中新增实现的功能有list/ps/exec/pause/resume子命令。

2. 新增子命令的作用和实现

2.1 list

list子命令用于列出当前运行的容器,列出的基本信息包括容器ID、进程PID、状态、Bundle、创建时间、所有者。运行效果如下:

$ 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

实现方式是遍历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

实现方式是首先通过cgroup来获取容器内所有的pid;然后利用ps -ef命令搜集操作系统上所有进程的信息。最后通过pid的比对,将容器进程相关的信息打印出来。

2.3 exec

exec子命令用于在容器内执行一个新的进程,它允许指定启动进程的命令行参数、环境变量、cwd等信息。新进程会通过setns系统调用来加入到容器的namesapce中,同时也会加入容器所在的cgroup进程集合。

它与已实现的create和run命令类似,依赖rustjail包里的LinuxContainer类。LinuxContainer类是agent启动容器的核心类,针对每个容器会生成一个LinuxContainer实例,并通过这个对象来管理整个容器的生命周期,包括创建、启动、停止、删除等一系列操作。runk也依赖LinuxContainer类来启动容器进程。目前只在两个场景下使用:创建初始容器进程(对应create/run命令)和在已创建的容器中再启动额外进程(对应exec命令)。针对这两种启动进程的方式,我抽象出了两个类,InitContainer和ActivatedContainer,它们能够生成ContainerLauncher类的对象来启动进程。

运行方式如下:

# --pid-file 用于输出启动进程的进程号,--env用于指定环境变量,--cwd用于指定工作目录
$ sudo runk exec --pid-file container1.pid --env ENV1=test --cwd / container1 ls -l

2.4 pause/resume

pause/resume利用了cgroup的freezer子系统,可以挂起或者恢复cgroup集合中的进程。

在cgroup_rs包中,已经封装好了对于freezer子系统的操作,目前支持cgroup v1和cgroup v2。核心代码如下,可以很简单地改变容器的freezer状态。

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状态的进程无法处理信号,所以对于kill命令,需要先将容器解除frozen状态,然后再发送信号。详情可以参考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开发的过程中,我学习到了安全容器的基本架构,阅读了一些容器相关的源码(kata agent/runc/youki),并辅以动手编码,加深了对 OCI runtime 细节的了解。在参与 ·kata· 社区的定期周会以及 GitHub issue 讨论中,我学习到了开源社区的工作模式,也体验到了开源社区的友好氛围。在未来,我希望能够继续参与kata社区的开发,为kata社区的发展做出贡献。短期目标来看,我会继续专注runk,补全其他特性的开发,并持续跟进runk的测试,最终让runk成为一个完善的 OCI runtime。

最后,感谢一直以来给予指导和review代码的刘斌导师(@liubin)和Manabu Sugimoto(@ManaSugi)。

6. 个人介绍

我是来自中国科学院计算机网络信息中心的研究生陈轶阳,研究方向是超算环境的容器应用。机缘巧合下从隔壁软件所举办的开源之夏活动中知道了kata社区,并最终参加了GLCC开源夏令营,并做了一点微小的工作。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21876
  • OCI
    OCI
    +关注

    关注

    0

    文章

    12

    浏览量

    8980
  • runtime
    +关注

    关注

    0

    文章

    17

    浏览量

    2141
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6387

原文标题:开源之夏总结 runk:基于 Rust 的 OCI runtime 实现

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Rust语言如何与 InfluxDB 集成

    Rust 是一种系统级编程语言,具有高性能和内存安全性。InfluxDB 是一个开源的时间序列数据库,用于存储、查询和可视化大规模数据集。Rust 语言可以与 InfluxDB 集成,提供高效
    的头像 发表于 09-30 16:45 614次阅读

    Rust 语言中的 RwLock内部实现原理

    中的 RwLock 的内部实现原理、常用接口的使用技巧和最佳实践。 RwLock 的内部实现原理 基本概念 RwLock 是一种读写分离的锁,允许多个线程同时读取共享数据,但只允许一个线程写入数据。通过这种方式,可以避免读写操作之间的竞争,从而提高并发性能。 在
    的头像 发表于 09-20 11:23 478次阅读

    坛友经验分享基于STM32的微型开源四轴飞行器

    该经验总结由坛友struggle!分享,现整理出来方便大家学习基于STM32的微型开源四轴飞行器 航模电机 基于STM32的开源微型四轴飞行器
    发表于 09-05 17:36

    如何在STM32 (Cortex M3)和GD32(RISC-V)上用Rust开发

    RUST HAL 实现刚好是华科本科生写的,恰好我也是华科的研究生,太巧了 ;)所以用 rust 开发嵌入式不需要重复实现相同的功能,使用开源
    发表于 06-21 10:38

    关于Runtime的应用

    可以参看Apple开源Runtime代码 和Rumtime编程指南 。 本文总结一些其常用的方法。 1 新建测试Demo 我们先创建一个测试Demo如下图,其中TestClass是一个测试
    发表于 09-25 15:10 0次下载
    关于<b class='flag-5'>Runtime</b>的应用

    如何构建可以支持Runtime模块的自定义Substrate链

    substrate和并发runtime模块是用rust开发的,rust是一种静态类型语言,具有内存安全特性,提供速度和可靠性。 这是一个在区块链开发中经常被忽视的主题,但对于采用是至关重要
    发表于 09-18 10:15 668次阅读

    在windows上安装或执行程序遇到的runtime是什么?

    ‍‍什么是runtime 在windows上安装或执行程序,都有机会遇到词汇——runtime。 CRT(C runtime library) Microsoft Access 2016
    的头像 发表于 03-17 09:51 4356次阅读

    rust-analyzer Rust编译器前端实现

    ./oschina_soft/rust-analyzer.zip
    发表于 05-19 09:23 2次下载
    <b class='flag-5'>rust</b>-analyzer <b class='flag-5'>Rust</b>编译器前端<b class='flag-5'>实现</b>

    如何在同步的Rust方法中调用异步代码呢?

    在同步的 Rust 方法中调用异步代码经常会导致一些问题,特别是对于不熟悉异步 Rust runtime 底层原理的初学者。
    的头像 发表于 03-17 09:18 1539次阅读

    基于Rust语言的高可靠、开源嵌入式Hypervisor

    Rust-Shyper 是北京航空航天大学计算机学院王雷教授团队设计开发的虚拟机监控器,该系统基于 Rust 语言,实现了一个高可靠、嵌入式 Hypervisor。2023 年 2 月 15 日
    的头像 发表于 05-24 16:31 1025次阅读
    基于<b class='flag-5'>Rust</b>语言的高可靠、<b class='flag-5'>开源</b>嵌入式Hypervisor

    runtime 的一些对比选型和应用

      01 概述 尽管 Tokio 目前已经是 Rust 异步运行时的事实标准,但要实现极致性能的网络中间件还有一定距离。为了这个目标,CloudWeGo Rust Team 探索
    的头像 发表于 05-26 15:48 339次阅读
    <b class='flag-5'>runtime</b> 的一些对比选型和应用

    谷歌开源内部Rust Crate审计结果

    Rust 可以轻松地将代码封装和共享到 crate 中,crate 是可重用的软件组件,就像其他语言中的包一样。我们拥抱广泛的开源 Rust crate 生态系统,既利用了谷歌以外编写的 crates,也发布了我们自己的几个
    的头像 发表于 05-29 11:10 548次阅读

    昊衡科技-推出分体式光矢量分析系统(OCI-V)

    继OFDR设备推出分体式后,光矢量分析系统(OCI-V)也推出了外置激光器测试的分体式设备。所谓分体式设备,就是采用外置激光器与设备Laser端连接,实现分体式测量。外置激光器也可单独作为光源,用于
    的头像 发表于 11-01 10:39 390次阅读
    昊衡科技-推出分体式光矢量分析系统(<b class='flag-5'>OCI</b>-V)

    如何在同步的 Rust 方法中调用异步代码 | Tokio 使用中的几点教训

    在同步的 Rust 方法中调用异步代码经常会导致一些问题,特别是对于不熟悉异步 Rust runtime 底层原理的初学者。
    的头像 发表于 12-24 16:23 555次阅读

    AI推理框架软件ONNX Runtime正式支持龙架构

    近日,知名AI推理框架开源社区ONNX Runtime正式发布支持龙架构的版本1.17.0。
    的头像 发表于 03-12 12:23 261次阅读
    AI推理框架软件ONNX <b class='flag-5'>Runtime</b>正式支持龙架构