minikube v1.27.1 基准测试解读:time-to-k8s 与 CPU 消耗全景分析
【免费下载链接】minikubeRun Kubernetes locally项目地址: https://gitcode.com/gh_mirrors/mi/minikube
本篇指南基于 minikube 仓库中的官方基准测试文档 v1.27.1 Benchmark,完整解析该版本在"从零开始到 Kubernetes 集群成功就绪"这一核心场景下的耗时构成与 CPU 开销,并与 kind v0.16.0、k3d v5.4.6 在同等环境下横向对比。读完本文,你将理解 time-to-k8s 各阶段指标(命令执行、API Server 响应、服务就绪、DNS 就绪、应用运行)的确切含义、CPU 利用率与 CPU 时间的区别,并掌握如何用仓库中的脚本复现与生成同类基准测试。
一、基准测试文档是什么
site/content/en/docs/benchmarks/timeToK8s/ 目录下按版本归档了大量基准测试页面,从 v1.20.0 一直覆盖到 v1.36.0,每一份页面均由自动化流程生成,v1.27.1.md 就是其中的一份,记录 minikube v1.27.1 发布时的测量结果。
从文档的 front matter 可以看到,该页面的weight: -20221008是一个由日期换算而来的负数排序权重(2022-10-08),保证新版本页面在文档站点中排在前面。页面主体由两部分组成:
- 时间维度(time-to-k8s):一张堆叠柱状图加一张分阶段耗时表;
- CPU 维度(CPU-to-k8s):一张 CPU 图表加一张 CPU 开销表。
这两张图表对应的图片文件分别为 v1.27.1-time.png 与 v1.27.1-cpu.png。
二、测试环境与对比对象
文档表头明确标注了三方对比的环境信息:
| 项目 | 版本/环境 |
|---|---|
| minikube | v1.27.1 |
| kind | v0.16.0(go1.19.1 linux/amd64) |
| k3d | v5.4.6 |
从仓库中的基准测试编排脚本 hack/benchmark/time-to-k8s/time-to-k8s.sh 可以还原当时的测试流程:脚本先分别安装 kind(从 GitHub Releases 下载 kind-linux-amd64 二进制)、k3d(通过官方 install.sh)以及本地make构建出的 minikube,然后进入time-to-k8s-repo子模块执行:
go run . --config local-kubernetes.yaml --iterations 10 --output output.csv其中--iterations 10表示每个工具重复运行 10 次取平均,从而降低单次运行的随机抖动。最后脚本读取 CSV 输出,调用 hack/benchmark/time-to-k8s/page.go 自动生成 Markdown 页面和图表。
需要说明的是:当前仓库只保留了生成流程与结果归档,time-to-k8s-repo是尚未拉取的 git 子模块目录(hack/benchmark/time-to-k8s/time-to-k8s-repo/为空目录),因此文档表格中的数值是当时机器环境下的实测结果,不同硬件、驱动(docker/virtualbox)、容器运行时(docker/containerd)都会产生差异,每日基准测试页面 展示的正是对不同驱动-运行时组合的持续追踪。
三、耗时构成:六个阶段逐一拆解
v1.27.1 基准表把"从零到 Kubernetes 成功部署"的完整过程拆成 6 个可独立测量的阶段,单位均为秒:
| 阶段 | minikube v1.27.1 | kind v0.16.0 | k3d v5.4.6 | 阶段含义 |
|---|---|---|---|---|
| Command Exec | 34.025 | 23.670 | 16.210 | 启动命令从下发到工具进程退出的耗时 |
| API Server Answering | 0.098 | 0.103 | 0.126 | 控制平面 API Server 首次响应请求 |
| Kubernetes SVC | 0.088 | 0.079 | 0.083 | Kubernetes 核心 Service 就绪 |
| DNS SVC | 0.085 | 0.081 | 0.084 | DNS 服务(kube-dns/coreDNS)就绪 |
| App Running | 15.237 | 26.462 | 13.359 | 测试应用从提交到进入 Running 状态 |
| DNS Answering | 4.239 | 2.189 | 3.050 | 集群内 DNS 实际完成域名解析 |
| Total | 53.771 | 52.585 | 32.911 | 六阶段累计 |
对应的时间图如下,柱体按阶段自上而下堆叠,便于直观对比各工具在每个阶段的耗时占比:
阶段指标与源码的对应关系
图表生成逻辑位于 hack/benchmark/time-to-k8s/chart.go,其中定义了一个run结构体,字段与表格行一一对应:
type run struct { cmd float64 // Command Exec api float64 // API Server Answering k8s float64 // Kubernetes SVC dnsSvc float64 // DNS SVC app float64 // App Running dnsAns float64 // DNS Answering }readInCSV从 CSV 的第 8 到第 16 列解析出这 6 个耗时值与 2 个 CPU 指标;values函数对每个工具的多次运行求算术平均,并计算Total(六个阶段的平均值求和),随后outputMarkdownTable用 tablewriter 渲染出 Markdown 表格。这解释了为何文档表格统一保留三位小数——源码中fmt.Sprintf("%.3f", value)的格式化结果。
关键观察
- Command Exec 是最大耗时项:三个工具的该项都占了一半以上总耗时(minikube 34.025s、kind 23.670s、k3d 16.210s)。它涵盖 VM/容器创建、系统镜像下载/导入、Kubernetes 组件安装与启动的全过程,是各工具在启动路径上的核心差异所在。
- k3d 总耗时最低(32.911s),主要得益于其命令执行阶段最快;但其 API Server 响应(0.126s)和 DNS 解析(3.050s)略慢于 minikube。
- minikube 与 kind 总耗时接近(53.771s vs 52.585s),差异主要来自 Command Exec(minikube 慢 10s 左右)与 App Running(minikube 反而快 11s 左右)两个阶段。
- API Server / Kubernetes SVC / DNS SVC 三个"就绪"指标都在 0.1s 量级,说明三者在集群组件拉起后的就绪检测都非常迅速,真正的差异集中在镜像准备与组件安装环节。
四、CPU 开销:利用率与 CPU 时间的双重维度
基准文档同时给出了 CPU 维度的数据:
| 指标 | minikube v1.27.1 | kind v0.16.0 | k3d v5.4.6 |
|---|---|---|---|
| CPU Utilization (%) | 46.634 | 51.041 | 53.975 |
| CPU Time (seconds) | 24.360 | 26.787 | 17.793 |
两个指标的定义可以从 hack/benchmark/time-to-k8s/cpu.go 与 chart.go 中的cpu结构体推断:
type cpu struct { cpuPct float64 // CPU utilization percentage cpuTime float64 // CPU time in seconds }- CPU Utilization (%)表示整个基准过程内测量到的平均 CPU 占用率。三者都在 46%~54% 区间,k3d 略高,说明三条启动路径都会较为充分地利用可用 CPU 资源,不存在明显的 CPU 空闲等待。
- CPU Time (seconds)表示进程累计消耗的 CPU 时间(多核累加)。k3d 的 17.793s 显著低于 minikube(24.360s)与 kind(26.787s),与它更快的 Command Exec 阶段相互印证——较少的 CPU 计算开销对应较短的命令执行时间。
结合生成逻辑来看,cpuMarkdownTable输出的表格行标题固定为CPU Utilization(%)与CPU Time(seconds),而 CPU 图表则由createCPUChart绘制,X 轴直接使用这两个字段名,每个工具生成一列分组的双柱图,与文档中呈现的表格/图表结构完全一致。
五、数据如何生成:脚本驱动的自动化基准流程
仓库把"跑基准 → 画图 → 生成文档页"封装成了完整流水线,核心入口是 hack/benchmark/time-to-k8s/time-to-k8s.sh:
# 安装三个被测工具 install_kind # 下载 kind 二进制到 /usr/local/bin/kind install_k3d # 通过官方 install.sh 安装 k3d install_minikube # make 构建后安装到 /usr/local/bin/minikube VERSION=$(minikube version --short) # 以 minikube 短版本号命名产物 run_benchmark # 10 次迭代跑 local-kubernetes.yaml 场景 create_page "$VERSION" # 生成 -time.png / -cpu.png 与 .md 页面 cleanupcreate_page的具体动作是:
go run ./hack/benchmark/time-to-k8s/*.go \ --csv .../output.csv \ --image ./site/static/images/benchmarks/timeToK8s/"$1" \ --page ./site/content/en/docs/benchmarks/timeToK8s/"$1".mdpage.go 中的main依次完成四件事:
- 通过
minikube version --short获取版本号,写入页面 front matter 的title/linkTitle; - 用
readInCSV读取 CSV、values计算各工具各阶段的平均值与总和; - 调用
createChart生成堆叠柱状时间图、createCPUChart生成 CPU 图(使用 gonum/plot 库,输出 12×8 英寸与 8×8 英寸 PNG); - 按内置的
page模板(包含 front matter、两张图片引用、两张 Markdown 表)填充并写出页面文件。
当前文档页面的weight: -20221008正是page.go中time.Now().Format("20060102")生成的当日日期值。这也意味着:如果你在本地复现这套流程,页面文件名与权重会随执行日期和 minikube 版本自动变化,与 v1.27.1 归档页保持一致的结构。
驱动与运行时的可配置性
仓库还提供了面向不同环境的基准配置。以 Docker 驱动 + Docker 运行时为例,docker-docker-benchmark.yaml 定义了 minikube 的启动参数:
testcases: minikube: setup: minikube start --driver=docker --container-runtime=docker --memory=max --cpus=max teardown: minikube delete同一目录下还有docker-containerd-benchmark.yaml、virtualbox-docker-benchmark.yaml、virtualbox-containerd-benchmark.yaml等变体,分别对应 每日基准测试页面 中列出的四种驱动-运行时组合(Docker/Docker、Docker/containerd、VirtualBox/Docker、VirtualBox/containerd),public-chart 子目录内的 generate-chart.go 负责把 CSV 数据渲染成公开图表。v1.27.1 归档页本身并未声明具体驱动,从时间表数值看,其场景与上述测试配置属于同一套基准体系。
六、阅读与复现这份基准的实用建议
如何阅读版本归档页
- 先看 Total,再看 Command Exec:总耗时主要由 Command Exec 主导,关注该列的相对差距即可快速判断工具间的启动速度差异。
- 关注"就绪"类指标的绝对值:API Server Answering、Kubernetes SVC、DNS SVC 反映的是组件就绪检测的灵敏度,三者均在 0.1s 量级时说明差异可忽略。
- CPU 两个指标要配套看:利用率高不一定是坏事,需结合 CPU Time 判断是否真的多消耗了计算资源;k3d 的例子(利用率最高但 CPU 时间最低)说明高利用率可能来自更紧凑的并行调度。
如何在自己的机器上复现
- 仓库中的自动化脚本 time-to-k8s.sh 可以直接参考:先安装 kind、k3d、构建 minikube,再进入
time-to-k8s-repo子模块(git submodule update --init)执行带--iterations 10的基准命令,最后用 page.go 一键生成图表与页面。 - 若只想验证 minikube 单方数据,可直接采用 docker-docker-benchmark.yaml 中的启动参数:
minikube start --driver=docker --container-runtime=docker --memory=max --cpus=max,测完用minikube delete清理。 - 需要明确的是,归档数值依赖具体机器(CPU、磁盘、网络)与驱动/运行时组合,跨机器直接对比绝对值意义有限,更适合用于相对趋势与阶段瓶颈分析。
七、结论
minikube v1.27.1 的基准归档展示了三方面核心信息:总耗时 53.771s 中 Command Exec(34.025s)与 App Running(15.237s)占绝对主导;三个"就绪"类阶段均为亚秒级,说明 minikube 的组件就绪检测链路高效;CPU 利用率 46.634% 与 CPU 时间 24.360s 处于三者中间水平。结合 chart.go、cpu.go、page.go 的生成源码,可以完整还原这份文档从 CSV 原始数据到 Markdown 归档页的自动化生产链路;而 timeToK8s 目录 中从 v1.20.0 到 v1.36.0 的连续归档,则为观察 minikube 启动性能随版本的演进提供了理想的数据集。
【免费下载链接】minikubeRun Kubernetes locally项目地址: https://gitcode.com/gh_mirrors/mi/minikube
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考