内容提要
Kubernetes节点中有一个记录当前Image FS使用情况的信息,可以通过CRI的标准来使用crictl命令获取相关信息。通过挖掘crictl命令和kubelet的源代码,可以获取imagefsinfo的使用量和容量。
延伸解读
Kubelet 如何获取 imageFS 信息
Kubelet 自身不直接记录 imageFS 的使用情况,而是通过 CRI 标准向底层容器运行时请求。具体来说,Kubelet 调用 CRI 的 ImageFsInfo 接口获取文件系统信息,包括 fsId 和 usedBytes。然后,Kubelet 使用 fsId 中的挂载点路径,通过 cadvisor 的 GetDirFsInfo 方法获取该挂载点的详细文件系统信息,如 available、capacity 和 inodes 等。最终,这些信息被汇总并暴露给 Kubernetes API。
crictl 与 kubectl 数据一致性验证
使用 crictl imagefsinfo 命令可以直接从容器运行时获取 imageFS 信息,其返回的 usedBytes 值与 kubectl 查询节点 stats summary 得到的 usedBytes 完全一致。这表明 Kubernetes 报告的数据确实来源于容器运行时。但 crictl 输出仅包含 usedBytes 和 inodesUsed,而 available 和 capacity 则由 Kubelet 通过 cadvisor 进一步获取,因此 crictl 本身不提供这些字段。
挂载点与 df 命令的对应关系
crictl imagefsinfo 返回的 fsId 中包含挂载点路径,例如 /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs。Kubelet 使用该路径调用 cadvisor 获取文件系统信息。实际验证中,该路径对应的文件系统信息与 df 命令查看 /var 分区的结果几乎吻合,说明 imageFS 的统计本质上是基于容器运行时使用的存储挂载点,通过标准文件系统接口获取的。
Q&A
Kubernetes 节点如何获取 Image FS 的使用情况?
Kubelet 通过 CRI 标准向底层容器运行时请求 ImageFSInfo,获取文件系统的使用情况,包括 available、capacity 和 used 等。
如何使用 crictl 命令查看 imagefsinfo?
运行 `crictl imagefsinfo` 命令,可以获取 imagefsinfo 的详细信息,包括 fsId、usedBytes 和 inodesUsed 等。
Kubernetes 中 imageFs 的 available 和 capacity 是如何计算的?
Kubelet 通过 CRI 获取 fsId,然后使用 fsId 中的 mountpoint 调用 cadvisor 的 GetDirFsInfo 方法获取文件系统的 available 和 capacity,这些值与 df 命令的输出相符。
crictl imagefsinfo 的输出与 Kubernetes 报告的数据一致吗?
是的,crictl imagefsinfo 显示的 usedBytes 与 Kubernetes 报告的一致,但 crictl 不解释 available 和 capacity 的计算方式。
Kubelet 源代码中如何处理 imageFs 信息?
Kubelet 在 cri_stats_provider.go 中通过 getFsInfo 函数,使用 fsId 的 mountpoint 调用 cadvisor 获取文件系统信息,并填充 available、capacity、inodesFree 等字段。
fsId 在 Kubernetes 中有什么作用?
fsId 是 FilesystemIdentifier,包含 mountpoint,用于获取对应挂载点的文件系统信息,从而计算 available 和 capacity 等。