- 云原生
- 容器运行时
【免费下载链接】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 通过 Pod 注解(annotation)机制,让用户可以在每个 Pod 的规范(spec)中按需声明 Kata 专属配置,从而实现"同一个集群、不同 Pod 各用各的虚拟化参数"。本文以 docs/pod-annotations.md 为骨架,完整梳理全局、运行时、Agent、Hypervisor、容器资源五类注解的键名与取值约束,讲解 containerd 的透传配置方式与受限注解(Restricted Annotations)的安全校验机制,并结合 annotations.go、pkg/oci/utils.go 与 agent/src/rpc.rs 等源码,说明一条注解从 OCI spec 解析到 guest 内核生效的完整链路。读完本文,你将能够为特定 Pod 注入内核模块、开关 guest seccomp、调整 Hypervisor 资产路径等,而无需修改全局configuration.toml。
一、Kata Pod 注解机制概述
Kata Containers 给予用户在每个 Pod 级别自由定制的能力:在 Pod 规范中设置一系列 Kata 专属注解即可。所有 Kata 注解共用io.katacontainers.*前缀,具体键名在源码中统一定义于 src/runtime/virtcontainers/pkg/annotations/annotations.go,其前缀常量如下:
kataAnnotationsPrefix = "io.katacontainers." kataConfAnnotationsPrefix = kataAnnotationsPrefix + "config." kataAnnotHypervisorPrefix = kataConfAnnotationsPrefix + "hypervisor." kataAnnotContainerPrefix = kataAnnotationsPrefix + "container."可以看出,绝大多数配置类注解位于io.katacontainers.config.*命名空间下,按runtime、agent、hypervisor等维度分组,与配置文件configuration.toml中的配置项一一对应。
受限注解(Restricted Annotations):部分注解可能被配置文件出于安全原因限制(restricted),尤其是那些可能导致运行时在宿主机上执行程序的注解。这类注解在下文表格中以(R)标记。所谓限制,是指配置文件中预先指定了可接受的值(通常是 shell 通配模式,见下文"受限注解"一节)。
二、Kata 配置注解分类全表
Kata 的配置注解分为若干类,下文逐一列出完整键名、值类型与语义说明。所有表均继承自官方文档,并补充了源码层面的印证。
2.1 全局选项(Global Options)
| Key | Value Type | Comments |
|---|---|---|
io.katacontainers.pkg.oci.bundle_path | string | OCI bundle 路径 |
io.katacontainers.pkg.oci.container_type | string | OCI 容器类型。仅接受pod_container和pod_sandbox |
这两个键由运行时(shim)内部使用,用于标记沙箱与容器,通常不面向最终用户手工设置。其常量定义见 annotations.go 中的BundlePathKey与ContainerTypeKey。
2.2 运行时选项(Runtime Options)
| Key | Value Type | Comments |
|---|---|---|
io.katacontainers.config.runtime.experimental | boolean | 是否启用实验性特性(experimental features)。值的解析在 pkg/oci/utils.go 中进行:按空格拆分特性名,逐一查表,遇到未注册的特性会报错Unsupported experimental feature |
io.katacontainers.config.runtime.disable_guest_seccomp | boolean | 是否在 guest 内部应用seccomp。置为false即启用 guest seccomp 以获得更强隔离(代价是少量性能开销) |
io.katacontainers.config.runtime.disable_new_netns | boolean | 是否为 hypervisor 进程创建新的 netns。解析后写入NetworkConfig.DisableNewNetwork(见 pkg/oci/utils.go) |
io.katacontainers.config.runtime.internetworking_model | string | 决定 VM 如何接入容器网络接口。合法取值:macvtap、tcfilter、l3forwarding(仅 runtime-rs 支持,实验性)和none。非法值会在解析时报Unknown network model specified in annotation |
io.katacontainers.config.runtime.sandbox_cgroup_only | boolean | 决定 Kata 进程是否仅由 sandbox cgroup 管理 |
io.katacontainers.config.runtime.enable_pprof | boolean | 为containerd-shim-kata-v2进程启用 Golangpprof,便于性能剖析与问题排查 |
io.katacontainers.config.runtime.create_container_timeout | uint64 | 创建容器超时时间,单位为秒,默认60 |
io.katacontainers.config.runtime.experimental_force_guest_pull | boolean | 强制运行时在 guest VM 内拉取镜像,默认false。属实验性特性,未来可能移除 |
2.3 Agent 选项(Agent Options)
| Key | Value Type | Comments |
|---|---|---|
io.katacontainers.config.agent.enable_tracing | boolean | 为 agent 启用 tracing(与运行时 tracing 配套,详见 docs/tracing.md) |
io.katacontainers.config.agent.container_pipe_size | uint32 | 指定为容器创建的 std(in/out) 管道大小。解析时经setUint转为uint32写入AgentConfig.ContainerPipeSize(见 pkg/oci/utils.go) |
io.katacontainers.config.agent.kernel_modules | string | 需要在 guest 内核中加载的内核模块及参数列表,以分号分隔;每个元素第一个词为模块名,其余为参数。guest 内使用modprobe(8) 加载。例如:e1000e InterruptThrottleRate=3000,3000,3000 EEE=1; i915 enable_ppgtt=0 |
io.katacontainers.config.agent.cdh_api_timeout | uint32 | Go 运行时中 Confidential Data Hub(CDH)API 服务的超时时间(秒),默认50 |
io.katacontainers.config.agent.cdh_api_timeout_ms | uint32 | runtime-rs 中 Confidential Data Hub(CDH)API 服务的超时时间(毫秒),默认50000 |
2.4 Hypervisor 选项(Hypervisor Options)
Hypervisor 注解必须显式列入Kata 运行时配置的白名单(enable_annotations)后才会生效。示例(配置文件中的写法):
# List of valid annotation names for the hypervisor enable_annotations = ["enable_iommu", "kernel_params"]安全警告:除非你完全信任所有注解来源,否则不要将
virtio_fs_extra_args加入enable_annotations。向virtiofsd传递任意参数可能被滥用,造成恶意的宿主机侧行为。
完整 Hypervisor 注解表如下((R)表示受限注解):
| Key | Value Type | Comments |
|---|---|---|
io.katacontainers.config.hypervisor.asset_hash_type | string | 资产(asset)校验使用的哈希类型,默认sha512。对应的SHA512常量见 annotations.go |
io.katacontainers.config.hypervisor.block_device_cache_direct | boolean | 是否启用O_DIRECT(绕过宿主机 page cache) |
io.katacontainers.config.hypervisor.block_device_cache_noflush | boolean | 是否忽略设备的 flush 请求 |
io.katacontainers.config.hypervisor.block_device_cache_set | boolean | 是否将 cache 相关选项应用到块设备 |
io.katacontainers.config.hypervisor.block_device_driver | string | 块设备驱动,合法值:virtio-blk、virtio-scsi、nvdimm |
io.katacontainers.config.hypervisor.blk_logical_sector_size | uint32 | 块设备向 guest 报告的逻辑扇区大小(字节)。0表示采用 hypervisor 默认值;必须是 512 到 65536 之间、2 的幂 |
io.katacontainers.config.hypervisor.blk_physical_sector_size | uint32 | 块设备向 guest 报告的物理扇区大小(字节)。0表示 hypervisor 默认;必须是 512 到 65536 之间、2 的幂 |
io.katacontainers.config.hypervisor.cpu_features | string | 传递给 CPU(QEMU)的特性列表,逗号分隔 |
io.katacontainers.config.hypervisor.default_max_vcpus | uint32 | hypervisor 为 VM 分配的最大 vCPU 数 |
io.katacontainers.config.hypervisor.default_memory | uint32 | hypervisor 为 VM 分配的内存,单位MiB |
io.katacontainers.config.hypervisor.default_vcpus | float32 | hypervisor 为 VM 分配的默认 vCPU 数 |
io.katacontainers.config.hypervisor.disable_block_device_use | boolean | 禁止将宿主机块设备热插拔到 guest VM 用作容器 rootfs(仅 Go 运行时) |
io.katacontainers.config.hypervisor.disable_image_nvdimm | boolean | 是否使用nvdimm设备作为 guest 的 rootfs(QEMU) |
io.katacontainers.config.hypervisor.disable_vhost_net | boolean | 宿主机上是否没有vhost-net |
io.katacontainers.config.hypervisor.enable_hugepages | boolean | 内存是否从 huge pages 预分配 |
io.katacontainers.config.hypervisor.enable_iommu_platform | boolean | 在 CCW 设备上启用iommu(QEMU s390x) |
io.katacontainers.config.hypervisor.enable_iommu | boolean | 在 Q35 上启用iommu(QEMU x86_64) |
io.katacontainers.config.hypervisor.enable_iothreads | boolean | 是否在独立线程中处理 IO。目前支持 virtio-scsi驱动 |
io.katacontainers.config.hypervisor.enable_mem_prealloc | boolean | hypervisor 为nvdimm设备使用的内存空间是否预分配 |
io.katacontainers.config.hypervisor.enable_vhost_user_store | boolean | 启用 vhost-user 存储设备(QEMU) |
io.katacontainers.config.hypervisor.vhost_user_reconnect_timeout_sec | string | vhost-user socket 重连超时时间(QEMU) |
io.katacontainers.config.hypervisor.enable_virtio_mem | boolean | 启用 virtio-mem(QEMU) |
io.katacontainers.config.hypervisor.entropy_source(R) | string | 宿主机熵源路径(/dev/random、/dev/urandom或真实硬件 RNG 设备) |
io.katacontainers.config.hypervisor.firmware_hash | string | 容器固件 SHA-512 哈希值 |
io.katacontainers.config.hypervisor.firmware | string | 运行容器 VM 的 guest 固件 |
io.katacontainers.config.hypervisor.firmware_volume_hash | string | 容器固件卷 SHA-512 哈希值 |
io.katacontainers.config.hypervisor.firmware_volume | string | 传递给容器 VM 的 guest 固件卷 |
io.katacontainers.config.hypervisor.guest_hook_path | string | VM 内用于 drop-in hooks 的路径 |
io.katacontainers.config.hypervisor.cold_plug_vfio | string | VFIO cold-plug 模式;合法值:no-port、bridge-port(仅 Go 运行时)、root-port、switch-port(仅 Go 运行时) |
io.katacontainers.config.hypervisor.hot_plug_vfio | string | VFIO hot-plug 模式(仅 Go 运行时);合法值:no-port、bridge-port、root-port、switch-port |
io.katacontainers.config.hypervisor.hypervisor_hash | string | 容器 hypervisor 二进制 SHA-512 哈希值 |
io.katacontainers.config.hypervisor.image_hash | string | 容器 guest 镜像 SHA-512 哈希值 |
io.katacontainers.config.hypervisor.image | string | 在容器 VM 中运行的 guest 镜像 |
io.katacontainers.config.hypervisor.initrd_hash | string | 容器 guest initrd SHA-512 哈希值 |
io.katacontainers.config.hypervisor.initrd | string | 在容器 VM 中运行的 guest initrd 镜像 |
io.katacontainers.config.hypervisor.jailer_hash | string | 容器 jailer SHA-512 哈希值 |
io.katacontainers.config.hypervisor.jailer_path(R) | string | 约束容器 VM 的 jailer(Firecracker) |
io.katacontainers.config.hypervisor.kernel_hash | string | 容器内核镜像 SHA-512 哈希值 |
io.katacontainers.config.hypervisor.kernel_params | string | 附加的 guest 内核参数 |
io.katacontainers.config.hypervisor.kernel | string | 用于启动容器 VM 的内核 |
io.katacontainers.config.hypervisor.machine_accelerators | string | hypervisor 的机器级加速器 |
io.katacontainers.config.hypervisor.machine_type | string | hypervisor 模拟的机器类型 |
io.katacontainers.config.hypervisor.memory_offset | uint64 | hypervisor 为nvdimm设备使用的内存空间偏移 |
io.katacontainers.config.hypervisor.memory_slots | uint32 | 分配给 VM 的内存槽位 |
io.katacontainers.config.hypervisor.msize_9p | uint32 | 9p 共享的msize |
io.katacontainers.config.hypervisor.path | string | 运行容器 VM 的 hypervisor。路径必须被运行时配置中的valid_hypervisor_paths白名单收录 |
io.katacontainers.config.hypervisor.pcie_root_port | (无类型标注) | PCIe Root Port 设备数量,用于热插拔 PCIe 设备(QEMU) |
io.katacontainers.config.hypervisor.shared_fs | string | 共享文件系统类型,virtio-9p或virtio-fs |
io.katacontainers.config.hypervisor.use_vsock | boolean | 是否使用vsock与 agent 通信 |
io.katacontainers.config.hypervisor.vhost_user_store_path(R) | string | vhost-user 设备相关目录、socket 与设备节点的存放路径(QEMU) |
io.katacontainers.config.hypervisor.virtio_fs_cache_size | uint32 | virtio-fs DAX cache 大小,单位MiB |
io.katacontainers.config.hypervisor.virtio_fs_cache | string | virtio-fs 缓存模式,合法值:always、auto、never |
io.katacontainers.config.hypervisor.virtio_fs_daemon | string | virtio-fsvhost-userdaemon 路径 |
io.katacontainers.config.hypervisor.virtio_fs_extra_args | string | 传递给virtiofsdaemon 的额外参数。安全警告:启用此注解可能被滥用,造成恶意的宿主机侧行为 |
io.katacontainers.config.hypervisor.enable_guest_swap | boolean | 在 guest 内启用 swap |
io.katacontainers.config.hypervisor.use_legacy_serial | boolean | 为 guest 控制台使用 legacy serial 设备(QEMU) |
io.katacontainers.config.hypervisor.default_gpus | uint32 | VM 所需的最少 GPU 数量。仅由 remote hypervisor 用于实例选择 |
io.katacontainers.config.hypervisor.default_gpu_model | string | VM 所需的 GPU 型号。仅由 remote hypervisor 用于实例选择 |
io.katacontainers.config.hypervisor.block_device_num_queues | usize | 块设备使用的队列数(仅 runtime-rs) |
io.katacontainers.config.hypervisor.block_device_queue_size | uint32 | 块设备使用的队列大小(仅 runtime-rs) |
补充说明:资产类注解(*_hash与对应的kernel、image、initrd、hypervisor、jailer、firmware、firmware_volume)允许用户为单个 Pod指定内核、镜像、固件等资产及其 SHA-512 哈希,实现细粒度的启动资产定制与完整性校验。这些常量均定义于 annotations.go。
2.5 容器选项(Container Options)
| Key | Value Type | Comments |
|---|---|---|
io.katacontainers.container.resource.swappiness" | uint64 | 指定Resources.Memory.Swappiness(内存交换倾向) |
io.katacontainers.container.resource.swap_in_bytes" | uint64 | 指定Resources.Memory.Swap(交换空间大小) |
注意:容器级注解的前缀是io.katacontainers.container.resource.(无config段),与其余配置注解不同,其常量前缀定义在 annotations.go。
三、containerd 配置:把注解透传给 Kata
对于 containerd,从1.3.0版本起,Pod spec 中指定的注解会传递给 Kata。此外还需要在 containerd 配置文件中额外提供pod_annotations与container_annotations两个字段。它们是可传给 Kata 作为 OCI 注解的注解列表,支持 Golang 匹配模式(golang match patterns)。由于 Kata 支持的注解遵循io.katacontainers.*模式,下面的配置即可将注解从 containerd 传给 Kata:
$ cat /etc/containerd/config .... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata] runtime_type = "io.containerd.kata.v2" pod_annotations = ["io.katacontainers.*"] container_annotations = ["io.katacontainers.*"] ....pod_annotations控制Pod 级别注解的透传(对应 sandbox 配置);container_annotations控制容器级别注解的透传;- 通配模式
io.katacontainers.*可一次匹配所有 Kata 注解,你也可以改为更精确的模式(例如只放行io.katacontainers.config.agent.kernel_modules)以缩小暴露面。
完整的 containerd + Kata 集成步骤可参考仓库内文档 docs/how-to/containerd-kata.md 与 docs/install/container-manager/containerd/README.md。使用 CRI-O 时的注解透传方式可参见 docs/how-to/use-k8s-with-crio-and-kata.md。
四、实战示例:按 Pod 注入内核模块与启用 guest seccomp
正如上文所述,并非所有容器都需要相同的内核模块,因此把模块列表写死在全局配置文件中会很不灵活。注解恰恰提供了按 Pod 定制配置的能力:
- 内核模块与参数列表通过注解
io.katacontainers.config.agent.kernel_modules设置,以分号分隔;每个元素的第一个词视为模块名,其余视为其参数; - 用户可能希望启用 guest
seccomp以获得更好的隔离(以少量性能开销为代价),此时可使用io.katacontainers.config.runtime.disable_guest_seccomp注解,将其置为false。
下面示例创建两个 Pod:e1000e与i915内核模块只注入到pod1;guestseccomp只在pod2中启用:
apiVersion: v1 kind: Pod metadata: name: pod1 annotations: io.katacontainers.config.agent.kernel_modules: "e1000e EEE=1; i915" spec: runtimeClassName: kata containers: - name: c1 image: busybox command: - sh stdin: true tty: true --- apiVersion: v1 kind: Pod metadata: name: pod2 annotations: io.katacontainers.config.runtime.disable_guest_seccomp: "false" spec: runtimeClassName: kata containers: - name: c2 image: busybox command: - sh stdin: true tty: true要点:
runtimeClassName: kata将 Pod 调度到 Kata 运行时类;pod1的注解会被 containerd 透传为 OCI annotation,runtime 侧在 pkg/oci/utils.go 中按;(常量KernelModulesSeparator,定义于 pkg/oci/utils.go)切分,写入AgentConfig.KernelModules;pod2的disable_guest_seccomp: "false"表示不关闭guest seccomp,即显式启用它。
4.1 从注解到 guest 内核:底层调用链
一条kernel_modules注解的完整生效路径如下(可从源码逐一印证):
- runtime 解析:pkg/oci/utils.go 的
addAgentConfigOverrides读取 OCI 注解中的KernelModules,按分号切分后存入SandboxConfig.AgentConfig.KernelModules; - agent 下发:runtime 通过 ttrpc 将
kernel_modules列表随 sandbox 创建请求发送给 guest 内 agent; - guest 加载:src/agent/src/rpc.rs 中,agent 在创建 sandbox 时遍历
req.kernel_modules,逐个调用load_kernel_module(m)(内部对应modprobe语义)完成 guest 内核模块加载。
因此,注解与配置文件中的kernel_modules项(见 src/runtime/pkg/katautils/config.go)作用等价,但注解方式粒度更细、无需改全局配置。
五、受限注解(Restricted Annotations)机制
部分注解是受限的,意味着配置文件指定其可接受值。目前只有 hypervisor 注解是受限的,出于安全原因——其意图是控制 Kata Containers 运行时将代表你启动哪些二进制。
配置文件会同时校验注解的名称(name)与值(value):
- 可接受的注解名称由配置文件中的
enable_annotations条目定义; - 可接受的值由额外的配置条目提供。由于大多数受限注解用于控制运行时可以执行的二进制,合法值通常以 shell 模式给出,按
glob(3)定义。
下表给出每个受限注解对应的配置条目:
| Key | Config file entry | Comments |
|---|---|---|
entropy_source | valid_entropy_sources | 合法熵源,如/dev/random |
jailer_path | valid_jailer_paths | 约束容器 VM 的 jailer(Firecracker)的合法路径 |
path | valid_hypervisor_paths | 运行容器 VM 的合法 hypervisor 路径 |
vhost_user_store_path | valid_vhost_user_store_paths | vhost-user 相关文件的合法路径 |
virtio_fs_daemon | valid_virtio_fs_daemon_paths | virtiofsddaemon 的合法路径 |
这些配置项在源码中的对应字段可见于 src/runtime/pkg/katautils/config.go(HypervisorPathList、JailerPathList、VirtioFSDaemonList、VhostUserStorePathList、EntropySourceList),并随 Hypervisor 配置一起被持久化(见 src/runtime/virtcontainers/persist/api/config.go 的EnableAnnotations字段)。
5.1 默认白名单情况
不同发布配置对enable_annotations的默认值不同,可直接在仓库配置模板中查看:
- 常规 QEMU/CLH/FC 配置使用
@DEFENABLEANNOTATIONS@占位符(例如 configuration-qemu.toml.in、configuration-clh.toml.in); - CoCo(Confidential Containers)相关配置使用
@DEFENABLEANNOTATIONS_COCO@(例如 configuration-qemu-coco-dev.toml.in); - remote 配置显式列出了白名单,如 configuration-remote.toml.in 中的
enable_annotations = ["machine_type", "default_memory", "default_vcpus", "image", "default_gpus", "gpu_model", "cc_init_data"]; - runtime-rs 各配置模板同样包含该机制,例如 configuration-clh-runtime-rs.toml.in 中注释以
io.katacontainers.config.hypervisor.path为例说明注解名写法。
若某注解键不在enable_annotations白名单内,即使 Pod 中写了该注解也会被运行时忽略或拒绝,这正是对宿主机二进制执行面的安全收敛手段。
六、runtime-rs 与 Go 运行时的差异提示
仓库同时维护 Go 运行时(src/runtime)与 Rust 运行时 runtime-rs(src/runtime-rs),注解机制在两套实现中大体一致,但存在少量差异,使用前请留意:
internetworking_model的l3forwarding取值仅 runtime-rs 支持且为实验性;disable_block_device_use仅 Go 运行时支持;cold_plug_vfio/hot_plug_vfio的部分取值(bridge-port、switch-port)仅 Go 运行时支持;block_device_num_queues、block_device_queue_size仅 runtime-rs 支持;cdh_api_timeout(秒)对应 Go 运行时,cdh_api_timeout_ms(毫秒)对应 runtime-rs,默认分别为50与50000。
七、使用建议与安全实践
- 优先使用注解做细粒度定制:内核模块、vCPU/内存、块设备缓存策略、共享文件系统等都可以按 Pod 声明,避免全局配置"一刀切";
- 严格收敛
enable_annotations:仅放行确有必要的键,尤其绝不要开放virtio_fs_extra_args;对entropy_source、path、jailer_path、vhost_user_store_path、virtio_fs_daemon等可执行二进制相关注解,务必配合valid_*条目用glob(3)模式收紧到可预期路径; - 资产哈希防篡改:为
kernel、image、initrd、firmware等资产同时声明对应*_hash(默认sha512),可在启动前校验资产完整性; - 确认 CRI 透传配置:使用 containerd 时需在 CRI 插件下配置
pod_annotations/container_annotations为["io.katacontainers.*"](或更窄的模式),否则 Pod 注解不会到达 Kata; - 运行时兼容性:生产环境请确认所用的运行时实现(Go runtime 或 runtime-rs)对目标注解的支持情况,避免误用仅单侧支持的键。
参考与延伸阅读
- 注解键名与语义权威定义:src/runtime/virtcontainers/pkg/annotations/annotations.go
- OCI 注解解析实现:src/runtime/pkg/oci/utils.go
- 配置白名单字段:src/runtime/pkg/katautils/config.go
- guest 内核模块加载:src/agent/src/rpc.rs
- 配置模板中的
enable_annotations:src/runtime/config/configuration-qemu.toml.in、src/runtime/config/configuration-remote.toml.in - 相关部署指南:docs/how-to/containerd-kata.md、docs/how-to/use-k8s-with-crio-and-kata.md、docs/runtime-configuration.md
- 云原生
- 容器运行时
【免费下载链接】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 实战:使用 crictl 通过 CRI 接口在 Kata 运行时中运行与调试 Pod
Kata Containers 实战:使用 crictl 通过 CRI 接口在 Kata 运行时中运行与调试 Pod 本文基于 Kata Containers
云原生容器运行时Cilium Pod Annotations 详解:为 Pod 指定 MAC 地址与禁用源 IP 校验
Cilium Pod Annotations 详解:为 Pod 指定 MAC 地址与禁用源 IP 校验 Cilium 通过 Pod 级 Annotation 提
后端前端AI 技能AI 插件搜索引擎Prowler Kubernetes Pod安全策略:容器运行时安全
Prowler Kubernetes Pod安全策略:容器运行时安全 引言:容器安全的隐形威胁 你是否知道70%的容器安全问题源于配置不当而非镜像本身?在Kub
网络安全应用安全合规审计风险控制云原生
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考