☰
Kata Containers 运行时(src/runtime)全面解析:shimv2 架构、configuration.toml 配置体系与运维实践
2026/9/27 21:10:26 网站建设 项目流程
  • 云原生
  • 容器运行时

【免费下载链接】kata-containers

Kata Containers is an open source project and community working to build a standard implementation of lightweight Virtual Machines (VMs) that feel and perform like containers, but provide the workload isolation and security advantages of VMs. https://katacontainers.io/

项目地址:https://gitcode.com/gh_mirrors/ka/kata-containers
点击查看免费下载

Kata Containers 的 Go 语言运行时组件位于仓库src/runtime目录,它由containerd-shim-kata-v2(shimv2 运行时)、kata-runtime(OCI 命令行工具)与kata-monitor(指标采集守护进程)三个二进制组成,是连接容器管理器与硬件虚拟化 VM 的核心枢纽。本文以 src/runtime/README.md 为骨架,结合仓库内真实源码与配置文件,系统讲解其组件定位、配置文件的加载优先级、drop-in 片段机制、日志与调试方法,并逐节剖析configuration.toml的[hypervisor]、[factory]、[agent]、[runtime]四个配置段的实战参数,帮助你掌握从部署、调优到排障的完整能力。

组件总览:三个二进制,各司其职

src/runtime目录下包含三个可执行组件,其定位在 README 的 "Binary names" 一节中给出:

| 二进制名称 | 说明 | |-|-| |containerd-shim-kata-v2| 实现 shimv2 架构的 Kata 运行时(架构文档),是默认的 Kata RuntimeClass 后端 | |kata-runtime| OCI 命令行工具(架构文档),用于环境检查、配置路径查询、debug 等辅助操作 | |kata-monitor| 指标采集守护进程(cmd/kata-monitor/README.md),以 Prometheus 格式暴露本机全部 Kata 工作负载的指标 |

其中containerd-shim-kata-v2是运行时主力:它基于仓库内的 virtcontainers 包实现,该包封装了沙箱(sandbox)、容器、网络端点、存储与各类 hypervisor(QEMU、Cloud Hypervisor、Firecracker、Stratovirt 等)的抽象,从而在 Linux 主机上创建"硬件虚拟化的 Linux 容器"。从 virtcontainers/README.md 与源码结构(如 sandbox.go、qemu.go、kata_agent.go)可以看出,一个 Kata 沙箱 = 一台轻量 VM + 内部运行的 kata-agent,而容器进程则在 guest 内核中运行。

兼容性方面,运行时同时兼容 OCI、CRI-O 与 Containerd 规范:

  • OCI 兼容:kata-runtime支持 OCI 运行时命令(create/start/exec等),OCI spec 版本可通过kata-runtime --version查看(main.go 中makeVersionString读取specs.Version);
  • CRI-O / Containerd 兼容:shimv2 运行时通过 gRPC 协议与容器管理器通信,因此可无缝对接 Docker(经 containerd)与 Kubernetes。

安装与架构导读

安装方面,README 指向了跨操作系统的安装指南(含 minikube、containerd 等部署方案)。整体架构细节可阅读架构总览目录(含 shim v2 架构说明 README.md 与历史演进)。要点如下:

  • shimv2 架构下,容器管理器(如 containerd)为每个 Pod 启动一个常驻的 shimv2 运行时进程,通过 Unix socket 上的 gRPC 通道进行生命周期调用,而不是像旧架构那样为每个容器反复拉起运行时二进制——这正是 shimv2 性能优势与状态处理一致性的来源;
  • 该架构天然支持"多个容器共享一个 VM",以满足 Pod 内多容器的场景。

configuration.toml:运行时配置体系

运行时使用 TOML 格式的configuration.toml作为唯一配置文件,文件按系统组成部分划分为多个 section,分别对应运行时自身([runtime])、guest 内的 agent([agent.kata])与 hypervisor([hypervisor.qemu]等),另有[factory](VM 模板与缓存)一节。每个选项都带有注释说明用途(见 configuration-qemu.toml.in)。

注意:配置文件中的初始值即为经过验证的默认配置,一般可直接使用;只有当你有特定性能、安全或设备需求时才需要修改。

仓库 config 目录下提供了面向不同 hypervisor 与场景的模板(.toml.in后缀,构建时由 Makefile 注入变量生成最终文件),例如:

  • configuration-qemu.toml.in(QEMU 通用)
  • configuration-clh.toml.in(Cloud Hypervisor)
  • configuration-fc.toml.in(Firecracker)
  • 以及面向机密计算(TDX/SNP/SE)、NVIDIA GPU、远程/rootless 等场景的专用模板。

配置文件的查找优先级

两个二进制查找配置文件的顺序不同,这是实际排障时最容易踩坑的地方:

containerd-shim-kata-v2(shimv2 运行时)按以下顺序查找:

  1. containerd 传给 shimv2 运行时的 options(即 containerd 配置中该 runtime 的runtime_options,可指定 config 路径);
  2. KATA_CONF_FILE环境变量——仅当它解析到某个随发行版内置的默认配置文件时才生效;
  3. 内置的默认配置路径。

kata-runtime(utility program)按以下顺序查找:

  1. --config(即--kata-config)命令行选项指定的路径;
  2. KATA_CONF_FILE环境变量;
  3. 内置的默认配置路径。

对两个二进制而言,规则都是"第一个存在的路径被使用"("the first path that exists will be used")。这一逻辑在源码中有直接对应:kata-runtime的beforeSubcommands调用katautils.LoadConfiguration(c.GlobalString("kata-config"), ...)(main.go),而LoadConfiguration内部会依次尝试各候选路径并做全路径解析(pkg/katautils/config.go)。

Drop-in 配置片段(config.d)

Kata 支持不改动主配置文件的 drop-in 覆盖机制,这一设计便于发行版、管理员分层管理配置:

  • 主配置文件解析完成后,运行时会在同一目录下查找名为config.d的子目录,按字母序加载其中每个文件,并同样按 TOML 解析;
  • 片段中的设置覆盖主配置文件及更早加载的片段中的同名设置;
  • 建议使用数字前缀约定顺序,如config.d/10-this、config.d/20-that;
  • 不存在的或空config.d目录不是错误(即不用片段完全合法);但一旦使用,片段必须是合法 TOML——任何解析错误(不可读文件、非法 TOML)都等同于主配置解析错误;
  • config.d只影响同目录的那个configuration.toml,且要解析片段,该位置必须存在一个有效的主配置文件(可以为空文件)。

源码佐证:decodeDropIns(pkg/katautils/config.go)通过filepath.Dir(mainConfigPath)定位主配置所在目录,拼接config.d后读取并按序解析;对应行为在 config_test.go 中有完整测试覆盖。

Hypervisor 专属配置与符号链接

Kata 支持多种 hypervisor,因此configuration.toml往往是一个指向 hypervisor 专属配置文件的符号链接。具体到每种 hypervisor 的差异(QEMU、Cloud Hypervisor、Firecracker、Stratovirt 的推荐参数)参见hypervisors 文档。这样同一份安装即可在切换 hypervisor 时只更换符号链接目标。

Stateless 系统与默认路径

Kata 面向 stateless system 设计,运行时内置了两个默认查找位置:

  • 默认位置:/usr/share/defaults/kata-containers/configuration.toml(标准系统);
  • 若/etc/kata-containers/configuration.toml存在,则优先使用/etc下这份。

源码中对应常量与优先级逻辑位于 config-settings.go.in(DEFAULTRUNTIMECONFIGURATION与DEFAULTSYSCONFRUNTIMECONFIGURATION),GetDefaultConfigFilePaths()返回按优先级排序的路径列表(config.go):/etc/kata-containers/configuration.toml在前,/usr/share/defaults/kata-containers/configuration.toml在后;TestGetDefaultConfigFilePaths(config_test.go)验证了该优先级。

查看实际查找顺序,运行:

$ kata-runtime --show-default-config-paths

该选项由 main.go 定义,handleShowConfig逐行打印全部候选路径后退出(main.go)。

运行时还会在日志中记录正在使用的配置文件的完整路径(见下文"日志"小节)。若想快速了解本机运行时环境——包括正在生效的配置文件路径、kernel/image/initrd 路径、hypervisor 版本、CPU/内存信息等,运行:

$ kata-runtime env

该子命令在 kata-env.go 中实现,输出包含RuntimeConfigInfo.Path(生效配置路径)、HypervisorInfo、KernelInfo、ImageInfo、SecurityInfo(rootless、seccomp、confidential guest 等)在内的结构化 JSON 信息,其格式版本由formatVersion常量管理。

configuration.toml 各配置段实战详解

以下以 configuration-qemu.toml.in 为例,逐段说明关键参数(所有选项均带注释,完整列表请直接阅读该文件):

[hypervisor.qemu]:虚拟化资源与设备

  • 基础路径:path(QEMU 二进制路径)、kernel(guest 内核 vmlinuz)、image(guest rootfs 镜像)、machine_type;firmware/firmware_volume(UEFI 固件,TDVF/OVMF 可拆分为 vars 与 code 两部分);rootfs_type支持ext4(默认)/xfs/erofs。
  • 安全与隔离:rootless = false(以非 root 用户运行 QEMU VMM)、enable_annotations(允许通过 Pod 注解覆盖的 hypervisor 配置项白名单)、valid_hypervisor_paths(合法的 hypervisor 路径 glob 列表,拒绝白名单外路径)、seccompsandbox(QEMU seccomp 沙箱,启用可能略降性能,建议同时开启bpf_jit_enable)。
  • CPU:default_vcpus(默认 vCPU 数,< 0表示取物理核数)、default_maxvcpus(最大可热插 vCPU 数,直接决定 VM 内存占用与 hotplug 能力,如设为 240 内存占用大,设为 8 则上限为 8;arm 平台 gicv2 中断控制器下建议设 8)、cpu_features(如pmu=off,vmx=off)、enable_vcpus_pinning(vCPU 线程固定到物理 CPU,需 vCPU 数等于沙箱 CPUSet 内 CPU 数)。
  • 内存:default_memory(默认内存 MiB)、memory_slots(内存热插槽位)、default_maxmemory、memory_offset(NVDIMM 设备地址空间,配合block_device_driver = "nvdimm")、enable_virtio_mem(virtio-mem 弹性内存,需配合echo 1 > /proc/sys/vm/overcommit_memory)、enable_hugepages(huge page 分配,会隐含内存预分配)、enable_mem_prealloc、reclaim_guest_freed_memory(balloon 回收 guest 释放内存)、enable_guest_swap(guest 内 swap)。
  • 存储与文件共享:shared_fs(virtio-fs(默认)/virtio-9p/virtio-fs-nydus/none)、virtio_fs_daemon与valid_virtio_fs_daemon_paths、virtio_fs_cache_size(DAX 缓存 MiB)、virtio_fs_cache(never/metadata/auto/always四档缓存模式)、block_device_driver(virtio-scsi/virtio-blk/nvdimm)、block_device_aio(threads/native/io_uring,io_uring 需内核 >5.1 且 QEMU >=5.0)、disable_block_device_use(禁止将容器 rootfs 块设备热插给 VM,改用 virtio-fs——慎改,某些 snapshotter 的存储设备不可热插)、enable_iothreads/indep_iothreads、enable_vhost_user_store与vhost_user_store_path。
  • 网络与直通设备:disable_vhost_net(默认 false,使用 vhost-net 换取网络性能)、rx_rate_limiter_max_rate/tx_rate_limiter_max_rate(HTB 令牌桶限速,0 表示不限)、hot_plug_vfio/cold_plug_vfio(no-port默认禁用;机密计算环境应使用 cold-plug)、pcie_root_port(大 BAR 设备如 NVIDIA GPU 需要)、enable_iommu/enable_iommu_platform、enable_numa与numa_mapping。
  • 调试与杂项:enable_debug、extra_monitor_socket(hmp/qmp/qmp-pretty,任何人访问该 socket 即可完全控制 QEMU,严禁用于生产)、entropy_source(默认/dev/urandom,/dev/random为阻塞源可能导致 VM 启动超时)、guest_memory_dump_path与guest_memory_dump_paging(guest panic 内存转储,供 crash/gdb 分析)、guest_hook_path(guest rootfs 内 OCI hook 目录,按{prestart,poststart,poststop}子目录存放)、msize_9p、disable_image_nvdimm(注意 nvdimm 与confidential_guest = true不兼容)、kernel_params(追加 guest 内核参数,优先级高于默认参数,误设可能阻止 VM 启动)。

[factory]:VM 模板与 VMCache

  • enable_template:VM templating(模板化),开启后新 VM 通过克隆共享同一份初始内核/initramfs/agent 内存(只读映射),显著加速容器创建并节省内存;要求使用initrd=(不支持image=)。
  • template_path:模板路径,默认/run/vc/vm/template。
  • vm_cache_number/vm_cache_endpoint:VMCache 机制——由 server 预先创建若干 VM 缓存,客户端(factory grpccache)通过 Unix socket 上的 gRPC(协议见protocols/cache/cache.proto)按需取用,进一步加速创建;默认 0(禁用),socket 默认/var/run/kata-containers/cache.sock。

[agent.kata]:guest 内 agent 行为

  • enable_debug、enable_tracing(OpenTelemetry trace span,开启后运行时会等待容器 shutdown,略微增加关闭时间)。
  • kernel_modules:逗号分隔的 guest 内核模块列表,如["e1000e InterruptThrottleRate=3000,3000,3000 EEE=1", "i915 enable_ppgtt=0"]——模块加载失败会导致容器无法启动(要求 guest 内有 modprobe 且模块满足内核/架构要求)。
  • debug_console_enabled:启用后可通过kata-runtime exec <sandbox-id>连接 guest OS 调试控制台。
  • dial_timeout(agent 连接拨号超时,默认 45 秒)、cdh_api_timeout(Confidential Data Hub API 超时,默认 50 秒)。

[runtime]:运行时自身行为

  • enable_debug、enable_tracing与jaeger_endpoint/jaeger_user/jaeger_password(Jaeger 链路追踪收集器)。
  • internetworking_model:macvtap/none/tcfilter,决定 VM 如何接入容器网络。
  • disable_guest_seccomp(默认 true:不把容器 seccomp profile 传给 agent 在 guest 内应用)、guest_selinux_label与disable_guest_selinux。
  • sandbox_cgroup_only:将所有 kata 进程放入每个沙箱单一 cgroup(host 上不创建容器 cgroup)。
  • static_sandbox_resource_mgmt:启动 VM 前静态确定沙箱大小、不做动态热插(适合不支持 CPU/内存热插的架构;Kubernetes >=1.23 与 containerd >=1.6 才提供 Pod 级 sizing 信息,CRI-O 暂不支持)。
  • vfio_mode:vfio(设备以/dev/vfio字符设备出现在容器中)或guest-kernel(由 VM 内核驱动接管设备)。
  • emptydir_mode/disable_guest_empty_dir:emptyDir 卷处理方式(shared-fs/block-encrypted/block-plain)。
  • experimental:实验特性列表(默认[]),实验特性可能破坏兼容性。
  • enable_pprof:开启后可通过 kata-monitor 对 shim v2 进程做 pprof 分析(默认 false)。
  • create_container_timeout:CreateContainer 请求超时(guest pull 场景含镜像拉取时间),实际生效值为它与 kubeletruntime-request-timeout的较小者。
  • dan_conf:Directly Attachable Network 配置目录(默认/run/kata-containers/dans)。
  • kubelet_root_dir、pod_resource_api_sock:kubelet PodResource API 相关,用于 kubelet 驱动的 VFIO 冷插(需cold_plug_vfio != no-port且启用 KubeletPodResourcesGet feature gate)。

日志:定位问题的第一手段

对于各系统组件的日志获取与解析,README 推荐使用仓库自带的kata-log-parser工具(src/tools/log-parser,支持 text/csv/json/toml/xml/yaml 多种展示格式)。

Kata containerd shimv2 的日志规则:

  • shimv2 运行时通过 containerd 记录日志,日志流向与 containerd 的日志目标一致;
  • 同时,shimv2始终以kata标识写入系统日志(syslog 或 journald);
  • 注意:Kata 日志要求启用 containerd 的 debug(见开发者指南)。

查看 shimv2 运行时日志:

$ sudo journalctl -t kata

运行时加载的配置文件路径也会出现在日志中(kata-runtime env亦可直接查看)。

调试、限制与进一步阅读

  • 调试:完整的调试方法(开启 debug、日志级别调整、常见问题定位)见开发者指南的调试章节。此外kata-runtime还提供kata-check(环境/依赖检查,如 KVM 可用性)、kata-exec(进入沙箱执行命令)、kata-metrics、kata-volume、kata-iptables、kata-policy等子命令(main.go),其中kata-policy对应 agent 策略(src/agent/policy)相关操作。
  • 限制:已知限制请查阅 docs/Limitations.md。
  • 指标监控:kata-monitor守护进程监听127.0.0.1:8090(默认),提供/metrics、/sandboxes、/agent-url及/debug/pprof/*等端点;支持--tls-cert-file/--tls-key-file启用 HTTPS,典型部署形态为 Kubernetes DaemonSet(参考 kata-monitor-daemonset.yml),完整指标设计见 Kata 2.0 指标设计。细节参见 cmd/kata-monitor/README.md。
  • 更多资料:架构细节见 docs/design/architecture,仓库其他包(device、oci、katautils、virtcontainers 等)的文档见 pkg 文档。

小结

Kata Containers 的 Go 运行时通过 shimv2 常驻进程 + virtcontainers 库,把"轻量 VM"包装成 OCI/CRI 兼容的容器运行时。掌握configuration.toml的查找优先级(shimv2 选项 →KATA_CONF_FILE→ 内置默认路径)、config.ddrop-in 覆盖机制、以及[hypervisor]/[factory]/[agent]/[runtime]四段配置的语义,就能在实际环境中自如地切换 hypervisor、调整资源策略、排查启动失败与性能问题。配合kata-runtime --show-default-config-paths、kata-runtime env与journalctl -t kata三个命令,你可以在几分钟内摸清任意主机的 Kata 运行时真实状态。

  • 云原生
  • 容器运行时

【免费下载链接】kata-containers

Kata Containers is an open source project and community working to build a standard implementation of lightweight Virtual Machines (VMs) that feel and perform like containers, but provide the workload isolation and security advantages of VMs. https://katacontainers.io/

项目地址:https://gitcode.com/gh_mirrors/ka/kata-containers
点击查看免费下载
上一篇:如何快速搭建第一个OPC UA服务器:node-opcua零基础入门教程
下一篇:UniFFI-rs 部署与发布指南:如何打包和分发你的跨平台组件

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询