runc系列-00-基本知识
概述
runc(run container)是一个基于 OCI 标准实现的一个轻量级容器运行工具,用来创建和运行容器。而 Containerd 是用来维持通过 runc 创建的容器的运行状态。 即 runc 用来创建和运行容器,Containerd 作为常驻进程用来管理容器。runc 实际是一个 CLI 工具,用于根据 OCI 规范生成和运行容器。真正调用 Linux 接口去创建网络接口的是 runc 里的代码,这些关于创建网络接口、挂载目录的操作,都是一个个 go 的 library 做的。
当然 runc 是一个比较底层的工具了,虽然说一般不会有人直接用他,不过我们还是尝试一下。
下面是 runc docs 的中文翻译。
cgroup v2
从 v1.0.0-rc93 开始,runc 完全支持 cgroup v2(统一模式)。要使用 cgroup v2,您可能需要更改主机初始化系统的配置。已知以下发行版默认使用 cgroup v2:
- Fedora(31 起)
- Arch Linux(自 2021 年 4 月起)
- openSUSE Tumbleweed(自 2021 年起)
- Debian GNU/Linux(从 11 开始)
- Ubuntu(自 21.10 起)
- RHEL 和类似 RHEL 的发行版(自 9 起)
在其他基于 systemd 的发行版上,可以通过添加 systemd.unified_cgroup_hierarchy=1
到内核 cmdline 来启用 cgroup v2。
查看 /sys/fs/cgroup/cgroup.controllers
确认是否使用 cgroup v2。
主机要求
- 推荐版本: 5.2或更高版本
- 最低版本: 4.15
- 由于缺少freezer,不推荐使用5.2以前的内j
值得注意的是,不得使用早于4.15的内核(除非正在运行具有用户命名空间的容器),因为它缺乏对控制设备权限的支持。
Systemd
在 cgroup v2 主机上,强烈建议使用 systemd cgroup 驱动程序 (runc –systemd-cgroup) 运行 runc,但不是强制性的。
推荐的 systemd 版本为 244 或更高版本。较旧的 systemd 不支持 cpuset 控制器委派。确保您还安装了 dbus-user-session(Debian/Ubuntu) 或 dbus-daemon(CentOS/Fedora) 软件包,并且该软件包 dbus 正在运行。在 Debian 风格的发行版上,可以这样完成:
|
|
Rootless
在 cgroup v2 主机上,rootless runc 可以与 systemd 对话以获取要委派的 cgroup 权限。
|
|
容器进程在 cgroup 中执行,例如 /user.slice/user-$(id -u).slice/user@$(id -u).service/user.slice/runc-foo.scope.
配置Delegation
通常,默认情况下,只有 memory 和 pids 控制器被委派给非 root 用户。
|
|
要允许其他控制器的委派,您需要更改 systemd 配置,如下所示:
|
|
Checkpoint and Restore
有关检查点和恢复容器的基本描述,runc 请参阅 runc-checkpoint(8) 和 runc-restore(8)。
Checkpoint/Restore Annotations
除了像手册页中描述的那样在命令行上指定选项(见上文)外,还可以使用 CRIU 配置文件影响 CRIU 的行为。有关 CRIU 的配置文件支持的详细信息,请参阅CRIU 的 wiki。
除了 CRIU 的默认配置文件 runc 告诉 CRIU 还要评估文件 /etc/criu/runc.conf。然而,使用注释 org.criu.config
可以更改这个附加的 CRIU 配置文件。
如果注释 org.criu.config
设置为空字符串 runc ,则不会将任何其他配置文件传递给 CRIU。因此,使用空字符串可以禁用附加的 CRIU 配置文件。这可用于确保没有其他配置文件意外更改 CRIU 的行为。
如果注释 org.criu.config
设置为非空字符串 runc,则会将该字符串传递给 CRIU 以作为附加配置文件进行评估。如果 CRIU 无法打开此附加配置文件,它将忽略此文件并继续。
禁用附加 CRIU 配置文件的注释示例。
|
|
用于设置特定 CRIU 配置文件的注释示例。
|
|