kubernetes - 如何找出 Pod 花费的时间?
问题描述
我有一个要求,我想知道 Pod 花费的每一部分时间。
- 拉一个 docker 镜像需要多少时间?也许一个 Pod 有多个 initContainers 和容器。我想知道他们的每一部分。
也许我可以使用“kubectl describe pod-name ...”来分析事件
- Pod 准备好多少时间?从被创建和准备就绪。
对于一个裸 Pod,我可以知道 Pod 的开始时间和结束时间。然后我可以计算持续时间。
但是对于由 Deployment、StatefulSet、DaemonSet 创建的 Pod,我找不到任何时间标志来指示Pod第一次准备就绪。
我想知道准备好 Pod 花了多少时间。不是 Pod 的时代。
解决方案
最简单的方法是订阅 api-server 以在集群中发生某些更改时通知您。
例如,我发出:
$ kubectl get pods --output-watch-events --watch
然后创建了一个新的 pod。这是输出:
EVENT NAME READY STATUS RESTARTS AGE
ADDED example-pod 0/1 Pending 0 0s
MODIFIED example-pod 0/1 ContainerCreating 0 0s
MODIFIED example-pod 0/1 Running 0 19s
MODIFIED example-pod 1/1 Running 0 23s
这里有一点解释:
- 如您所见,第一个事件是 ADDED 并且处于 Pending 状态,这意味着刚刚创建了 pod 对象。
- 第二个事件是 ContainerCreating 状态的 MODIFIED,年龄为 0,这意味着将 pod 分配/调度到节点的时间不到 1 秒。现在 kubelet 开始下载 continer 镜像。
- 第三个事件有 Running 状态,意思是 continer 开始运行。查看年龄列,您可以看到自上次事件以来花费了 19 秒,因此下载图像并启动容器大约需要 19 秒。如果您查看 READY 列,您可以看到 0/1 值,因此容器正在运行但尚未处于就绪状态。
- 第四个事件已将 READY 列设置为 1/1,因此就绪探测已成功通过。如果您现在查看年龄列,您会发现检查就绪探测和更改 pod 状态大约需要 4 秒 (32-19)。
如果这些信息不够,您可以使用--output=
参数来接收每次更改的完整 pod 规范。
你也可以玩kubectl get events
来接收更多的事件。当然,通过添加--watch
标志,您可以实时观看事件。
如果您想要更高级别的 felxibility,请使用专用的kubernetes clinet 库而不是 kuebctl 来接收并处理此信息。
推荐阅读
- python - Is there a faster way to uniformly format first- and surnames on a pandas dataframe?
- unit-testing - Specify individual header files for CMake instead of full directory
- c# - How to properly add new item to ObservableCollection from another thread?
- c# - Explicit cast required for Enumerable.Empty
- keras - Keras 自动编码器输出跳到零
- r - bca.ci 中的错误(boot.out,conf,index[1L],L = L,t = to,t0 = t0.o,:估计调整“w”是无限的
- .htaccess - 子域重定向到外部 url 路径并保留子域的名称
- java - 针对特定的 Micronaut WebSocket 连接
- android - Display emojis with skin color variation in a textfield via unicode
- google-apps-script - ConvertApi 和 Google Script:我有时会收到“合并 pdf 时出现错误 500”,但并非总是如此