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 链路实现:
- 容器引擎侧的 kata-containers role:负责下载二进制、渲染 QEMU 配置、安装 containerd shim 包装脚本、加载内核模块;
- 集群应用侧的 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: trueetcd.yml:
etcd_deployment_type: host关于etcd_deployment_type: host的必要性,containerd 文档 中给出了明确解释:当kube_node节点上同时承载 etcd 时,该节点也作为 Kubernetes 工作负载可调度节点。由于 containerd 与 dockerd 不能在同一节点同时运行,必须将 etcd 设置为host部署类型,使 etcd 集群可以只依赖 containerd 运行。
源码层面的安装流程
开启开关后,Kubespray 会执行 kata-containers role 的任务序列:
- 下载 kata 二进制:通过
download子任务拉取downloads.kata_containers定义的资产。下载源在 download.yml 中定义,URL 形如kata-static-<version>-<arch>.tar.zst官方发布产物,并校验sha256摘要(摘要表见 checksums.yml); - 解压到根文件系统:
unarchive任务将压缩包解压到/,mode 为0755。Kata 的静态发布包会落在kata_containers_dir(默认/opt/kata)下,包含bin/qemu-system-x86_64、bin/containerd-shim-kata-v2、share/kata-containers/内核与镜像等; - 渲染 QEMU 配置文件:创建
kata_containers_config_dir(默认/etc/kata-containers)目录,并将模板 configuration-qemu.toml.j2 渲染为/etc/kata-containers/configuration-qemu.toml; - 安装 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 运行时并让其读到正确配置文件的关键; - 加载并持久化 vhost 内核模块:通过
community.general.modprobe加载vhost_vsock与vhost_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 3m34sPod 示例(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: 250m、fixed_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.0 | virtio-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/kata | Kata 二进制与 guest 资产的安装目录 |
kata_containers_config_dir | /etc/kata-containers | QEMU 配置文件输出目录 |
kata_containers_containerd_bin_dir | /usr/local/bin | shim 包装脚本安装目录 |
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.yml、verify.yml及用于验证 guest 网络配置的 fixture 文件(container.json、sandbox.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),仅供参考