Docker捕获来自每个容器的stdout日志,并将它们存储在主机上的/var/lib/docker/containers中。如果Kubernetes使用Docker作为容器运行时,Docker也会将容器日志存储在Kubernetes节点上的该位置。(我们运行Pod),Kubernetes还创建/var/log/pods/和/var/log/containers目录,以帮助我们更好地组织基于Pod的日志文件。 /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>/目录时,我们会发现指向/var/lib/docker/containers中Docker存储的日志文件的符号链接。 类似地,在/var/log/containers/目录中有指向/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/目录的符号链接,这些符号链接使用<pod_name>_<namespace>_<container_id>结构命名。
假设docker守护进程的配置是默认的{"log-driver": "json-file"},如果kubectl logs行为正确,那么几乎可以保证它是真的。 这可能也是不言而喻的,但是您必须在为docker inspect调度Pod的节点上,或者在磁盘上探查日志文件的存在,以做任何有帮助的事情。kubectl describe pod $pod_name将呈现节点名称,或者如果您希望以编程方式获取它,您可能怀疑它将在kubectl get -o json pod $pod_name中。
6条答案
按热度按时间mzillmmw1#
简短答案:
如果您使用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节点上的该位置。(我们运行Pod),Kubernetes还创建/var/log/pods/
和/var/log/containers
目录,以帮助我们更好地组织基于Pod的日志文件。/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>/
目录时,我们会发现指向/var/lib/docker/containers
中Docker存储的日志文件的符号链接。类似地,在
/var/log/containers/
目录中有指向/var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/
目录的符号链接,这些符号链接使用<pod_name>_<namespace>_<container_id>
结构命名。hjqgdpho2#
你在那些目录里看到什么了吗?
在我的集群中,来自每个单元的stdout/stderr日志位于
/var/log/containers
中,但存在一些链接/重定向:该日志实际上链接到
/var/lib/docker
:tzxcd3kk3#
磁盘上的文件名来自
假设docker守护进程的配置是默认的
{"log-driver": "json-file"}
,如果kubectl logs
行为正确,那么几乎可以保证它是真的。这可能也是不言而喻的,但是您必须在为
docker inspect
调度Pod的节点上,或者在磁盘上探查日志文件的存在,以做任何有帮助的事情。kubectl describe pod $pod_name
将呈现节点名称,或者如果您希望以编程方式获取它,您可能怀疑它将在kubectl get -o json pod $pod_name
中。7z5jn7bk4#
取决于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
。例如:
pgky5nke5#
在我的pod中,var/内没有日志目录...而是有名为spool www等的目录...我在哪里可以找到日志...因为我可以在运行命令“kubectl logs”后获得它们。
s5a0g9ez6#
日志由每个节点上的kubelet管理。当您运行
kubectl logs <pod>
时,它会将请求传递到pod正在运行的节点上的kubelet,并读取关联的日志文件。你可以看到这里的架构