logging - Kubernetes (GKE) 的日志记录解决方案
问题描述
我正在寻找从 kubernetes 中的 pod 捕获日志以用于两个用例:
- 实时 -> 我现在正在使用
kubectl logs ---
的 - 不是实时的-> 使用
stackdriver
管道传输到bigquery
对于这两个用例,一切正常,但是,当容器由于错误而提前退出时,我会丢失日志(即 stackdriver 没有足够快地获取它们)。
这种延迟是否记录在某处?假设 stackdriver 不够快,是否还有另一种日志记录解决方案可以证明更有效?我正在考虑使用一个可捕获日志的 sidecar 容器,但我不确定这是否是最佳方法。
解决方案
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 中。
推荐阅读
- terraform - 在 Terragrunt 中应该如何声明全局资源?
- python - 用于有条件地提取重复项的 Python 代码
- asp.net-core - 使用 Auth0 进行身份验证的 Blazor SPA 在回调时失败
- python - 比较两个不同格式的列表
- jquery - CSS 规则不适用于从 jquery 附加的元素
- azure - Configure Postman to Test Get New Access Token from Azure AD B2C
- python - 每个文件与文件夹的Python shutil复制选项
- java - 当此 JPA 调用是从 @Async 方法的 catch 块进行时,在 JPA 中使用主键删除单个记录不生效
- google-apps-script - 不同类型数据的不同对齐方式
- javascript - 如何正确地将图像分配给状态和功能?