代码之家  ›  专栏  ›  技术社区  ›  gcstr

库伯内特斯的吊舱日志文件在哪里?

  •  19
  • gcstr  · 技术社区  · 7 年前

    当我跑步时

    $ kubectl logs <container>

    我得到了我的吊舱的日志。

    但是 文件夹 那些日志?

    有消息称 /var/log/containers/ 其他人说 /var/lib/docker/containers/ 但我找不到我的实际应用程序或pod的日志。

    5 回复  |  直到 5 年前
        1
  •  31
  •   d4nyll    5 年前

    简短回答:

    如果您使用的是Docker stdout 从每个容器中存储 /var/lib/docker/containers . 但是Kubernetes还创建了一个目录结构来帮助您查找基于Pod的日志,这样您就可以在 /var/log/pods/<namespace>_<pod_name>_<pod_id>/<container_name>/ .


    更长的答案:

    Docker陷阱 标准装置 每个容器中的日志,并将其存储在 /var/lib/docker/containers 在主机上。如果Kubernetes使用Docker作为容器运行时,Docker还会将容器日志存储在Kubernetes节点的该位置。但由于我们不直接在Kubernetes中运行容器(我们运行Pods),Kubernetes还创建了 /var/log/pods/ /var/log/containers 目录,帮助我们更好地基于POD组织日志文件。

    中的每个目录 /变量/日志/pods/ 存储单个Pod的日志,每个日志都使用结构命名 <namespace>_<pod_name>_<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/<命名空间(>)_&书信电报;pod\U名称>_&书信电报;pod\U id>/&书信电报;容器名称(&U)/ 目录中,我们将找到Docker存储的日志文件的符号链接 /var/lib/docker/containers .

    类似地,在 /var/log/containers/ 目录是指向 /var/log/pods/<命名空间(>)_&书信电报;pod\U名称>_&书信电报;pod\U id>/&书信电报;容器名称(&U)/ 目录这些符号链接使用结构命名 <pod_name>_<namespace>_<container_id> .

        2
  •  6
  •   erk    7 年前

    你在那些目录里看到什么了吗?

    在我的集群中,来自每个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
    
        3
  •  5
  •   mdaniel    7 年前

    磁盘上的文件名来自

    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 如果您希望以编程方式获取它。

        4
  •  3
  •   NiYanchun    4 年前

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

        5
  •  -1
  •   Christiaan Vermeulen    5 年前

    日志由每个节点上的kubelet管理。当你跑步时 kubectl logs <pod> ,它将请求传递给pod所在节点上的kubelet,并读取相关的日志文件。

    您可以看到架构 here