深色模式
pod-timing:Pod 启动耗时测量
把 Kubernetes Pod 的启动耗时拆成调度、拉取镜像、容器开始运行、就绪几段,镜像下载时间从事件中读取,避开 kube_pod_start_time 的坑。
为什么需要
容器调度研究最常用的指标是 Pod 的启动耗时,但最容易测错:Pod 的 status.startTime(Prometheus 中的 kube_pod_start_time)记录的是 kubelet 接收 Pod 的时刻,在拉取镜像之前。用它减去创建时间,只得到调度时间,镜像下载被漏掉了。层感知调度、镜像缓存这类方法的收益恰恰在镜像下载上,用错指标会被严重低估。
能做什么
- 读取 Pod 和事件(直接调用 kubectl,或者读取导出的 JSON);
- 每个 Pod 算出:调度完成、拉取镜像耗时(从 Pulled 事件的消息中读取,区分“镜像已存在”,并给出含排队的时间)、所有容器开始运行、Pod 就绪,都从创建时刻算起;
- 输出均值、P50、P90、P99 和每个 Pod 的明细,可以导出 CSV。
安装
装到当前项目(.claude/skills/),macOS / Linux
curl -LO https://skills.bnuai.com/download/skills/pod-timing.zip && mkdir -p .claude/skills && unzip -o pod-timing.zip -d .claude/skills装到个人目录,所有项目都能用,macOS / Linux
curl -LO https://skills.bnuai.com/download/skills/pod-timing.zip && mkdir -p ~/.claude/skills && unzip -o pod-timing.zip -d ~/.claude/skills装到当前项目,Windows PowerShell
Invoke-WebRequest https://skills.bnuai.com/download/skills/pod-timing.zip -OutFile pod-timing.zip; Expand-Archive pod-timing.zip -DestinationPath .claude\skills -Force压缩包从本站下载,不需要 Node.js 或 GitHub。带脚本的技能需要 Python 3.9 以上。更新时重新下载解压、覆盖原文件夹即可。
怎么用
text
实验跑完了,帮我统计 default 命名空间里 app=bench 这些 Pod 的启动耗时,拆成调度、拉镜像、启动几段,导出 CSV。事件默认只保留 1 小时,实验结束后尽快导出:
bash
kubectl get pods -n default -l app=bench -o json > pods.json
kubectl get events -n default -o json > events.json示例
text
# Pod 启动耗时
| 指标 | 均值 | P50 | P90 | P99 | 有数据的 Pod |
|---|---|---|---|---|---|
| 调度完成 | 0.67 | 1.00 | 1.00 | 1.00 | 3 |
| 拉取镜像(耗时) | 29.59 | 20.51 | 58.70 | 67.30 | 3 |
| 容器开始运行 | 34.00 | 24.00 | 64.80 | 73.98 | 3 |
| Pod 就绪 | 35.33 | 26.00 | 66.00 | 75.00 | 3 |
镜像已在节点上、不需要下载的 Pod:1 个。
| Pod | 节点 | 调度 | 拉取镜像 | 开始运行 | 就绪 |
|---|---|---|---|---|---|
| bench-a | edge-1 | 1.00 | 20.51 | 24.00 | 26.00 |
| bench-b | edge-2 | 1.00 | 已存在 | 3.00 | 4.00 |
| bench-c | edge-3 | 0.00 | 68.25 | 75.00 | 76.00 |(示例数据。)同样是 python:3.12-slim,镜像已在节点上的 bench-b 3 秒就启动了,需要下载的 bench-a 用了 24 秒:这就是层感知调度要利用的差距。
直接运行脚本
bash
python3 skills/pod-timing/scripts/podtiming.py --pods pods.json --events events.json --csv timing.csv
python3 skills/pod-timing/scripts/podtiming.py -n default -l app=bench权限说明
只读:调用 kubectl get pods 和 kubectl get events,或者读取导出的 JSON。不修改集群。
局限
Kubernetes 记录的时间精度是 1 秒,启动只需几秒的场景误差明显:多做几次取平均,或者在容器入口程序里自己记录时间戳。各节点的时钟要同步。