云原生容器运行时【免费下载链接】kata-containersKata 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-types是 Kata Containers 各组件Runtime、Runtime-rs、Agent 等共用的 Rust crate负责集中定义跨组件共享的常量、数据类型与 TOML 配置结构。本文以该 crate 的 README 为骨架结合其源码实现系统讲解模块组成、配置加载与 drop-in 合并机制、注解键体系、超虚拟机能力位掩码以及 Cargo 特性开关帮助读者理解 Kata 配置从 TOML 文件到运行时的完整链路。一、kata-types 是什么Kata 组件间的共享类型中枢Kata Containers 的架构由多个独立组件构成负责创建 VM 的 RuntimeGo/ Runtime-rsRust、运行在 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 VMMREADME 中以表格形式列出了 crate 的主要模块下面按源码逐一展开模块说明源码位置annotationsCRI-containerd、CRI-O、dockershim 及第三方集成使用的注解键annotations/mod.rscapabilities超虚拟机能力位掩码块设备、多队列、文件系统共享等capabilities.rsconfigAgent、超虚拟机QEMU/CH/Firecracker/Dragonball 等与 Runtime 的配置结构config/mod.rscontainer容器相关常量与类型container.rscpuCPU 资源管理类型cpu.rsdevice设备相关定义device.rsfs文件系统常量fs.rshandlerHandler 相关类型handler.rsinitdata面向 TEE 数据注入的 Initdata 规范initdata.rsk8sKubernetes 专属路径与工具函数empty-dir、configmap、secret、projected 卷k8s.rsmachine_type机器类型定义machine_type.rsmount挂载点结构与校验mount.rsrootlessRootless VMM 支持工具rootless.rs此外源码中还包含 README 未单独列出的gpt_diskGPT 分区表磁盘布局与元数据生成和dmveritydm-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、OpenVMMAgent 配置、Runtime 配置共享挂载shared mount定义。3.1 TomlConfig三大配置区块顶层配置结构TomlConfig见 config/mod.rs只有三个字段pub struct TomlConfig { pub agent: HashMapString, Agent, // 按名字索引的 Agent 配置如 kata pub hypervisor: HashMapString, 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集中定义了全量默认值常量几类关键默认值如下AgentDEFAULT_AGENT_VSOCK_PORT 1024、日志端口1025、调试控制台端口1026、fd passthrough 监听端口1027、DEFAULT_AGENT_DIAL_TIMEOUT_MS 10RuntimeDEFAULT_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 MiBQEMU二进制路径/usr/bin/qemu-system-x86_64、默认内存128 MiB最小64 MiB、默认 vCPU 上限256、机器类型q35、默认 PCI 桥1上限5Cloud Hypervisor路径/usr/bin/cloud-hypervisor、默认 PCI 桥2FirecrackervCPU 上限32、最小内存128 MiBRemotePeer Podssocket 路径/run/peerpod/hypervisor.sock、超时600秒Dragonball内存128 MiB、插槽128、vCPU 上限256VM 模板DEFAULT_TEMPLATE_PATH /run/vc/vm/template。不同超虚拟机对默认值的补全逻辑并不相同因此config模块引入了**超虚拟机插件Hypervisor Plugin**机制hypervisor/mod.rspub 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-pciConfidential 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是否输出调试日志truelog_level日志级别trace/debug/info/warn/error/criticalinfoenable_tracing是否生成 OpenTelemetry trace spanfalsedebug_console_enabled是否启用调试控制台falseserver_portAgent vsock 服务端口1024log_portAgent 日志端口1025dial_timeout_ms连接拨号超时10 msreconnect_timeout_ms重连超时预算3000 mscdh_api_timeout_msConfidential Data Hub API 超时50000 mscreate_container_timeout创建容器请求超时TOML 中以秒书写反序列化时自动 ×1000 转毫秒30000 mshealth_check_request_timeout_ms健康检查请求超时90000 mskernel_modules需在 Guest 内核加载的模块列表modprobe加载空container_pipe_size容器管道大小0mem_agent内存 Agentmemcg 回收/内存压缩配置见下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默认tcfilterdisable_new_netns仅在与none配合时有效vfio_mode合法值为vfio、guest-kernelemptydir_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_confdirectly attachable network 配置目录默认/run/kata-containers/dans、shared_mounts、use_passfd_io、pod_resource_api_sockKubelet 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_msio.katacontainers.config.hypervisor.*超虚拟机配置覆盖引导kernel/image/initrd/firmware及其*_hash校验值、CPUdefault_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_mountsOCI 定位键io.katacontainers.pkg.oci.bundle_path、io.katacontainers.pkg.oci.container_type。该模块还提供Annotation包装结构从HashMapString, 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上限为 16MAX_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()5hybrid-vsockis_hybrid_vsock_supported()6Guest 内存热插拔探测接口is_mem_hotplug_probe_supported()7向 Guest 暴露块 discard/unmapis_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-dirconfigmap →kubernetes.io~configmapsecret →kubernetes.io~secretprojected →kubernetes.io~projecteddownward-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-opsafe-path启用平台相关的安全路径解析依赖同仓库的safe-pathcratedevicemapper启用 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.rsKubernetes 卷识别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-containersKata 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 仓库实战导读组件架构、硬件平台支持、配置体系与 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 官云原生容器运行时上一篇CANN/metadef融合算子属性解析下一篇CANN/ops-sparse 安全声明创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
