编程 Kata Containers 4.0 默认切到 runtime-rs:老的 TOML 配置不是照搬就能跑

2026-09-19 00:04:38

项目地址:github.com/kata-containers/kata-containers | 官网:katacontainers.io | 文档:kata-containers.github.io/kata-containersReleases

Kata Containers 4.0 默认切到 runtime-rs:老的 TOML 配置不是照搬就能跑

从 4.0.0 开始,kata-deploy 在所有有 runtime-rs 构建的架构(x86_64、aarch64、s390x、ppc64le)上默认发布 Rust 运行时。默认 RuntimeClass 因此解析为 qemu-runtime-rs,不再是 Go runtime 的 kata-qemu。4.0.0 于 2026 年 7 月 22 日发布,发布说明里强调内存安全、更小的运行时占用和更低启动延迟。

Go runtime 已弃用但没被移除:仍受支持(不再新增功能),仍可通过 kata-qemu RuntimeClass 选择。没有固定移除日期,至少到 5.0 才可能移除;如果维护者出于架构或安全原因认为有必要,也可能更早结束支持。

两者 shim 的落点不同:

运行时containerd shim 路径
runtime-rs(4.0 默认)/opt/kata/runtime-rs/bin/containerd-shim-kata-v2
Go runtime(弃用)/opt/kata/bin/containerd-shim-kata-v2

同一个 TOML,两套解析器

Kata 目前发布两个运行时实现:Go runtime(src/runtime,历史上称 runtime-go)和 Rust runtime(src/runtime-rs,即 runtime-rs)。两者都用 TOML 配置,但各自理解、处理的选项集合并不相同。配置选项集在 runtime-rs 构建过程中发生了分化,为 Go runtime 写的配置文件在 runtime-rs 下不保证行为一致,甚至不完全生效。

对照差异可以直接读解析代码和模板:

  • Go runtime 解析:src/runtime/pkg/katautils/config.go,模板 src/runtime/config/configuration-qemu.toml.in
  • runtime-rs 解析:src/libs/kata-types/src/config,模板 src/runtime-rs/config/configuration-qemu-runtime-rs.toml.in

以下差异都以 QEMU hypervisor 为准。

被丢掉的选项

无替代地丢弃

[hypervisor.qemu] 下这几个选项 runtime-rs 直接不认,也没有替代物:

  • firmware_volume:拆分固件卷(FIRMWARE_VARS.fd / FIRMWARE_CODE.fd)的路径
  • measurement_algo:SEV-SNP attestation 使用的测量算法
  • vhost_user_reconnect_timeout_sec:非 server SPDK vhost-user socket 的重连超时
  • use_legacy_serial:guest console 使用 legacy serial 设备

VMCache 已弃用且未在 runtime-rs 实现,[factory] 下的 vm_cache_numbervm_cache_endpoint 没有等价项。VM templating(enable_template / template_path)在 runtime-rs 里确实支持,只是换了表。

尚未实现

[hypervisor.qemu] 下这些属于「以后会加」,现在写进去不生效:

  • enable_numa:向 guest 暴露主机 NUMA 拓扑(1:1 映射、vCPU 绑定)
  • numa_mapping:VM NUMA 节点到主机 NUMA 节点的自定义映射
  • net_rate_limiter_bw_max_ratenet_rate_limiter_bw_one_time_burstnet_rate_limiter_ops_max_ratenet_rate_limiter_ops_one_time_burst:网络带宽与操作限速

disk 限速不受影响:disk_rate_limiter_bw_max_ratedisk_rate_limiter_bw_one_time_burstdisk_rate_limiter_ops_max_ratedisk_rate_limiter_ops_one_time_burst 在两个运行时里都存在。

改名、换表、换单位

这类最容易踩:选项看着还在,写法已经变了。

Go runtimeruntime-rs变化
[hypervisor.qemu] seccompsandboxseccomp_sandbox加下划线
[hypervisor.qemu] hypervisor_loglevel(uint32)log_level(字符串 trace/debug/info/warn/error/critical)数字改字符串
[hypervisor.qemu] hot_plug_vfio(no-port/bridge-port/root-port/switch-port)hotplug_vfio_on_root_bus(bool)改 bool,配 pcie_root_port / pcie_switch_port
block_device_driver = virtio-blk / virtio-scsi / nvdimmvirtio-blk-pci / virtio-blk-ccw / virtio-blk-mmio / virtio-scsi / virtio-pmem同名不同取值
[runtime] guest_selinux_label[hypervisor.qemu] selinux_label改名 + 换表
[runtime] create_container_timeout(秒)[agent.kata] create_container_timeout换表,文件里写秒、内部按毫秒存
[agent.kata] dial_timeout(秒)dial_timeout_ms(毫秒)秒改毫秒
[agent.kata] cdh_api_timeout(秒)cdh_api_timeout_ms(毫秒)秒改毫秒
[factory](顶层表)[hypervisor.qemu.factory]换表,仅保留 enable_template / template_path
[runtime] experimental_force_guest_pull(bool)[runtime] experimental = ["force_guest_pull"]bool 改列表
注解 io.katacontainers.config.agent.policy[agent.kata] policyGo 只认注解,runtime-rs 额外暴露为配置项
注解 io.katacontainers.config.hypervisor.cc_init_data[hypervisor.qemu] initdata同上

几个细节:block_device_drivervirtio-blk 这种旧值会失败;create_container_timeout[runtime] 挪到 [agent.kata] 后单位写法不变,仍是秒;[factory] 顶层表整体挪到 [hypervisor.qemu.factory],弃用的 VMCache 字段直接丢掉;[runtime][agent.kata] 下的 enable_debug(bool)都还在,runtime-rs 额外支持字符串 log_level

runtime-rs 特有的选项

[hypervisor.qemu]vm_rootfs_driverqueue_sizenum_queuesnetwork_queuesctlpath/valid_ctlpathsprefetch_list_pathhugepage_typevirtio_fs_is_daxguest_swap_path/guest_swap_size_percent/guest_swap_create_threshold_secsrootless_user(uid/gid/groups/user_name)、boot_to_be_template/boot_from_template/memory_path/device_state_path

guest swap 要单独说:QEMU 插件当前会在校验阶段拒绝 enable_guest_swap = true,所以 guest swap 在 runtime-rs 的 QEMU 下不支持,guest_swap_* 对 QEMU 也没有效果。

[runtime]namehypervisor_nameagent_namekeep_abnormalshared_mountsuse_passfd_iopassfd_listener_port。组件选择机制是 runtime-rs 特有的,一个配置文件同时选 runtime/hypervisor/agent;Go runtime 则靠存在的 [hypervisor.] 表隐式选 hypervisor。

[agent.kata]server_portlog_portpassfd_listener_portreconnect_timeout_mshealth_check_request_timeout_mscontainer_pipe_size[agent.kata.mem_agent] 整张内存 agent 配置表也是 runtime-rs 特有。

注册 runtime-rs 并验证

推荐安装路径是 Kubernetes 上的 kata-deploy Helm chart。kata-static 归档里 runtime-rs 的 shim 在 /opt/kata/runtime-rs/bin/containerd-shim-kata-v2,Go shim 在 /opt/kata/bin/containerd-shim-kata-v2。runtime-rs 配置放在 /opt/kata/share/defaults/kata-containers/,文件名带 -runtime-rs 后缀(如 configuration-qemu-runtime-rs.toml);configuration-dragonball.toml 则选中内置 Dragonball VMM。

Docker v26+ 可以直接用 Kata shim 启动容器,用 ConfigPath 选配置:

{
"runtimes": {
"kata": {
"runtimeType": "/opt/kata/runtime-rs/bin/containerd-shim-kata-v2",
"options": {
"ConfigPath": "/opt/kata/share/defaults/kata-containers/runtime-rs/configuration-qemu-runtime-rs.toml"
}
}
}
}

containerd 侧在 config.toml 里加:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
runtime_type = "io.containerd.kata.v2"

重启 containerd 生效。验证:

ctr image pull docker.io/library/busybox:latest
ctr run --runtime io.containerd.kata.v2 --rm -t docker.io/library/busybox:latest test-kata uname -r

uname -r 返回的是 guest 内核版本,通常与宿主机不同。

迁移时怎么做

节点上先保留 kata-qemu RuntimeClass 作为回退,别一次性把 Go runtime 的选项全搬过来。逐项核对配置:先处理无替代丢弃和尚未实现的选项,再处理改名/换表/换单位的,最后确认 runtime-rs 特有选项——尤其是 enable_guest_swap 这类会被校验直接拒绝的。老 toml 默认照搬会出问题。

推荐文章

程序员茄子在线接单