当我跑步时
$ kubectl logs <container>
我得到了我的豆荚的日志。
但那些日志的文件在哪里?
有些消息来源说/var/log/containers/
其他人说/var/lib/docker/containers/
,但我无法找到我的实际应用程序或pod的日志。
答案 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版本:
/var/log/pods/<pod_id>/<name>/<num>.log
/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/<num>.log
(请参阅此PR)两个符号上方的文件都链接到docker文件,例如/var/lib/docker/containers/<container-id>/<container-id>-json.log
。
例如:
答案 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架构