Kubespray 部署 Kata Containers:基于轻量级虚拟机的安全容器运行时实战指南
2026/9/13 7:26:57 网站建设 项目流程

Kubespray 部署 Kata Containers:基于轻量级虚拟机的安全容器运行时实战指南

【免费下载链接】kubesprayDeploy a Production Ready Kubernetes Cluster项目地址: https://gitcode.com/GitHub_Trending/ku/kubespray

本文基于 Kubespray 官方文档docs/CRI/kata-containers.md展开,系统讲解如何在 Kubespray 管理的 Kubernetes 集群中启用 Kata Containers 安全容器运行时:从必选的 inventory 变量、RuntimeClass 使用方式,到 Pod Overhead 资源核算、版本选择与调试开关等完整配置项,并深入 Kubespray 源码说明二进制分发、QEMU 配置渲染、containerd 运行时注册与 RuntimeClass 生成的完整实现链路。

Kata Containers 概述与 Kubespray 支持范围

Kata Containers 是一个安全容器运行时(secure container runtime),它通过为每个 Pod 启动轻量级虚拟机来提供隔离能力,支持多种 Hypervisor 方案。在 Kubespray 中:

  • QEMU 是 Kubespray 唯一支持的 Hypervisor。Kata Containers 官方还支持 Cloud Hypervisor、Firecracker 等其他方案,但 Kubespray 的 role 只为 QEMU 生成配置和 shim 脚本;
  • 总开关变量kata_containers_enabled默认为false,定义在 默认变量文件;
  • 仅支持 containerd 作为容器管理器。库存校验 role 中明确检查:当kata_containers_enabled为真且container_manager不是 containerd/cri-o 时会直接报错("Stop if kata_containers_enabled is enabled when container_manager is docker"),见 校验任务。

Kata Containers 在 Kubespray 中由两条 role 链路实现:

  1. 容器引擎侧的 kata-containers role:负责下载二进制、渲染 QEMU 配置、安装 containerd shim 包装脚本、加载内核模块;
  2. 集群应用侧的 container_runtimes/kata_containers role:负责生成并下发kata-qemuRuntimeClass 清单。

二者的挂载关系可从源码确认:container-engine/tasks/main.yml中以enabled: "{{ kata_containers_enabled }}"条件加载kata-containersrole;而 container_runtimes/meta/main.yml 声明kubernetes-apps/container_runtimes/kata_containers依赖在kata_containers_enabled为真时生效。

启用 Kata Containers:必需的 inventory 配置

要启用 Kata Containers,需要在 inventory 中设置以下变量:

k8s-cluster.yml

container_manager: containerd kata_containers_enabled: true

etcd.yml

etcd_deployment_type: host

关于etcd_deployment_type: host的必要性,containerd 文档 中给出了明确解释:当kube_node节点上同时承载 etcd 时,该节点也作为 Kubernetes 工作负载可调度节点。由于 containerd 与 dockerd 不能在同一节点同时运行,必须将 etcd 设置为host部署类型,使 etcd 集群可以只依赖 containerd 运行。

源码层面的安装流程

开启开关后,Kubespray 会执行 kata-containers role 的任务序列:

  1. 下载 kata 二进制:通过download子任务拉取downloads.kata_containers定义的资产。下载源在 download.yml 中定义,URL 形如kata-static-<version>-<arch>.tar.zst官方发布产物,并校验sha256摘要(摘要表见 checksums.yml);
  2. 解压到根文件系统unarchive任务将压缩包解压到/,mode 为0755。Kata 的静态发布包会落在kata_containers_dir(默认/opt/kata)下,包含bin/qemu-system-x86_64bin/containerd-shim-kata-v2share/kata-containers/内核与镜像等;
  3. 渲染 QEMU 配置文件:创建kata_containers_config_dir(默认/etc/kata-containers)目录,并将模板 configuration-qemu.toml.j2 渲染为/etc/kata-containers/configuration-qemu.toml
  4. 安装 shim 包装脚本:模板 containerd-shim-kata-v2.j2 生成/usr/local/bin/containerd-shim-kata-qemu-v2,内容是一个两行的 bash 脚本——先设置KATA_CONF_FILE=/etc/kata-containers/configuration-qemu.toml,再exec/opt/kata/bin/containerd-shim-kata-v2 $@。这正是 containerd 能找到 kata 运行时并让其读到正确配置文件的关键;
  5. 加载并持久化 vhost 内核模块:通过community.general.modprobe加载vhost_vsockvhost_net,并写入/etc/modules-load.d/kubespray-kata-containers.conf保证重启后仍生效。这两个模块分别是 vsock 通道(host 与 guest agent 通信)和 vhost 网络(virtio-net 高性能数据面)的前提。

containerd 侧的运行时注册

启用 Kata 后,containerd 主配置模板 config.toml.j2 会自动追加一个运行时段:

[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.kata-qemu] runtime_type = "io.containerd.kata-qemu.v2"

(旧版 containerd 1.x 的 config-v1.toml.j2 则在io.containerd.grpc.v1.cri插件下注册相同内容。)也就是说,kata-qemu这个名字被映射到 shim v2 协议类型io.containerd.kata-qemu.v2,与上一步安装到/usr/local/bin的 shim 包装脚本按 containerd 的命名约定对应起来。

使用方式:通过 RuntimeClass 调度 Kata Pod

默认情况下,Pod 仍然由 runc 运行。Kubespray 会生成名为kata-qemu的 RuntimeClass,Pod 必须通过runtimeClassName字段显式指定才会跑在 Kata 虚拟机中:

$ kubectl get runtimeclass NAME HANDLER AGE kata-qemu kata-qemu 3m34s

Pod 示例(nginx.yaml):

apiVersion: v1 kind: Pod metadata: name: mypod spec: runtimeClassName: kata-qemu containers: - name: nginx image: nginx:1.14.2
$ kubectl apply -f nginx.yaml

这个 RuntimeClass 并非手工创建,而是由 Kubespray 自动化生成:container_runtimes/kata_containers 的 tasks 在首个 control-plane 节点上渲染模板 runtimeclass-kata-qemu.yml.j2 到{{ kube_config_dir }}/addons/kata_containers/目录,再调用kube模块以state: latest应用。模板生成的node.k8s.io/v1RuntimeClass 的handler与名称一致为kata-qemu,与 containerd 注册的运行时名严丝合缝。

配置:Pod Overhead(推荐)

Pod Overhead是 Kubernetes 用于核算 Pod 所使用的 RuntimeClass 所消耗资源的特性。启用后,Kubernetes 会把配置中指定的固定 CPU 与内存量计为虚拟机本身的消耗,而不是 Pod 内容器的消耗。

对于使用 Kata Containers 且设置了 resources limits 的 Pod,Pod Overhead 是必选项——否则虚拟机的开销会挤占容器可分配资源,调度器也无法正确感知真实占用。

第一步:设置 cgroup driver

要启用 Pod Overhead 特性,必须让 Kubelet 使用合适的 cgroup driver:

cgroupfs效果最好:

kubelet_cgroup_driver: cgroupfs

……而如果系统使用 cgroups v2,使用systemd也可以:

kubelet_cgroup_driver: systemd

第二步:QEMU Hypervisor 的 Overhead 参数

QEMU Hypervisor 相关的 Overhead 配置使用如下变量:

kata_containers_qemu_overhead: true kata_containers_qemu_overhead_fixed_cpu: 10m kata_containers_qemu_overhead_fixed_memory: 290Mi

这三个变量在 RuntimeClass 模板 中被消费:当kata_containers_qemu_overhead为真时,模板会在 RuntimeClass 中追加:

overhead: podFixed: cpu: 10m # 即 kata_containers_qemu_overhead_fixed_cpu memory: 290Mi # 即 kata_containers_qemu_overhead_fixed_memory

需要注意 Kubespray 内置的默认值与文档示例不同:container_runtimes/kata_containers 的 defaults 中为fixed_cpu: 250mfixed_memory: 160Mi。文档中的10m/290Mi是按实际 QEMU 虚拟机基线开销校准的推荐值,实际部署时建议以自测的虚拟机固定开销为准覆盖默认值。

配置:选择 Kata Containers 版本(可选)

可以通过kata_containers_version选择要安装的 Kata Containers 发行版本,可用版本以 Kata Containers 官方 releases 为准:

kata_containers_version: 2.2.2

以当前仓库实际内容为准,checksums.yml 内置校验和的版本覆盖3.28.0 至 3.32.0(amd64 与 arm64 双架构)。不显式指定版本时,download.yml 取校验和字典的首个 key 作为默认版本(当前即 3.32.0)。因此文档示例中的2.2.2仅作为语法示例;在当前仓库校验和范围内,可安全选用的值是 3.28.0–3.32.0。

版本选择会直接影响 QEMU 配置模板的行为,configuration-qemu.toml.j2 中存在多处版本分支:

配置项版本条件取值
kernel>= 2.2.0/opt/kata/share/kata-containers/vmlinux.container(否则为vmlinuz.container
shared_fs>= 2.2.0virtio-fs(否则为virtio-9p
virtio_fs_daemon>= 2.5.0/opt/kata/libexec/virtiofsd(否则为/opt/kata/libexec/kata-qemu/virtiofsd
create_container_timeout = 60>= 3.4.0才渲染该超时参数

配置:调试开关(可选)

Kata Containers 的所有组件默认关闭调试。可通过以下变量改变该行为:

kata_containers_qemu_debug: 'false'

在 QEMU 配置模板中,该值会同时注入三个[section]enable_debug[hypervisor.qemu][agent.kata][runtime](见 模板 L343、L515、L559)。开启后,hypervisor 会启用 HMP socket 与调试输出,便于定位虚拟机启动、guest agent 通信问题。

其他关键 role 变量(源码补充)

除文档列出的配置项外,kata-containers role 的 defaults 还定义了若干影响生成的/etc/kata-containers/configuration-qemu.toml的变量,供需要深度调优的读者参考:

变量默认值作用
kata_containers_dir/opt/kataKata 二进制与 guest 资产的安装目录
kata_containers_config_dir/etc/kata-containersQEMU 配置文件输出目录
kata_containers_containerd_bin_dir/usr/local/binshim 包装脚本安装目录
kata_containers_qemu_default_memory{{ ansible_facts['memtotal_mb'] }}注入 toml 的default_memory,即每个 Kata 虚拟机默认可用的最大内存为节点总内存
kata_containers_qemu_sandbox_cgroup_only'true'整个 sandbox 共用一个 cgroup,便于上层统一限制/采集 Kata sandbox 资源
kata_containers_qemu_enable_mem_prealloc'false'是否预分配并锁定 VM 内存(开启会显著降低容器密度)
kata_containers_virtio_fs_cache'always'virtio-fs 的 DAX 缓存模式(never/auto/always)

验证与测试

仓库为 Kata Containers 提供了 molecule 场景,位于 extra_playbooks/roles/container-engine/kata-containers/molecule/default,其中包含converge.ymlverify.yml及用于验证 guest 网络配置的 fixture 文件(container.jsonsandbox.json),可作为本地验证 Kata 场景配置的参考。

相关源码与文档路径汇总

内容路径
本文依据的官方文档docs/CRI/kata-containers.md
containerd 运行时背景文档docs/CRI/containerd.md
总开关与版本/下载变量kubespray_defaults/defaults/main/main.yml、download.yml
安装任务(下载/配置/shim/内核模块)container-engine/kata-containers/tasks/main.yml
QEMU 配置模板configuration-qemu.toml.j2
shim 包装脚本模板containerd-shim-kata-v2.j2
containerd 运行时注册containerd/templates/config.toml.j2
RuntimeClass 生成与应用container_runtimes/kata_containers/tasks/main.yaml、runtimeclass-kata-qemu.yml.j2
Overhead 默认值container_runtimes/kata_containers/defaults/main.yaml
库存校验(仅 containerd/cri-o)validate_inventory/tasks/main.yml

【免费下载链接】kubesprayDeploy a Production Ready Kubernetes Cluster项目地址: https://gitcode.com/GitHub_Trending/ku/kubespray

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

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

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

立即咨询