Kubernetes的Pod日志文件在哪里?

gcs*_*str 7 logging kubernetes kubectl kubelet

当我跑步

$ kubectl logs <container>

我得到了豆荚的日志。

但是这些日志的文件在哪里?

一些消息来源说/var/log/containers/其他人说,/var/lib/docker/containers/ 但我找不到我的实际应用程序或pod的日志。

d4n*_*yll 19

简答:

如果您使用 Docker,则stdout来自每个容器的/var/lib/docker/containers. 但是 Kubernetes 也创建了一个目录结构来帮助您查找基于 Pod 的日志,因此您可以在/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/.


更长的答案:

Dockerstdout从每个容器捕获日志并将它们存储在/var/lib/docker/containers主机上。如果 Kubernetes 使用 Docker 作为容器运行时,Docker 还会将容器日志存储在 Kubernetes 节点上的该位置。但是由于我们不直接在 Kubernetes 中运行容器(我们运行 Pods),因此 Kubernetes 也创建了/var/log/pods//var/log/containers目录,以帮助我们更好地组织基于 Pods 的日志文件。

内的每个目录都/var/log/pods/存储单个 Pod 的日志,每个目录都使用结构命名<namespace>_<pod_name>_<pod_id>

您可以通过运行来获取 Pod 的 ID kubectl get pod -n core gloo-76dffbd956-rmvdz -o jsonpath='{.metadata.uid}'。如果您习惯使用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>/目录时,我们会发现 Docker 中存储的日志文件的符号链接/var/lib/docker/containers

同样,/var/log/containers/目录内部是指向目录的符号链接/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/。这些符号链接使用结构命名<pod_name>_<namespace>_<container_id>

  • Kubernetes 端的什么工具管理 /var/log/pods 和 /var/log/containers 的创建,以及创建/删除容器时的符号链接? (2认同)

erk*_*erk 6

你在这些目录中看到了什么吗?

在我的集群中,来自每个 pod 的 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
Run Code Online (Sandbox Code Playgroud)

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

<container-name>_0.log -> /var/lib/docker/containers/<container-id>/<container-id>-json.log
Run Code Online (Sandbox Code Playgroud)


mda*_*iel 5

磁盘文件名来自

docker inspect $pod_name_or_sha | jq -r '.[0].LogPath'
Run Code Online (Sandbox Code Playgroud)

假设 docker 守护进程的配置是默认的{"log-driver": "json-file"},如果kubectl logs行为正确,这几乎可以保证为真。

这也可能不言而喻,但您必须在 Pod 被安排在其上的节点上docker inspect,或者嗅探磁盘上是否存在日志文件,才能做任何有用的事情。kubectl describe pod $pod_name将呈现节点名称,或者kubectl get -o json pod $pod_name如果您希望以编程方式获取它,您可能会怀疑它会在其中。


NiY*_*hun 5

取决于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.

例如:

在此输入图像描述