☰
Kata Containers Pod 注解(Pod Annotations)完全指南:逐 Pod 定制运行时、Hypervisor 与 Agent 行为
2026/9/25 2:12:59 网站建设 项目流程
  • 云原生
  • 容器运行时

【免费下载链接】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 通过 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)

KeyValue TypeComments
io.katacontainers.pkg.oci.bundle_pathstringOCI bundle 路径
io.katacontainers.pkg.oci.container_typestringOCI 容器类型。仅接受pod_container和pod_sandbox

这两个键由运行时(shim)内部使用,用于标记沙箱与容器,通常不面向最终用户手工设置。其常量定义见 annotations.go 中的BundlePathKey与ContainerTypeKey。

2.2 运行时选项(Runtime Options)

KeyValue TypeComments
io.katacontainers.config.runtime.experimentalboolean是否启用实验性特性(experimental features)。值的解析在 pkg/oci/utils.go 中进行:按空格拆分特性名,逐一查表,遇到未注册的特性会报错Unsupported experimental feature
io.katacontainers.config.runtime.disable_guest_seccompboolean是否在 guest 内部应用seccomp。置为false即启用 guest seccomp 以获得更强隔离(代价是少量性能开销)
io.katacontainers.config.runtime.disable_new_netnsboolean是否为 hypervisor 进程创建新的 netns。解析后写入NetworkConfig.DisableNewNetwork(见 pkg/oci/utils.go)
io.katacontainers.config.runtime.internetworking_modelstring决定 VM 如何接入容器网络接口。合法取值:macvtap、tcfilter、l3forwarding(仅 runtime-rs 支持,实验性)和none。非法值会在解析时报Unknown network model specified in annotation
io.katacontainers.config.runtime.sandbox_cgroup_onlyboolean决定 Kata 进程是否仅由 sandbox cgroup 管理
io.katacontainers.config.runtime.enable_pprofboolean为containerd-shim-kata-v2进程启用 Golangpprof,便于性能剖析与问题排查
io.katacontainers.config.runtime.create_container_timeoutuint64创建容器超时时间,单位为秒,默认60
io.katacontainers.config.runtime.experimental_force_guest_pullboolean强制运行时在 guest VM 内拉取镜像,默认false。属实验性特性,未来可能移除

2.3 Agent 选项(Agent Options)

KeyValue TypeComments
io.katacontainers.config.agent.enable_tracingboolean为 agent 启用 tracing(与运行时 tracing 配套,详见 docs/tracing.md)
io.katacontainers.config.agent.container_pipe_sizeuint32指定为容器创建的 std(in/out) 管道大小。解析时经setUint转为uint32写入AgentConfig.ContainerPipeSize(见 pkg/oci/utils.go)
io.katacontainers.config.agent.kernel_modulesstring需要在 guest 内核中加载的内核模块及参数列表,以分号分隔;每个元素第一个词为模块名,其余为参数。guest 内使用modprobe(8) 加载。例如:e1000e InterruptThrottleRate=3000,3000,3000 EEE=1; i915 enable_ppgtt=0
io.katacontainers.config.agent.cdh_api_timeoutuint32Go 运行时中 Confidential Data Hub(CDH)API 服务的超时时间(秒),默认50
io.katacontainers.config.agent.cdh_api_timeout_msuint32runtime-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)表示受限注解):

KeyValue TypeComments
io.katacontainers.config.hypervisor.asset_hash_typestring资产(asset)校验使用的哈希类型,默认sha512。对应的SHA512常量见 annotations.go
io.katacontainers.config.hypervisor.block_device_cache_directboolean是否启用O_DIRECT(绕过宿主机 page cache)
io.katacontainers.config.hypervisor.block_device_cache_noflushboolean是否忽略设备的 flush 请求
io.katacontainers.config.hypervisor.block_device_cache_setboolean是否将 cache 相关选项应用到块设备
io.katacontainers.config.hypervisor.block_device_driverstring块设备驱动,合法值:virtio-blk、virtio-scsi、nvdimm
io.katacontainers.config.hypervisor.blk_logical_sector_sizeuint32块设备向 guest 报告的逻辑扇区大小(字节)。0表示采用 hypervisor 默认值;必须是 512 到 65536 之间、2 的幂
io.katacontainers.config.hypervisor.blk_physical_sector_sizeuint32块设备向 guest 报告的物理扇区大小(字节)。0表示 hypervisor 默认;必须是 512 到 65536 之间、2 的幂
io.katacontainers.config.hypervisor.cpu_featuresstring传递给 CPU(QEMU)的特性列表,逗号分隔
io.katacontainers.config.hypervisor.default_max_vcpusuint32hypervisor 为 VM 分配的最大 vCPU 数
io.katacontainers.config.hypervisor.default_memoryuint32hypervisor 为 VM 分配的内存,单位MiB
io.katacontainers.config.hypervisor.default_vcpusfloat32hypervisor 为 VM 分配的默认 vCPU 数
io.katacontainers.config.hypervisor.disable_block_device_useboolean禁止将宿主机块设备热插拔到 guest VM 用作容器 rootfs(仅 Go 运行时)
io.katacontainers.config.hypervisor.disable_image_nvdimmboolean是否使用nvdimm设备作为 guest 的 rootfs(QEMU)
io.katacontainers.config.hypervisor.disable_vhost_netboolean宿主机上是否没有vhost-net
io.katacontainers.config.hypervisor.enable_hugepagesboolean内存是否从 huge pages 预分配
io.katacontainers.config.hypervisor.enable_iommu_platformboolean在 CCW 设备上启用iommu(QEMU s390x)
io.katacontainers.config.hypervisor.enable_iommuboolean在 Q35 上启用iommu(QEMU x86_64)
io.katacontainers.config.hypervisor.enable_iothreadsboolean是否在独立线程中处理 IO。目前支持 virtio-scsi驱动
io.katacontainers.config.hypervisor.enable_mem_preallocbooleanhypervisor 为nvdimm设备使用的内存空间是否预分配
io.katacontainers.config.hypervisor.enable_vhost_user_storeboolean启用 vhost-user 存储设备(QEMU)
io.katacontainers.config.hypervisor.vhost_user_reconnect_timeout_secstringvhost-user socket 重连超时时间(QEMU)
io.katacontainers.config.hypervisor.enable_virtio_memboolean启用 virtio-mem(QEMU)
io.katacontainers.config.hypervisor.entropy_source(R)string宿主机熵源路径(/dev/random、/dev/urandom或真实硬件 RNG 设备)
io.katacontainers.config.hypervisor.firmware_hashstring容器固件 SHA-512 哈希值
io.katacontainers.config.hypervisor.firmwarestring运行容器 VM 的 guest 固件
io.katacontainers.config.hypervisor.firmware_volume_hashstring容器固件卷 SHA-512 哈希值
io.katacontainers.config.hypervisor.firmware_volumestring传递给容器 VM 的 guest 固件卷
io.katacontainers.config.hypervisor.guest_hook_pathstringVM 内用于 drop-in hooks 的路径
io.katacontainers.config.hypervisor.cold_plug_vfiostringVFIO cold-plug 模式;合法值:no-port、bridge-port(仅 Go 运行时)、root-port、switch-port(仅 Go 运行时)
io.katacontainers.config.hypervisor.hot_plug_vfiostringVFIO hot-plug 模式(仅 Go 运行时);合法值:no-port、bridge-port、root-port、switch-port
io.katacontainers.config.hypervisor.hypervisor_hashstring容器 hypervisor 二进制 SHA-512 哈希值
io.katacontainers.config.hypervisor.image_hashstring容器 guest 镜像 SHA-512 哈希值
io.katacontainers.config.hypervisor.imagestring在容器 VM 中运行的 guest 镜像
io.katacontainers.config.hypervisor.initrd_hashstring容器 guest initrd SHA-512 哈希值
io.katacontainers.config.hypervisor.initrdstring在容器 VM 中运行的 guest initrd 镜像
io.katacontainers.config.hypervisor.jailer_hashstring容器 jailer SHA-512 哈希值
io.katacontainers.config.hypervisor.jailer_path(R)string约束容器 VM 的 jailer(Firecracker)
io.katacontainers.config.hypervisor.kernel_hashstring容器内核镜像 SHA-512 哈希值
io.katacontainers.config.hypervisor.kernel_paramsstring附加的 guest 内核参数
io.katacontainers.config.hypervisor.kernelstring用于启动容器 VM 的内核
io.katacontainers.config.hypervisor.machine_acceleratorsstringhypervisor 的机器级加速器
io.katacontainers.config.hypervisor.machine_typestringhypervisor 模拟的机器类型
io.katacontainers.config.hypervisor.memory_offsetuint64hypervisor 为nvdimm设备使用的内存空间偏移
io.katacontainers.config.hypervisor.memory_slotsuint32分配给 VM 的内存槽位
io.katacontainers.config.hypervisor.msize_9puint329p 共享的msize
io.katacontainers.config.hypervisor.pathstring运行容器 VM 的 hypervisor。路径必须被运行时配置中的valid_hypervisor_paths白名单收录
io.katacontainers.config.hypervisor.pcie_root_port(无类型标注)PCIe Root Port 设备数量,用于热插拔 PCIe 设备(QEMU)
io.katacontainers.config.hypervisor.shared_fsstring共享文件系统类型,virtio-9p或virtio-fs
io.katacontainers.config.hypervisor.use_vsockboolean是否使用vsock与 agent 通信
io.katacontainers.config.hypervisor.vhost_user_store_path(R)stringvhost-user 设备相关目录、socket 与设备节点的存放路径(QEMU)
io.katacontainers.config.hypervisor.virtio_fs_cache_sizeuint32virtio-fs DAX cache 大小,单位MiB
io.katacontainers.config.hypervisor.virtio_fs_cachestringvirtio-fs 缓存模式,合法值:always、auto、never
io.katacontainers.config.hypervisor.virtio_fs_daemonstringvirtio-fsvhost-userdaemon 路径
io.katacontainers.config.hypervisor.virtio_fs_extra_argsstring传递给virtiofsdaemon 的额外参数。安全警告:启用此注解可能被滥用,造成恶意的宿主机侧行为
io.katacontainers.config.hypervisor.enable_guest_swapboolean在 guest 内启用 swap
io.katacontainers.config.hypervisor.use_legacy_serialboolean为 guest 控制台使用 legacy serial 设备(QEMU)
io.katacontainers.config.hypervisor.default_gpusuint32VM 所需的最少 GPU 数量。仅由 remote hypervisor 用于实例选择
io.katacontainers.config.hypervisor.default_gpu_modelstringVM 所需的 GPU 型号。仅由 remote hypervisor 用于实例选择
io.katacontainers.config.hypervisor.block_device_num_queuesusize块设备使用的队列数(仅 runtime-rs)
io.katacontainers.config.hypervisor.block_device_queue_sizeuint32块设备使用的队列大小(仅 runtime-rs)

补充说明:资产类注解(*_hash与对应的kernel、image、initrd、hypervisor、jailer、firmware、firmware_volume)允许用户为单个 Pod指定内核、镜像、固件等资产及其 SHA-512 哈希,实现细粒度的启动资产定制与完整性校验。这些常量均定义于 annotations.go。

2.5 容器选项(Container Options)

KeyValue TypeComments
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设置,以分号分隔;每个元素的第一个词视为模块名,其余视为其参数;
  • 用户可能希望启用 guestseccomp以获得更好的隔离(以少量性能开销为代价),此时可使用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

要点:

  1. runtimeClassName: kata将 Pod 调度到 Kata 运行时类;
  2. pod1的注解会被 containerd 透传为 OCI annotation,runtime 侧在 pkg/oci/utils.go 中按;(常量KernelModulesSeparator,定义于 pkg/oci/utils.go)切分,写入AgentConfig.KernelModules;
  3. pod2的disable_guest_seccomp: "false"表示不关闭guest seccomp,即显式启用它。

4.1 从注解到 guest 内核:底层调用链

一条kernel_modules注解的完整生效路径如下(可从源码逐一印证):

  1. runtime 解析:pkg/oci/utils.go 的addAgentConfigOverrides读取 OCI 注解中的KernelModules,按分号切分后存入SandboxConfig.AgentConfig.KernelModules;
  2. agent 下发:runtime 通过 ttrpc 将kernel_modules列表随 sandbox 创建请求发送给 guest 内 agent;
  3. 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)定义。

下表给出每个受限注解对应的配置条目:

KeyConfig file entryComments
entropy_sourcevalid_entropy_sources合法熵源,如/dev/random
jailer_pathvalid_jailer_paths约束容器 VM 的 jailer(Firecracker)的合法路径
pathvalid_hypervisor_paths运行容器 VM 的合法 hypervisor 路径
vhost_user_store_pathvalid_vhost_user_store_pathsvhost-user 相关文件的合法路径
virtio_fs_daemonvalid_virtio_fs_daemon_pathsvirtiofsddaemon 的合法路径

这些配置项在源码中的对应字段可见于 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。

七、使用建议与安全实践

  1. 优先使用注解做细粒度定制:内核模块、vCPU/内存、块设备缓存策略、共享文件系统等都可以按 Pod 声明,避免全局配置"一刀切";
  2. 严格收敛enable_annotations:仅放行确有必要的键,尤其绝不要开放virtio_fs_extra_args;对entropy_source、path、jailer_path、vhost_user_store_path、virtio_fs_daemon等可执行二进制相关注解,务必配合valid_*条目用glob(3)模式收紧到可预期路径;
  3. 资产哈希防篡改:为kernel、image、initrd、firmware等资产同时声明对应*_hash(默认sha512),可在启动前校验资产完整性;
  4. 确认 CRI 透传配置:使用 containerd 时需在 CRI 插件下配置pod_annotations/container_annotations为["io.katacontainers.*"](或更窄的模式),否则 Pod 注解不会到达 Kata;
  5. 运行时兼容性:生产环境请确认所用的运行时实现(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/

项目地址:https://gitcode.com/gh_mirrors/ka/kata-containers
点击查看免费下载
上一篇:探索Windows Exploit Suggester:智能安全防护的新助力
下一篇:LightningCLI 高级定制指南:为 PyTorch Lightning 打造可扩展的命令行工具

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

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

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

立即咨询