访问k8 pod中的日志

时间:2018-02-16 03:13:30

标签: kubernetes

我们有一个k8集群。我试图从内部访问日志,kubectl将无法在内部工作。 k8中存储的日志在哪里? 我们没有systemd,在文档中找到:

 If systemd is not present, they write to .log files in the /var/log directory. System components inside containers always write to the /var/log directory, bypassing the default logging mechanism.

但我在这里找不到任何记录。那么如何才能从pod内部kubectl logs访问这些日志? 如果没有任何记录机制设置,默认日志记录如何在k8中工作?

PS:我确实经历过其他类似的帖子而且没有运气。

3 个答案:

答案 0 :(得分:1)

如果应用程序没有登录到文件,它有时可能会记录到stdoutkubectl logs <pod name>也应该显示)。

  1. 您可以尝试docker logs <name or ID of the container
  2. 如果/var/log目录未在容器中安装的卷中保留,则当pod重新启动或在群集中移动时,它将丢失,因为/var/log目录将是短暂的。检查pod是否已在群集中重新启动或移动。
  3. 通过执行以下操作查找pod是否使用任何卷进行/var/log的持久存储:

    kubectl get <pod name> -o yaml | grep -i volume
    kubectl get persistentvolumes --all-namespaces
    kubectl get persistentvolumeclaims --all-namespaces      
    

答案 1 :(得分:0)

如果您要通过kubectl logs获取要访问的日志,则表示它们最终输出到stdout或stderr。 Docker和kubelet在标准输出之上工作,以自己的方式处理这些日志(即通过记录插件)。当你的进程向sdtout抛出一些东西时,它显然不会存储在容器的本地文件系统的任何地方。

也就是说,您可以将应用配置为记录到文件,但请注意您需要处理日志转换,清理等,否则您的容器将永久增长。如果你不能并行使用,你可以从docker / kubernetes日志中删除它们,但这并不是那么好。如果是这种情况,您可以在边车中创建一个进程,从挂载的卷读取日志文件并将它们发送到stdout / stderr。

真正的问题是为什么你需要访问POD内的日志。知道可能有更好的方法来实现你所需要的东西(即通过一些解析器进程首先管道它们)。

答案 2 :(得分:0)

我明白应用程序只是登录容器内的文件/目录。

你能用

吗?

kubectl exec -it <podname> bash

kubectl exec -it <podname> sh

进入容器/ pod并检查容器内的日志。