Kubernetes 的 pods 日志文件在哪里?

Where are Kubernetes' pods logfiles?

当我运行

$ kubectl logs <container>

我得到了 pods 的日志。

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

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

您在这些目录中看到任何内容了吗?

在我的集群中,来自每个 pod 的 stdout/stderr 日志在 /var/log/containers 中,但是有一些 linking/redirection:

/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

磁盘文件名来自

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

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

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

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

可以看到架构here

简答:

如果您使用 Docker,每个容器中的 stdout 存储在 /var/lib/docker/containers 中。但是 Kubernetes 也创建了一个目录结构来帮助你根据 Pods 找到日志,所以你可以在 /var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/.[=29= 的节点上找到每个 Pod 运行ning 的容器日志]


更长的答案:

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>.

结构命名

You can get the ID of a Pod by running kubectl get pod -n core gloo-76dffbd956-rmvdz -o jsonpath='{.metadata.uid}'. If you're used to using yq, you may find running kubectl get pod <pod_name> -o yaml | yq r - metadata.uid more straight-forward.

在每个 /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>.

命名

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

例如: