解释镜像拉取日志消息,以便在Kubernetes中可视化镜像拉取延迟

oo7oh9g9  于 2023-04-29  发布在  Kubernetes
关注(0)|答案(1)|浏览(182)

bounty还有5天到期。回答此问题可获得+50声望奖励。Michael希望引起更多关注这个问题。

我正在查看我们在日志聚合工具(Splunk,但不重要)中看到的Kubernetes日志,并且我试图可视化一天中的图像拉取速度。日志中显示的消息如下所示:
已成功提取图像“ www.example.com 中的“com”
值1。100152244s是一个字符串,所以显然不能用于可视化。字符串本身可以以多种格式出现:
1.100152244s 4m4。第六十四章.10064ms
这是一个愚蠢的问题,但我们在这段时间后看到了什么单位?这些是纳秒吗
先谢谢你

93ze6v8z

93ze6v8z1#

免责声明:在撰写本文时,我不是Kubernetes内部的Maven,也不了解Go。(但是,我熟悉K8s组件的一般功能,也熟悉高级/低级编程语言。..)经过大约10分钟的研究,我得到了满意的答案:
问题

在这一时期之后我们看到了什么单位?这些是纳秒吗

简短回答

简短的答案在于时间。去吧

长回答

Kubernetes事件“* Successful pulling imagein*”由kubelet组件生成。Kubelet 主要负责管理pod及其容器(的生命周期)。它为容器执行的各个阶段生成事件,包括image pulling。因此,你提到的事件是 kubelet 在容器执行的镜像拉取阶段生成的。(至少我已经知道了这一点)。
你似乎有一个kubelet〈= release-1。24在使用中。在此生成相应的事件:

..., fmt.Sprintf("Successfully pulled image %q in %v", container.Image, time.Since(startTime)), ...

duration字符串来自time.Since(startTime)Duration)stament。fmt.Sprintf对该Duration值调用func (d Duration) String() string方法,该方法将根据以下条件生成一个字符串输出:

  • 如果持续时间小于一秒,则以较小的单位显示,例如“12”。345µs”或“678 ns”。
  • 如果持续时间在一秒到一分钟之间,则以秒为单位显示,例如“5s”或“42”。123456s”。
  • 如果时长在一分钟到一小时之间,则以分钟和秒为单位显示,如“3 m45 s”或“59 m59 s”。
  • 如果持续时间超过一小时,则以小时、分钟和秒显示,例如“1h 42 m”或“12 h34 m56 s”。

也许你可以在Splunk中开发合适的模式,将这种格式转换为可视化所需的时间单位(使用if-else条件也可能有所帮助,例如:g.值包括“h”、“m”和“s”?然后使用正则表达式(\d+)h(\d+)m(\d+\.?\d*)s从e中提取值。g.“2h10m10.100152244s”)。

旁注

kubelet的更新版本(〉release-1.24)似乎使用稍微不同的log

..., fmt.Sprintf("Successfully pulled image %q in %v (%v including waiting)", container.Image, imagePullResult.pullDuration, time.Since(startTime)), ...

例如
已成功在8中提取图像“xyz”。831719579s(8.831722421 s包括等待)

相关问题