我正在寻找从Kubernetes的一个Pod中捕获日志的两种用例:
npm i socket.io-client
kubectl logs ---
传递到stackdriver
对于这两个用例,一切都正常,但是,当容器由于错误而提前退出时,我会丢失日志(即,堆栈驱动程序没有足够快地拾取它们)。
此延迟记录在某处吗?并且假设stackdriver不够快,是否还有另一种日志记录解决方案会更有效?我正在考虑使用一个可以捕获日志的Sidecar容器,但是我不确定这是否是最好的方法。
答案 0 :(得分:1)
GKE上的日志记录栈使用fluentd从stdout
,stderr
中选择container runtime writes to the nodes, as show in the node logging agent
approach的日志。
这与您使用kubectl logs
时的操作much different不同:
如基本日志记录示例中那样运行
kubectl logs
时,节点上的kubelet会处理请求并直接从日志文件中读取,并返回响应中的内容。
您发出听起来好像Stackdriver不够快,但是,由于某种原因,您的容器运行时未将日志写入上述日志文件中,流利的在导出前先选择了日志。
在更改日志记录体系结构之前,您可能需要determine the reasons for pod failure甚至customize the termination message path,以便以后使用custom fluentd log collector对其进行检索。
如果这不符合您的需求,您可以尝试使用Elasticsearch。
对于sidecar方法,虽然它是完全可行的,但official documentation警告这种方法存在一些缺点:
在小车集装箱中使用日志记录代理会导致大量资源消耗。而且,您将无法使用kubectl logs命令访问这些日志,因为它们不受kubelet控制。
最后,您还应该考虑到所有以前的信息都取决于容器进入创建阶段并且能够写入日志文件这一事实。如果您的容器具有“ 早期出口”,即aren't even created,则日志甚至可能没有开始的位置,并且Stackdriver永远不会选择它们。
编辑:
要提及的是,您还想考虑一个失败的容器需要同时写入两个输出stdout
和stderr
。如果它“无声地”失败,那也不会反映在Stackdriver中。