当我跑
$ kubectl logs <container>
我得到了我的豆荚的日志。
但是这些日志的文件在哪里?
一些消息来源说/var/log/containers/
其他人说/var/lib/docker/containers/
但我找不到我的实际应用程序或 pod 的日志。
当我跑
$ kubectl logs <container>
我得到了我的豆荚的日志。
但是这些日志的文件在哪里?
一些消息来源说/var/log/containers/
其他人说/var/lib/docker/containers/
但我找不到我的实际应用程序或 pod 的日志。
简短的回答:
如果您使用的是 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>
。
您在这些目录中看到任何内容吗?
在我的集群中,来自每个 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
磁盘文件名来自
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
这取决于 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
.
例如:
日志由每个节点上的 kubelet 管理。当您运行时kubectl logs <pod>
,它会将请求传递给您的 pod 正在运行的节点上的 kubelet,并读取关联的日志文件。
你可以在这里看到架构