项目地址:github.com/kata-containers/kata-containers | 官网:katacontainers.io | 文档:kata-containers.github.io/kata-containers | Releases
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_number、vm_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_rate、net_rate_limiter_bw_one_time_burst、net_rate_limiter_ops_max_rate、net_rate_limiter_ops_one_time_burst:网络带宽与操作限速
disk 限速不受影响:disk_rate_limiter_bw_max_rate、disk_rate_limiter_bw_one_time_burst、disk_rate_limiter_ops_max_rate、disk_rate_limiter_ops_one_time_burst 在两个运行时里都存在。
改名、换表、换单位
这类最容易踩:选项看着还在,写法已经变了。
| Go runtime | runtime-rs | 变化 |
|---|---|---|
[hypervisor.qemu] seccompsandbox | seccomp_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 / nvdimm | virtio-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] policy | Go 只认注解,runtime-rs 额外暴露为配置项 |
注解 io.katacontainers.config.hypervisor.cc_init_data | [hypervisor.qemu] initdata | 同上 |
几个细节:block_device_driver 填 virtio-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_driver、queue_size、num_queues、network_queues、ctlpath/valid_ctlpaths、prefetch_list_path、hugepage_type、virtio_fs_is_dax、guest_swap_path/guest_swap_size_percent/guest_swap_create_threshold_secs、rootless_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]:name、hypervisor_name、agent_name、keep_abnormal、shared_mounts、use_passfd_io、passfd_listener_port。组件选择机制是 runtime-rs 特有的,一个配置文件同时选 runtime/hypervisor/agent;Go runtime 则靠存在的 [hypervisor.] 表隐式选 hypervisor。
[agent.kata]:server_port、log_port、passfd_listener_port、reconnect_timeout_ms、health_check_request_timeout_ms、container_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 默认照搬会出问题。