我们有一个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中工作?
答案 0 :(得分:1)
如果应用程序没有登录到文件,它有时可能会记录到stdout
(kubectl logs <pod name>
也应该显示)。
docker logs <name or ID of the container
/var/log
目录未在容器中安装的卷中保留,则当pod重新启动或在群集中移动时,它将丢失,因为/var/log
目录将是短暂的。检查pod是否已在群集中重新启动或移动。通过执行以下操作查找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并检查容器内的日志。