- 云原生
- 容器运行时
【免费下载链接】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/
kata-types是 Kata Containers 各组件(Runtime、Runtime-rs、Agent 等)共用的 Rust crate,负责集中定义跨组件共享的常量、数据类型与 TOML 配置结构。本文以该 crate 的 README 为骨架,结合其源码实现,系统讲解模块组成、配置加载与 drop-in 合并机制、注解键体系、超虚拟机能力位掩码以及 Cargo 特性开关,帮助读者理解 Kata 配置从 TOML 文件到运行时的完整链路。
一、kata-types 是什么:Kata 组件间的"共享类型中枢"
Kata Containers 的架构由多个独立组件构成:负责创建 VM 的 Runtime(Go)/ Runtime-rs(Rust)、运行在 Guest 内的 Agent、以及多种超虚拟机驱动(QEMU、Cloud Hypervisor、Firecracker、Dragonball、Remote 等)。这些组件之间需要交换大量信息——配置参数、注解键、能力标志、挂载结构、机器类型等等。如果每个组件各自定义一套,必然导致命名不一致、配置对不上、协议漂移。
kata-types正是为解决这一问题而存在的共享 crate。从其 Cargo.toml 的声明可以看出,它的定位就是 "Constants and data types shared by Kata Containers components",并被src/runtime-rs、src/agent、src/tools等多个上层模块依赖。它不仅包含 Kata Containers 项目自身的定义,还吸收并重定义了来自 Containerd(如io.containerd.*注解键)与 Kubelet(如 Kubernetes 特殊卷目录kubernetes.io~empty-dir等)的常量,从而为上层屏蔽掉各 CRI 实现的细节差异。
从 lib.rs 的模块声明可以看到,该 crate 编译时强制要求所有公开项都带文档注释(#![deny(missing_docs)]),这也是它被当作"协议层"来维护的一个佐证——每一处定义都有明确的语义说明。
二、模块全景:从注解到 rootless VMM
README 中以表格形式列出了 crate 的主要模块,下面按源码逐一展开:
| 模块 | 说明 | 源码位置 |
|---|---|---|
annotations | CRI-containerd、CRI-O、dockershim 及第三方集成使用的注解键 | annotations/mod.rs |
capabilities | 超虚拟机能力位掩码(块设备、多队列、文件系统共享等) | capabilities.rs |
config | Agent、超虚拟机(QEMU/CH/Firecracker/Dragonball 等)与 Runtime 的配置结构 | config/mod.rs |
container | 容器相关常量与类型 | container.rs |
cpu | CPU 资源管理类型 | cpu.rs |
device | 设备相关定义 | device.rs |
fs | 文件系统常量 | fs.rs |
handler | Handler 相关类型 | handler.rs |
initdata | 面向 TEE 数据注入的 Initdata 规范 | initdata.rs |
k8s | Kubernetes 专属路径与工具函数(empty-dir、configmap、secret、projected 卷) | k8s.rs |
machine_type | 机器类型定义 | machine_type.rs |
mount | 挂载点结构与校验 | mount.rs |
rootless | Rootless VMM 支持工具 | rootless.rs |
此外,源码中还包含 README 未单独列出的gpt_disk(GPT 分区表磁盘布局与元数据生成)和dmverity(dm-verity 相关类型,仅在启用devicemapper特性时编译),以及仅对 crate 内部可见的utils模块。
lib.rs还导出了两个实用的过程宏与一个工具函数:
resolve_path!:将字段值解析为规范化绝对路径(调用Path::canonicalize),并就地写回字段;validate_path!:仅校验路径可被规范化,不修改字段值;prefix_with_rootless_dir:当 VMM 以 rootless 模式运行时,为给定路径拼接 rootless 运行目录前缀;非 rootless 时原样返回。
三、配置子系统:TOML 加载、drop-in 合并与默认值
config模块是 kata-types 中体量最大、也最核心的部分。它支持:
- 基于 TOML 的配置加载;
- drop-in 配置文件(
config.d/目录下的碎片配置); - 超虚拟机专属配置(QEMU、Cloud Hypervisor、Firecracker、Dragonball、Remote、OpenVMM);
- Agent 配置、Runtime 配置;
- 共享挂载(shared mount)定义。
3.1 TomlConfig:三大配置区块
顶层配置结构TomlConfig(见 config/mod.rs)只有三个字段:
pub struct TomlConfig { pub agent: HashMap<String, Agent>, // 按名字索引的 Agent 配置,如 "kata" pub hypervisor: HashMap<String, Hypervisor>, // 按名字索引的超虚拟机配置,如 "qemu" pub runtime: Runtime, // 单个 Runtime 配置 }之所以使用HashMap而非固定结构,是为了支持在同一个配置文件中声明多套 agent/hypervisor 组合,再通过[runtime]段的agent_name与hypervisor_name选择启用哪一套。这与超虚拟机插件注册机制(见 3.4 节)配合,实现了"配置声明 + 插件生效"的解耦。
3.2 配置加载入口
TomlConfig提供了多个加载函数(config/mod.rs):
| 函数 | 行为 |
|---|---|
load_from_file(path) | 加载指定文件,随后执行adjust_config()补齐默认值 |
load_from_default() | 按内置默认路径列表逐个探测并加载 |
load_raw_from_file(path) | 不执行adjust_config()的原始加载 |
load(content) | 直接从字符串解析(仅适用于configuration.toml单文件场景,不处理config.d/碎片) |
默认配置文件路径列表定义在 default.rs 中,按优先级依次探测:
/etc/kata-containers/runtime-rs/configuration.toml /usr/share/defaults/kata-containers/runtime-rs/configuration.toml /opt/kata/share/defaults/kata-containers/runtime-rs/configuration.toml需要注意:这些是 runtime-rs 专属路径(与 Go 版 Runtime 的/etc/kata-containers/configuration.toml不同路径体系),文件头注释也明确说明 "The rust runtime specific paths"。
3.3 Drop-in 配置合并机制
这是 kata-types 配置子系统最有特色的能力之一。drop_in.rs实现了类 systemd 风格的 drop-in 配置:当基础配置文件configuration.toml所在目录下存在config.d/子目录时,其中的每个.toml碎片文件都会按文件名字典序依次合并进基础配置(drop_in.rs)。
合并算法基于toml::Value树递归合并(merge_tables/merge),语义为:
- 碎片中的标量值覆盖基础配置的同名键(如
[hypervisor.qemu] shared_fs = "none"覆盖基础值); - 碎片中的表(Table)递归合并到基础表;
- 基础配置中不存在的键直接插入;
- 碎片文件必须是普通文件或符号链接;
- 合并完成后才一次性
try_into转换为TomlConfig,因此最终类型校验(如枚举值合法性)发生在合并之后。
典型用法是发行版或运维方在不动基础配置文件的前提下,通过config.d/10-xxx.toml、config.d/20-xxx.toml这样的命名约定实现分层覆盖。drop_in.rs内的单元测试(test_dropins等)验证了覆盖、追加、类型变更三种合并场景。
3.4 默认值体系与超虚拟机插件
default.rs集中定义了全量默认值常量,几类关键默认值如下:
- Agent:
DEFAULT_AGENT_VSOCK_PORT = 1024、日志端口1025、调试控制台端口1026、fd passthrough 监听端口1027、DEFAULT_AGENT_DIAL_TIMEOUT_MS = 10; - Runtime:
DEFAULT_INTERNETWORKING_MODEL = "tcfilter"、DEFAULT_RUNTIME_NAME = "virt_container"; - 块设备:
DEFAULT_BLOCK_DEVICE_TYPE = "virtio-blk-pci"、AIO 默认io_uring、默认队列数1、默认队列深度128; - 共享文件系统:
DEFAULT_SHARED_FS_TYPE = "virtio-fs"、缓存模式never、DAX 缓存大小1024 MiB; - QEMU:二进制路径
/usr/bin/qemu-system-x86_64、默认内存128 MiB(最小64 MiB)、默认 vCPU 上限256、机器类型q35、默认 PCI 桥1(上限5); - Cloud Hypervisor:路径
/usr/bin/cloud-hypervisor、默认 PCI 桥2; - Firecracker:vCPU 上限
32、最小内存128 MiB; - Remote(Peer Pods):socket 路径
/run/peerpod/hypervisor.sock、超时600秒; - Dragonball:内存
128 MiB、插槽128、vCPU 上限256; - VM 模板:
DEFAULT_TEMPLATE_PATH = "/run/vc/vm/template"。
不同超虚拟机对默认值的补全逻辑并不相同,因此config模块引入了**超虚拟机插件(Hypervisor Plugin)**机制(hypervisor/mod.rs):
pub trait ConfigPlugin: Send + Sync { fn name(&self) -> &str; fn adjust_config(&self, conf: &mut TomlConfig) -> Result<()>; fn validate(&self, conf: &TomlConfig) -> Result<()>; fn get_min_memory(&self) -> u32; fn get_max_cpus(&self) -> u32; }各超虚拟机通过register_hypervisor_plugin(name, plugin)注册自己的插件。以 qemu.rs 为例:QEMU 插件在adjust_config中补齐二进制路径、rootfs 类型(ext4)、内核镜像、固件、机器类型、熵源(/dev/urandom)、默认内存等;在validate中则检查 QEMU 不支持virtio-blk-mmio、拒绝配置 jailer 路径,并针对机密计算场景强制要求virtio-blk-pci("Confidential guests must not use virtio-blk-mmio")。
hypervisor/mod.rs还定义了统一的块设备驱动常量:virtio-blk-pci、virtio-blk-mmio、virtio-blk-ccw、virtio-scsi、virtio-pmem,以及 dm-verity 内核参数解析器parse_kernel_verity_params(校验root_hash、salt、data_blocks、块大小须为 512 字节的整数倍)。
3.5 Agent 配置结构
agent.rs 定义了Agent与MemAgent两个结构。Agent的关键字段及默认值如下(均通过#[serde(default = ...)]指定):
| 字段 | 含义 | 默认值 |
|---|---|---|
enable_debug | 是否输出调试日志 | true |
log_level | 日志级别(trace/debug/info/warn/error/critical) | info |
enable_tracing | 是否生成 OpenTelemetry trace span | false |
debug_console_enabled | 是否启用调试控制台 | false |
server_port | Agent vsock 服务端口 | 1024 |
log_port | Agent 日志端口 | 1025 |
dial_timeout_ms | 连接拨号超时 | 10 ms |
reconnect_timeout_ms | 重连超时预算 | 3000 ms |
cdh_api_timeout_ms | Confidential Data Hub API 超时 | 50000 ms |
create_container_timeout | 创建容器请求超时(TOML 中以秒书写,反序列化时自动 ×1000 转毫秒) | 30000 ms |
health_check_request_timeout_ms | 健康检查请求超时 | 90000 ms |
kernel_modules | 需在 Guest 内核加载的模块列表(modprobe加载) | 空 |
container_pipe_size | 容器管道大小 | 0 |
mem_agent | 内存 Agent(memcg 回收/内存压缩)配置 | 见下 |
Agent::validate强制要求dial_timeout_ms不为 0,且reconnect_timeout_ms >= dial_timeout_ms。MemAgent则覆盖了 memcg 回收(memcg_*系列)与内存压缩(compact_*系列)两组参数,可通过mem_agent_enable别名启用。
3.6 Runtime 配置结构
runtime.rs 定义了Runtime,其中几个枚举型配置在validate时会被严格校验:
internetworking_model:合法值为macvtap、none、tcfilter、l3forwarding(默认tcfilter);disable_new_netns仅在与none配合时有效;vfio_mode:合法值为vfio、guest-kernel;emptydir_mode:合法值为shared-fs(默认)、block-encrypted、block-plain,对应三个导出常量EMPTYDIR_MODE_SHARED_FS、EMPTYDIR_MODE_BLOCK_ENCRYPTED、EMPTYDIR_MODE_BLOCK_PLAIN。
Runtime 还包含sandbox_cgroup_only、enable_vcpus_pinning、enable_tracing与 Jaeger 三件套(jaeger_endpoint/jaeger_user/jaeger_password)、enable_pprof、disable_guest_seccomp、keep_abnormal、dan_conf(directly attachable network 配置目录,默认/run/kata-containers/dans)、shared_mounts、use_passfd_io、pod_resource_api_sock(Kubelet PodResource API socket,用于冷插拔 VFIO)等字段。其adjust_config还会对sandbox_bind_mounts中的每条挂载做split_bind_mounts拆分并canonicalize规范化。
四、注解体系:Kata 与 CRI / Kubernetes 的桥接
annotations模块是整个注解体系的"字典"。所有 Kata 专用注解统一使用io.katacontainers.前缀(annotations/mod.rs),并分为几个子前缀:
io.katacontainers.config.agent.*:Agent 配置,如kernel_modules(分号分隔的内核模块列表)、enable_tracing、container_pipe_size、cdh_api_timeout_ms;io.katacontainers.config.hypervisor.*:超虚拟机配置,覆盖引导(kernel/image/initrd/firmware及其*_hash校验值)、CPU(default_vcpus/default_max_vcpus/cpu_features)、内存(default_memory/memory_slots/enable_hugepages/enable_virtio_mem/enable_guest_swap)、块设备(block_device_driver/block_device_cache_direct/block_device_num_queues等)、网络(rx_rate_limiter_max_rate/tx_rate_limiter_max_rate)、共享文件系统(shared_fs/virtio_fs_daemon/virtio_fs_cache/virtio_fs_extra_args)、安全(guest_hook_path/rootless)、远程 GPU 选择(default_gpus/default_gpu_model)等;io.katacontainers.config.runtime.*:Runtime 配置,如name/hypervisor_name/agent_name、disable_guest_seccomp、enable_pprof、experimental、internetworking_model、sandbox_cgroup_only、enable_vcpus_pinning、vfio_mode、shared_mounts、create_container_timeout、sandbox_bind_mounts;- OCI 定位键:
io.katacontainers.pkg.oci.bundle_path、io.katacontainers.pkg.oci.container_type。
该模块还提供Annotation包装结构,从HashMap<String, String>构造,支持类型化取值get_value::<T>()(自动FromStr解析)与便捷方法如get_sandbox_cpu_quota()、get_sandbox_mem()、get_crio_pod_linux_resources()等。其中 CRI-O 会把 Pod 资源总和编码为单个 JSON 注解,与 containerd 的逐键方式不同,Annotation专门提供了对应解析方法。
最关键的方法是update_config_by_annotation():它把注解逐条映射回TomlConfig的对应字段——例如注解指定了hypervisor_name/agent_name就切换启用的配置块;default_vcpus注解会先与插件声明的get_max_cpus()上限比对(超限即报错);pcie_root_port/pcie_switch_port上限为 16(MAX_PCIE_ROOT_PORT/MAX_PCIE_SWITCH_PORT);块设备扇区大小(512 与 4096 常见值)需通过validate_block_device_sector_size校验;virtio_fs_extra_args按逗号拆分为参数列表。这构成了"Pod 注解 → 运行时配置"的完整通路,且每条注解是否被接受还要经过hv.security_info.is_annotation_enabled(key)的白名单过滤。
五、超虚拟机能力位掩码:capabilities 模块
capabilities.rs 用bitmask-enum实现了一个 8 位的CapabilityBits位掩码,用一位布尔标志描述某超虚拟机是否支持某项能力:
| 位 | 能力 | 查询方法 |
|---|---|---|
| 1 | 块设备支持 | is_block_device_supported() |
| 2 | 块设备热插拔 | is_block_device_hotplug_supported() |
| 3 | 多队列 | is_multi_queue_supported() |
| 4 | 文件系统共享 | is_fs_sharing_supported() |
| 5 | hybrid-vsock | is_hybrid_vsock_supported() |
| 6 | Guest 内存热插拔探测接口 | is_mem_hotplug_probe_supported() |
| 7 | 向 Guest 暴露块 discard/unmap | is_block_device_discard_supported() |
| 8 | 网络设备热插拔 | is_network_device_hotplug_supported() |
Capabilities::new()得到全 0 的位掩码,通过set()(整体赋值)与add()(按位或追加)组合能力,上层即可据此决定使用哪种设备模型或通信方式(例如不支持 hybrid-vsock 时回退 legacy vsock)。模块内单元测试逐一验证了每个位标志的设置与查询行为。
六、Kubernetes 卷类型识别:k8s 模块
k8s.rs 提供一组针对 Kubernetes 特殊卷路径的识别函数。Kubernetes 在挂载特殊卷时,会在 Pod 卷路径中嵌入类型标记目录名:
- empty-dir →
kubernetes.io~empty-dir - configmap →
kubernetes.io~configmap - secret →
kubernetes.io~secret - projected →
kubernetes.io~projected - downward-api →
kubernetes.io~downward-api
对应is_empty_dir()、is_configmap()、is_secret()、is_projected()、is_downward_api()五个判断函数(底层统一走is_special_dir),上层据此决定对卷采用共享文件系统、块设备加密还是直接块设备挂载(即emptydir_mode的三种取值)。container_type()则按 CRI-containerd、CRI-O、dockershim 的容器类型注解(podsandbox/sandbox/container等)解析 OCI spec,返回统一的ContainerType。
七、Cargo 特性与平台支持
README 声明了两个特性,实际源码中还有第三个:
| 特性 | 作用 |
|---|---|
enable-vendor | 启用厂商定制扩展:通过#[path = "..._vendor.rs"]引入厂商专用的AgentVendor/RuntimeVendor/HypervisorVendor结构;未启用时为空实现(no-op) |
safe-path | 启用平台相关的安全路径解析,依赖同仓库的safe-pathcrate |
devicemapper | 启用 dm-verity 相关类型(dmverity模块),并引入devicemapper与tokio依赖 |
平台支持方面,README 明确标注Linux 为完全支持平台;macOS 仅在依赖层面添加了sysctl依赖(从 Cargo.toml 的目标平台依赖节可见)。非 Linux 平台仅保证 crate 可编译,Kata 的完整运行能力仍以 Linux 为准。
八、测试与验证
kata-types 的可靠性由多层测试保障:
- 单元测试:散布在各模块内部,如
capabilities.rs的位掩码测试、runtime.rs的非法配置/枚举校验测试(test_invalid_config、test_valid_emptydir_mode等)、drop_in.rs的合并语义测试; - 集成测试:tests/test_config.rs 中的
test_change_config_annotation演示了完整链路——先QemuConfig::new().register()注册插件,再TomlConfig::load()加载 texture/configuration-anno-0.toml,随后构造包含各类注解键的 HashMap,验证注解如何改写运行时配置;test_get_agent_kernel_params则验证了 Agent 调试、追踪、容器管道大小、调试控制台端口(默认 1026)等配置如何被翻译为内核参数键值对。
这些测试同时也为上层开发者提供了"如何正确使用 kata-types API"的范例。
九、小结与延伸阅读
kata-types虽然是一个库级 crate,却是 Kata Containers 组件间约定一致性的基石:常量与类型定义(注解键、能力位、机器类型、卷类型)、配置结构与加载(TOML + drop-in 合并 + 默认值 + 插件调整/校验)、注解驱动配置覆写(update_config_by_annotation)三大能力共同支撑起 Kata 灵活而严格的配置体系。理解它,就能顺藤摸瓜理解runtime-rs中configuration-*.toml.in模板的字段来源,以及 Pod 注解最终如何影响 VM 的启动参数。
相关资源:
- crate 说明文档:src/libs/kata-types/README.md
- 顶层模块与宏:src/libs/kata-types/src/lib.rs
- 配置核心:src/libs/kata-types/src/config/mod.rs、src/libs/kata-types/src/config/drop_in.rs、src/libs/kata-types/src/config/default.rs
- 注解字典:src/libs/kata-types/src/annotations/mod.rs
- 能力位掩码:src/libs/kata-types/src/capabilities.rs
- Kubernetes 卷识别:src/libs/kata-types/src/k8s.rs
- 集成测试与测试样例配置:src/libs/kata-types/tests/test_config.rs、src/libs/kata-types/tests/texture/configuration-anno-0.toml
- 依赖此 crate 的上层工程:src/runtime-rs/Cargo.toml、src/agent/Cargo.toml
- 云原生
- 容器运行时
【免费下载链接】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/
相关推荐
Kata Containers 仓库实战导读:组件架构、硬件平台支持、配置体系与 Kata 快速上手
Kata Containers 仓库实战导读:组件架构、硬件平台支持、配置体系与 Kata 快速上手 Kata Containers 是一个以“像容器一样易用、
云原生容器运行时Vector 如何用 tag_cardinality_limit 转换器限制指标标签基数防止标签爆炸
Vector 如何用 tag_cardinality_limit 转换器限制指标标签基数防止标签爆炸 指标标签基数失控是监控管道的常见事故:开发者不小心给指标加
云原生容器运行时Kata Containers 深度解析:containerd Shim 架构、隔离边界与 Kata 运行时实战配置
Kata Containers 深度解析:containerd Shim 架构、隔离边界与 Kata 运行时实战配置 本篇以 Kata Containers 官
云原生容器运行时
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考