Kubernetes的程序日志文件在哪里?

4ktjp1zp  于 2022-12-11  发布在  Kubernetes
关注(0)|答案(6)|浏览(449600)

当我奔跑
$ kubectl logs <container>
我得到了我的吊舱的日志。
但是这些日志的 * 文件 * 在哪里?
一些来源说/var/log/containers/,其他人说/var/lib/docker/containers/,但我找不到我的实际应用程序或pod的日志。

mzillmmw

mzillmmw1#

简短答案:

如果您使用Docker,每个容器的stdout存储在/var/lib/docker/containers中。但是Kubernetes还创建了一个目录结构来帮助您查找基于Pod的日志,这样您就可以找到在/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/节点上运行的每个Pod的容器日志。

更详细的答案:

Docker捕获来自每个容器的stdout日志,并将它们存储在主机上的/var/lib/docker/containers中。如果Kubernetes使用Docker作为容器运行时,Docker也会将容器日志存储在Kubernetes节点上的该位置。(我们运行Pod),Kubernetes还创建/var/log/pods//var/log/containers目录,以帮助我们更好地组织基于Pod的日志文件。
/var/log/pods/中的每个目录都存储单个Pod的日志,每个目录都使用<namespace>_<pod_name>_<pod_id>结构命名。
您可以通过运行kubectl get pod -n core gloo-76dffbd956-rmvdz -o jsonpath='{.metadata.uid}'来获取Pod的ID。如果您习惯于使用yq,您可能会发现运行kubectl get pod <pod_name> -o yaml | yq r - metadata.uid更直接。
在每个/var/log/pods/<namespace>_<pod_name>_<pod_id>/目录中有多个目录,每个目录代表Pod中的一个容器。这些目录的名称与容器的名称相同。最后,当我们查看/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/目录时,我们会发现指向/var/lib/docker/containers中Docker存储的日志文件的符号链接。
类似地,在/var/log/containers/目录中有指向/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/目录的符号链接,这些符号链接使用<pod_name>_<namespace>_<container_id>结构命名。

hjqgdpho

hjqgdpho2#

你在那些目录里看到什么了吗?
在我的集群中,来自每个单元的stdout/stderr日志位于/var/log/containers中,但存在一些链接/重定向:

/var/log/containers/<pod-name>_<namespace>_<container-name-container-id>.log -> /var/log/pods/<some-uuid>/<container-name>_0.log

该日志实际上链接到/var/lib/docker

<container-name>_0.log -> /var/lib/docker/containers/<container-id>/<container-id>-json.log
tzxcd3kk

tzxcd3kk3#

磁盘上的文件名来自

docker inspect $pod_name_or_sha | jq -r '.[0].LogPath'

假设docker守护进程的配置是默认的{"log-driver": "json-file"},如果kubectl logs行为正确,那么几乎可以保证它是真的。
这可能也是不言而喻的,但是您必须在为docker inspect调度Pod的节点上,或者在磁盘上探查日志文件的存在,以做任何有帮助的事情。kubectl describe pod $pod_name将呈现节点名称,或者如果您希望以编程方式获取它,您可能怀疑它将在kubectl get -o json pod $pod_name中。

7z5jn7bk

7z5jn7bk4#

取决于k8s版本:

*1.14之前:/var/log/pods/<pod_id>/<name>/<num>.log
*1.14或更高版本/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/<num>.log(请参阅此PR

两个符号上方的文件链接到Docker文件,例如/var/lib/docker/containers/<container-id>/<container-id>-json.log
例如:

pgky5nke

pgky5nke5#

在我的pod中,var/内没有日志目录...而是有名为spool www等的目录...我在哪里可以找到日志...因为我可以在运行命令“kubectl logs”后获得它们。

s5a0g9ez

s5a0g9ez6#

日志由每个节点上的kubelet管理。当您运行kubectl logs <pod>时,它会将请求传递到pod正在运行的节点上的kubelet,并读取关联的日志文件。
你可以看到这里的架构

相关问题