首页 > 解决方案 > Kubernetes (GKE) 的日志记录解决方案

问题描述

我正在寻找从 kubernetes 中的 pod 捕获日志以用于两个用例:

  1. 实时 -> 我现在正在使用kubectl logs ---
  2. 不是实时的-> 使用stackdriver管道传输到bigquery

对于这两个用例,一切正常,但是,当容器由于错误而提前退出时,我会丢失日志(即 stackdriver 没有足够快地获取它们)。

这种延迟是否记录在某处?假设 stackdriver 不够快,是否还有另一种日志记录解决方案可以证明更有效?我正在考虑使用一个可捕获日志的 sidecar 容器,但我不确定这是否是最佳方法。

标签: loggingkubernetesgoogle-kubernetes-enginemonitoringsidecar

解决方案


GKE 上的日志堆栈使用fluentd从容器运行时写入节点的日志中挑选日志,如方法stdout所示stderrnode logging agent

这与您在使用时所做的没有太大区别kubectl logs

当您kubectl logs在基本日志记录示例中运行时,节点上的 kubelet 会处理请求并直接从日志文件中读取,并在响应中返回内容。

您的问题听起来不像 Stackdriver 不够快,但是,您的容器运行时由于某种原因没有将日志写入上述日志文件,其中 fluentd 在导出之前选择日志。

在更改日志架构之前,您可能希望确定 pod 失败的原因,甚至自定义终止消息路径,以便以后使用自定义的 fluentd 日志收集器检索它。

如果这不能满足您的需求,您可以尝试使用Elasticsearch

至于 sidecar 方法,虽然它是完全可行的,但官方文档警告了这种方法的一些缺点:

在 sidecar 容器中使用日志代理会导致大量资源消耗。此外,您将无法使用 kubectl logs 命令访问这些日志,因为它们不受 kubelet 控制。

最后,您还应该考虑到所有先前的信息都依赖于容器进入创建阶段并且能够写入日志文件这一事实。如果您的容器有“早期退出”,这意味着甚至没有创建,那么日志可能甚至一开始都不存在,并且 Stackdriver 永远不会选择它们。

编辑:

提到您还想考虑失败的容器需要写入两个输出,stdout并且stderr. 如果它“静默”地失败,也不会反映在 Stackdriver 中。


推荐阅读