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
.
例如:
当我运行
$ 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 usingyq
, you may find runningkubectl 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
.
同样,在 /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
.
例如: