如何查看 k8s 容器向临时存储写入的内容

Jes*_*sse 1 kubernetes ephemeral-storage

我们的一个容器正在使用临时存储,但我们不知道为什么。在容器中运行的应用程序不应向磁盘写入任何内容。

我们将存储限制设置为 20MB,但它仍然被驱逐。我们可以增加限制,但这似乎是一个创可贴。

我们不确定这个容器正在写入什么或写入何处,而且我也不知道如何检查。当容器被驱逐时,我能看到的唯一信息是容器超出了其存储限制。

是否有一种有效的方法来了解正在编写的内容,或者是我们梳理代码的唯一选择?

moz*_*llo 5

向主题添加详细信息。

Pod 使用临时本地存储来存储暂存空间、缓存和日志。 由于其他 Pod 填充了本地存储,Pod 可能会被驱逐,之后新的 Pod 不会被接纳,直到回收足够的存储空间。

kubelet 可以使用本地临时存储向 Pod 提供临时空间,以将emptyDir卷挂载到容器中。

  • 对于容器级别的隔离,如果容器的可写层和日志使用量超过其存储限制,kubelet 会将 Pod 标记为驱逐。

  • 对于 Pod 级别的隔离,kubelet 通过对该 Pod 中容器的限制求和来计算出总体 Pod 存储限制。在这种情况下,如果所有容器的本地临时存储使用量以及 Pod 的emptyDir 卷的总和超过了 Pod 的总体存储限制,那么 kubelet 也会将该 Pod 标记为驱逐。

要查看自 pod 启动以来写入了哪些文件,您可以运行:

find / -mount -newer /proc -print
Run Code Online (Sandbox Code Playgroud)

这将输出比“/proc”更新的文件列表。

/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/run/secrets
/run/secrets/kubernetes.io
/run/secrets/kubernetes.io/serviceaccount
/run/nginx.pid
/var/cache/nginx
/var/cache/nginx/fastcgi_temp
/var/cache/nginx/client_temp
/var/cache/nginx/uwsgi_temp
/var/cache/nginx/proxy_temp
/var/cache/nginx/scgi_temp
/dev
Run Code Online (Sandbox Code Playgroud)

另外,尝试不使用“-mount”选项。

要查看是否有任何新文件被修改,您可以在 Pod 中运行以下命令的一些变体:

while true; do rm -f a; touch a; sleep 30; echo "monitoring..."; find / -mount -newer a -print; done
Run Code Online (Sandbox Code Playgroud)

并使用命令检查文件大小du -h someDir

另外,正如 @gohm'c 在他的回答中指出的那样,您可以使用 sidecar/ephemeral 调试容器。

在此处阅读有关本地临时存储的更多信息。