Kubernetes'哪里有? pods日志文件?

时间:2017-12-20 22:30:14

标签: kubernetes kubectl

当我跑步时

$ kubectl logs <container>

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

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

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

5 个答案:

答案 0 :(得分:2)

简短答案:

如果您使用的是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节点上的该位置。但是,由于我们没有直接在Kubernetes中运行容器(我们运行Pods),因此Kubernetes还创建了/var/log/pods//var/log/containers目录,以帮助我们更好地基于Pods组织日志文件。

/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>/目录中查看时,我们会找到指向Docker存储在/var/lib/docker/containers内部的日志文件的符号链接。

类似地,在/var/log/containers/目录中是指向/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/目录的符号链接。这些符号链接使用结构<pod_name>_<namespace>_<container_id>命名。

答案 1 :(得分:1)

磁盘文件名来自

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

答案 2 :(得分:1)

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

例如:

enter image description here

答案 3 :(得分:0)

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

在我的群集中,每个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

答案 4 :(得分:0)

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

您可以看到here架构