- 云原生
- 容器运行时
【免费下载链接】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-ctl是 Kata Containers 项目官方提供的 Rust 版控制工具,用于调用高级特性、进行问题定位与系统调试。本指南以仓库内 src/tools/kata-ctl/README.md 为核心,结合其 Rust 源码 逐条剖析全部子命令的用法与底层实现,帮助读者完成从构建安装、环境预检(check)到 guest 调试(exec/cp)、日志分析(log-parser)的完整实操闭环。
概述:kata-ctl 是什么
kata-ctl是对kata-runtime中传统 utility 程序(参见 docs/design/architecture/README.md 中 utility program 相关说明)的一次 Rust 重写。它把原先分散在 Go 运行时里的辅助能力统一收敛为一个独立二进制,面向的受众是使用者与系统管理员,主要提供两类价值:
- 使用 Kata Containers 高级特性:如直连卷(direct volume)管理、VM 工厂(factory)管理、guest 内命令执行与文件复制、内置监控指标服务等;
- 问题确定与调试:如宿主机环境预检、运行时配置/环境信息导出、多组件日志解析等。
从 Cargo.toml 可以看出,它直接依赖kata-types、kata-sys-util、shim-interface、virt_container(即 runtime-rs 侧 hypervisor 抽象)等核心库,因此具备与 runtime-rs 联动的能力,而不仅仅是一个独立小工具。
构建与安装
编译
在仓库的src/tools/kata-ctl目录下直接执行:
$ makemake默认目标会先通过sed模板替换生成src/ops/version.rs(由 version.rs.in 生成,写入版本号与 commit 信息),随后以RUSTFLAGS="--deny warnings"严格模式调用cargo build -p kata-ctl。可用的构建变量(参见 Makefile):
| 变量 | 作用 |
|---|---|
BUILD_TYPE | 传入release时执行--release优化构建 |
USE_BUILTIN_DB | 置为true时启用dragonball特性,使 kata-ctl 内建 Dragonball 微虚拟机支持 |
ARCH | 指定目标架构(默认由工具链推导) |
需要说明的是,Makefile 中对ppc64le架构做了跳过构建的处理:Building kata-ctl on ppc64le is currently being skipped并直接退出 0,因此在 PowerPC 小端架构上当前不生成该工具。
安装
$ make install默认安装到$(HOME)/.cargo(即cargo install --root $(HOME)/.cargo,最终可执行文件出现在~/.cargo/bin/kata-ctl)。如需指定安装目录,通过INSTALL_PATH变量传入:
$ make install INSTALL_PATH=/path/to/your/custom/install/directory运行
$ kata-ctl ...kata-ctl基于clap解析命令行(入口见 main.rs),所有子命令定义集中在 args.rs。不带子命令直接运行会输出帮助并返回退出码 2。最典型的入门命令是环境预检:
$ kata-ctl check all想查看完整用法语句,运行:
$ kata-ctl --help全局选项
除子命令外,kata-ctl还提供三个全局选项(定义于 args.rs):
| 选项 | 说明 |
|---|---|
-l, --log-level <LEVEL> | 设置日志输出的最低级别,合法值为trace、debug、info、warning、error、critical,默认info |
-j, --json-logging | 以 JSON 格式输出日志,便于机器解析 |
--show-default-config-paths | 仅打印默认配置文件路径列表后退出(通过kata_types::config::TomlConfig::get_default_config_file_list()获取,见 main.rs) |
子命令全览
args.rs 中共注册了 11 个一级子命令,完整列表如下:
| 子命令 | 功能 | 权限要求 |
|---|---|---|
check | 检测系统能否运行 Kata Containers | 部分检查需 root |
cp | 在宿主机与 guest VM 之间复制文件/目录 | 需要 sandbox 启用 debug console + devkit |
direct-volume | 直连卷管理(add/remove/stats/resize) | 必须 root |
env | 导出运行时/宿主环境设置 | 普通用户 |
exec | 通过 debug console 进入 guest 或执行单条命令 | 需要 sandbox 开启 debug console |
factory | 管理 VM 工厂(init/destroy/status) | 视配置 |
iptables | guest iptables 管理(当前为占位实现) | 保留接口 |
metrics | 收集运行 sandbox 的基础设施指标 | 保留接口 |
monitor | 启动 HTTP 监控服务暴露指标 | 普通用户 |
version | 显示版本详情 | 普通用户 |
log-parser | 解析日志并输出多种格式 | 普通用户 |
下面按实战场景逐一展开。
check:宿主机环境预检
check是判断"这台机器能不能跑 Kata Containers"的一站式入口。其子命令在 args.rs 的CheckSubCommand中定义:
| 子命令 | 说明 |
|---|---|
all | 运行全部检查(CPU、网络、内核模块、KVM 可用性) |
no-network-checks | 运行全部检查但跳过网络相关项 |
check-version-only | 仅对比当前版本与最新可用版本 |
only-list-releases | 仅列出官方发布包 |
include-all-releases | 列出全部官方与预发布(pre-release)包 |
list | 列出所有可用检查项及其说明 |
从 check_ops.rs 的handle_check可以看到all的实际执行顺序:
- CPU 检查(
CheckType::Cpu):读取/proc/cpuinfo,解析 CPU flags 与属性,校验是否满足虚拟化要求; - 网络检查(
check::run_network_checks()); - 内核模块检查(
CheckType::KernelModules); - KVM 可用性检查(
CheckType::KvmIsUsable)。
以 x86_64 为例(实现见 arch/x86_64/mod.rs):
- CPU 检查要求 Intel 标志
GenuineIntel以及 flagslm、sse4_1、vmx; - 内核模块检查
MODULE_LIST包含kvm(参数kvmclock_periodic_sync=Y)、kvm_intel(参数unrestricted_guest=Y,但在虚拟机内运行时该参数不作要求)、vhost、vhost_net、vhost_vsock; - KVM 检查通过
check_kvm_is_usable_generic()(check.rs)完成:要求以 root 身份打开/dev/kvm,验证 KVM API 版本恒为 12,并实际执行KVM_CREATE_VMioctl 创建一次 VM,以确认 KVM 可用——若返回EBUSY则提示"已有其他 hypervisor 在运行"。
其余架构(aarch64、s390x、powerpc64le)在 arch/ 下有各自的arch_specific实现,通过 arch/mod.rs 按cfg(target_arch)自动选择。
版本与发布相关的检查实现于 check.rs:通过reqwest请求 GitHub Releases API,解析tag_name、prerelease、created_at、tarball_url字段,only-list-releases仅展示官方发布,include-all-releases则额外标注PreRelease条目。注意这两项检查需要宿主机能够访问外网 API。
env:导出环境与运行时设置
env用于导出诊断信息,输出格式为 TOML(默认)或 JSON(--json选项),也可以借助-f, --file <FILE>写入指定文件而非 stdout(见 env_ops.rs)。其输出结构EnvInfo包含以下区块:
meta:输出格式版本号(0.0.1-kata-ctl,任何输出结构变更都会递增);host:宿主机内核版本(读/proc/version)、发行版信息(读/etc/os-release,Clear Linux 使用/usr/lib/os-release)、架构、CPU 厂商/型号/核数、内存总量/可用/空闲、可用 guest 保护能力(available_guest_protection)、是否具备 VM 容器能力(vm_container_capable)、是否支持 vsock(检查/dev/vhost-vsock是否存在,见 utils.rs);runtime:运行时路径、语义版本、commit、调试/追踪开关、disable_guest_seccomp、disable_new_net_ns、sandbox_cgroup_only、static_sandbox_resource_mgmt、experimental特性列表及配置文件路径;hypervisor:machine type 与加速器、版本、路径、块设备驱动、熵源、共享文件系统、virtio-fs daemon、内存槽位、PCIe root port、默认 vCPU 数、CPU 特性、安全信息(rootless、disable_seccomp、guest hook 路径、启用注解、confidential guest)等;agent:agent 的 debug 与 tracing 开关;kernel/image/initrd:guest 内核路径与参数、根文件系统镜像路径、initrd 路径。
其中 hypervisor/agent 配置来自加载的默认 TOML 配置(TomlConfig::load_from_default()),并优先使用hypervisor_name/agent_name指定的配置段;hypervisor 版本通过对其path执行--version获取。
version:查看版本详情
$ kata-ctl version输出形如kata-ctl version <版本>-<commit> (type: rust)。版本字符串由构建期生成的 version.rs 提供:KATA_CTL_VERSION由 Makefile 组合VERSION文件内容与 git commit(工作区有未提交修改时追加-dirty后缀)而成。
exec 与 cp:进入 guest 调试
这两个命令都建立在agent debug console之上:即 guest 内一个由 PTY 支撑的 shell,宿主侧通过 vsock / hybrid-vsock 隧道访问。连接逻辑见 debug_console.rs:
- 先通过 shim 管理接口(
MgmtClient)查询 sandbox 对应的 agent socket URL; - 根据 scheme 选择传输:
vsock://<cid>:<port>(QEMU 类)或hvsock://<path>:<port>(Firecracker/Dragonball/Cloud Hypervisor 的 hybrid vsock 模型); - 在 socket 之上封装一层请求/响应协议:发送
stty -opost -echo关闭回显,用唯一 marker(KATACTL<pid><nanos>)包裹命令,输出以-BEGIN/-END:<status>标记,从而获得"单条命令的输出 + 退出码",而不是单纯挂一个终端。
exec
# 进入 guest 的交互式终端 $ kata-ctl exec <sandbox-id> # 在 guest 内执行单条命令并返回其退出码 $ kata-ctl exec <sandbox-id> -- ls -l /参数(args.rs 的ExecArguments):
sandbox_id:pod sandbox ID;-p, --kata-debug-port:debug console vport,默认1026,必须与配置文件中kata-debug-port一致(参见 exec_ops.rs 顶部注释);--之后的参数作为 guest 内要执行的命令。
交互模式下(exec_ops.rs)通过epoll同时监听 stdin 与 debug console socket,实现双向转发;执行单条命令时则走Session::run,把命令的 stderr 与 stdout 交错输出到本地 stdout(因为 console 是单流),并以 guest 内命令的退出码作为 kata-ctl 自身的退出码——这也是 11 个子命令中唯一返回非零状态码的例外(见 main.rs 注释)。
cp
cp在宿主机与 guest 之间复制文件/目录,数据同样经由 debug console 传输,格式与 docker 的src:dest语法类似(args.rs 中CpArguments的 after_help 给出了示例):
# 宿主机 -> guest $ kata-ctl cp ./tool <sandbox-id>:/tmp/tool # guest -> 宿主机 $ kata-ctl cp <sandbox-id>:/var/log ./guest-logs实现要点(cp_ops.rs):
- 端点解析:
<sandbox-id>:<绝对guest路径>视为 guest 端点,否则视为宿主机路径;guest 路径必须是绝对路径,且不支持 sandbox 之间的直接对拷; - 前置条件:目标 sandbox 必须加载了devkit guest extension(由
kata-<shim>-devkitRuntimeClass 提供,kata-deploy 在同时启用debug与devkit时创建),否则命令会提前拒绝——因为复制依赖 guest 内的 shell、tar和base64,而这些并不是最小 rootfs 的必备组件; - 传输协议:宿主侧把源文件打成 tar 归档 → base64 编码(每 57 字节一行,base64 后 76 字符,确保 guest 终端能整行接收)→ 通过 console 管道喂给 guest;guest 侧
base64 -d | tar --no-same-owner -xf -解包。反向复制流程对称,guest 打包后经 base64 回传宿主解包; - 安全边界:整个通道本质上是 guest 内的 root shell,因此只有显式开启
agent.debug_console的 sandbox 才暴露此能力,且该开关对机密计算(confidential guest)场景可见于证明(attestation)信息。
direct-volume:直连卷管理
direct-volume用于把块设备以"直连卷"方式交给 Kata Containers 管理,必须以 root 运行(见 volume_ops.rs 开头的权限校验)。子命令:
| 子命令 | 用法 | 说明 |
|---|---|---|
add | kata-ctl direct-volume add <volume-path> <mount-info> | 将直连卷的挂载信息(JSON)写入 Kata 已知的文件系统路径;<mount-info>需为合法 JSON,结构包含volume_type、device、fs_type、metadata、options等字段 |
remove | kata-ctl direct-volume remove <volume-path> | 删除直连卷路径及其全部子文件 |
stats | kata-ctl direct-volume stats <volume-path> | 获取直连卷文件系统统计信息(通过 shim 管理接口) |
resize | kata-ctl direct-volume resize <volume-path> <size> | 将直连卷调整为指定大小(通过ResizeVolumeRequest下发到 agent) |
实现细节:add将 mount info 写入<kata直连卷根目录>/<volume-path>/mount_info.json,其中路径通过safe_path的 scoped join 进行编码,防止路径穿越(volume_ops.rs 中的测试用例覆盖了../../etc/passwd这类相对路径注入);stats/resize需要根据 mount info 中的设备找到关联 sandbox,再通过MgmtClient向 shim 发起 HTTP 请求。
factory:VM 工厂管理
$ kata-ctl factory init # 基于 kata-runtime 配置初始化 VM 工厂 $ kata-ctl factory destroy # 销毁 VM 工厂 $ kata-ctl factory status # 查询 VM 工厂状态对应实现见 factory_ops.rs,底层委托给virt_container::factory模块。VM 工厂用于预先创建一批 VM 实例,加速容器启动;相关机制可结合 docs/how-to/what-is-vm-templating-and-how-do-I-use-it.md 与 docs/how-to/what-is-vm-cache-and-how-do-I-use-it.md 进一步了解。
monitor / metrics / iptables
monitor:启动一个内置 HTTP 服务(默认监听127.0.0.1:8090,可通过位置参数指定地址),GET /与GET /metrics分别提供根信息与 Prometheus 格式指标。实现见 monitor/http_server.rs,基于hyper+tokio,每个连接由独立任务处理;metrics与iptables:目前是占位实现(handle_metrics、handle_iptables直接返回Ok(())),用于保留 CLI 接口与后续演进。
log-parser:多组件日志解析
log-parser是随 kata-ctl 分发的内置子工具(对应子目录 src/tools/kata-ctl/src/log_parser,其独立说明见 src/tools/kata-ctl/src/log_parser/README.md)。它将 runtime-rs 各组件产生的日志文件按时间戳排序后重新展示,并支持校验日志记录合法性、以多种格式重排输出。它是 Go 版kata-log-parser的 Rust 重写,未来将逐步替代旧工具。
日志格式
runtime-rs 的日志是单行 JSON 对象:
{"msg":"message","level":"INFO","ts":"1970-01-01T00:00:00.000000000Z","name":"kata-runtime","version":"0.1.0","pid":"0","source":"source","subsystem":"subsystem"}约束:一条日志必须独占一行,一行也只能包含一条日志;若使用--ignore-missing-fields,缺少level、name、version、pid、source、subsystem中部分字段的日志才会被容忍。
命令行选项
| 选项 | 说明 |
|---|---|
-o, --output-file <FILE> | 输出到指定文件,缺省输出到 stdout |
--output-format <FORMAT> | 输出格式,默认json,可选csv、json、ron、text、toml、xml、yaml |
-q, --quiet | 不向 stderr 打印非法日志条目错误 |
-s, --strict | 任一非法日志条目即终止程序 |
-c, --check-only | 仅检查日志文件,出错时才输出 |
--error-if-file-empty | 任一输入文件为空即报错 |
--error-if-no-records | 全部输入文件均无记录即报错 |
--ignore-missing-fields | 容忍缺少部分字段的日志行 |
-h, --help | 显示全部 CLI 选项 |
典型用法
- 确认 containerd 处于 debug 模式(相关说明见 docs/Developer-Guide.md);
- 确认当前运行的是 runtime-rs 实现:
$ containerd-shim-kata-v2 --version | grep -qi rust && echo rust || echo golang- 收集日志(可按容器创建时间用
--since约束范围):
$ sudo journalctl -q -o cat -a -t kata | grep "^{" > ./kata.log- 确保日志文件当前用户可读:
$ sudo chown $USER kata.log- 解析并输出:
$ kata-ctl log-parser kata.log -o out.log处理流程(log_parser.rs)为:逐个读取输入文件 → 按行解析(严格模式StrictLogMessage校验全部字段)→ 按--error-if-*选项校验 → 按时间戳排序 → 以指定格式写出。
源码结构与进一步阅读
- CLI 定义与全部参数:src/tools/kata-ctl/src/args.rs
- 入口与命令分发:src/tools/kata-ctl/src/main.rs
- 通用检查(KVM/发布版本/内核模块):src/tools/kata-ctl/src/check.rs
- 各子命令实现:src/tools/kata-ctl/src/ops
- 架构相关检查(x86_64/aarch64/s390x/ppc64le):src/tools/kata-ctl/src/arch
- debug console 客户端协议:src/tools/kata-ctl/src/debug_console.rs
- 内置监控 HTTP 服务:src/tools/kata-ctl/src/monitor/http_server.rs
- 构建与安装规则:src/tools/kata-ctl/Makefile
小结
从"构建、安装、运行"三步上手,到check的宿主机预检、env的环境快照、exec/cp的 guest 调试通道、direct-volume的卷管理、factory的 VM 加速以及log-parser的日志分析,kata-ctl把 Kata Containers 运维中最常用的能力统一收口在一个 Rust 二进制内。对管理员而言,建议把kata-ctl check all纳入环境验收流程,把kata-ctl env的输出作为问题上报时的标准诊断附件;对开发者而言,exec/cp与log-parser组合使用,可以快速定位 runtime-rs、agent 与 hypervisor 协同中的绝大多数故障。
- 云原生
- 容器运行时
【免费下载链接】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 under Minikube:嵌套虚拟化环境搭建、kata-deploy 安装与 Kata Pod 验证实战
Kata Containers under Minikube:嵌套虚拟化环境搭建、kata deploy 安装与 Kata Pod 验证实战 本文基于 Kata
云原生容器运行时Kata Containers shim 调试实战指南:使用 Delve 调试 Go 版 containerd-shim-kata-v2
Kata Containers shim 调试实战指南:使用 Delve 调试 Go 版 containerd shim kata v2 导读 Kata Con
云原生容器运行时Kata Containers 开发者实战指南:源码构建、Guest 镜像制作与调试控制台全解
Kata Containers 开发者实战指南:源码构建、Guest 镜像制作与调试控制台全解 本文面向 Kata Containers 的开发者,系统讲解从零
云原生容器运行时
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考