首页 > 解决方案 > 如何找出 Pod 花费的时间?

问题描述

我有一个要求,我想知道 Pod 花费的每一部分时间。

  1. 拉一个 docker 镜像需要多少时间?也许一个 Pod 有多个 initContainers 和容器。我想知道他们的每一部分。

也许我可以使用“kubectl describe pod-name ...”来分析事件

  1. Pod 准备好多少时间?从被创建和准备就绪。

对于一个裸 Pod,我可以知道 Pod 的开始时间和结束时间。然后我可以计算持续时间。

但是对于由 Deployment、StatefulSet、DaemonSet 创建的 Pod,我找不到任何时间标志来指示Pod一次准备就绪。

我想知道准备好 Pod 花了多少时间。不是 Pod 的时代。

标签: kubernetes

解决方案


最简单的方法是订阅 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 来接收并处理此信息。


推荐阅读