GKE 上的日志堆栈使用fluentd从容器运行时写入节点的日志中挑选日志,如方法stdout
中所示。stderr
node logging agent
这与您在使用时所做的没有太大区别kubectl logs
:
当您kubectl logs
在基本日志记录示例中运行时,节点上的 kubelet 会处理请求并直接从日志文件中读取,并在响应中返回内容。
您的问题听起来不像 Stackdriver 不够快,但是,您的容器运行时由于某种原因没有将日志写入上述日志文件,其中 fluentd 在导出之前选择日志。
在更改日志架构之前,您可能希望确定 pod 失败的原因,甚至自定义终止消息路径,以便以后使用自定义的 fluentd 日志收集器检索它。
如果这不能满足您的需求,您可以尝试使用Elasticsearch。
至于 sidecar 方法,虽然它是完全可行的,但官方文档警告了这种方法的一些缺点:
在 sidecar 容器中使用日志代理会导致大量资源消耗。此外,您将无法使用 kubectl logs 命令访问这些日志,因为它们不受 kubelet 控制。
最后,您还应该考虑到所有先前的信息都依赖于容器进入创建阶段并且能够写入日志文件这一事实。如果您的容器有“早期退出”,这意味着甚至没有创建,那么日志可能甚至一开始都不存在,并且 Stackdriver 永远不会选择它们。
编辑:
提到您还想考虑失败的容器需要写入两个输出,stdout
并且stderr
. 如果它“静默”地失败,也不会反映在 Stackdriver 中。