16

当我跑

$ kubectl logs <container>

我得到了我的豆荚的日志。

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

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

4

5 回答 5

25

简短的回答:

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


更长的答案:

Docker 从每个容器中捕获stdout日志并将它们存储在/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>

于 2019-11-18T19:53:50.940 回答
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

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

<container-name>_0.log -> /var/lib/docker/containers/<container-id>/<container-id>-json.log
于 2017-12-21T01:49:59.297 回答
5

磁盘文件名来自

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

假设 docker daemon 的配置是 default ,如果行为正确{"log-driver": "json-file"},这几乎可以保证为 true 。kubectl logs

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

于 2017-12-21T01:55:17.073 回答
3

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

例如:

在此处输入图像描述

于 2020-05-14T10:09:04.487 回答
-1

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

你可以在这里看到架构

于 2019-09-19T06:02:06.927 回答