【问题标题】:Centralised application logging in kubernetesKubernetes 中的集中式应用程序日志记录
【发布时间】:2019-07-10 22:20:29
【问题描述】:

我们正在运行基于 java 的微服务,我们有以下场景

  • 应用程序将 debug.log 文件写入 /opt/tomcat/logs/debuglog/debug.log,日志文件大小为 1GB/小时
  • Tomcat 写入 catalina.out 、 localhost_access_log 和 localhost.log ,日志大小均为 1GB/小时

问题是当我们有大量日志需要集中分析时如何解决这个问题。我们正在运行这个应用程序的 20 个实例。我们在平面文件中有 150GB 的日志。以下是问题,

  • 根据我们的 SLA 将日志存储在 GCS 中 3 年
  • 解析这些日志并将它们存储在 BQ for bigdata 中 1 年
  • 解析这些日志并将它们存储在 ELK 中 7 天,以便开发人员分析任何运行问题

我们正在尝试评估以下内容,

  • 由于 kubernetes 建议为应用程序日志运行 sidecar,考虑到 catalina.out 将转到标准输出,我们最终可能会运行 3 个 sidecar。我们可以使用 Stack-driver 处理日志并将它们放到 GCS 中。我们看到的问题是容器爆炸,特别是自动缩放。其他问题是将日志从 stackdriver 解析到 BigQuery 或 ELK。
  • 在容器中安装 GCS 并自行写入。问题是 GCS 是社区驱动的,而不是生产就绪。我们仍然需要编写解决方案来再次解析这些日志
  • 使用外部驱动器挂载到 Minion 并将卷挂载到容器。每个 VM 运行 1 个容器以处理不同管道和场景的日志。这为我们解决了一些问题,例如:缩减规模时日志不会丢失,没有容器爆炸,单个负责任的容器来处理不同的管道,根据可用性将日志移动到 GCS。我们看到的问题是在扩展和缩减时管理连接到每个 VM 的 SSD 存储。

欢迎提出任何建议。

编辑

我们最终在 GCP 上使用自定义管道,其中应用程序将日志推送到发布/订阅,而数据流负责聚合和转换信息。

【问题讨论】:

    标签: logging kubernetes google-cloud-pubsub


    【解决方案1】:

    您可以使用运行 fluentdlogstash 之类的单个 Sidecar。 两者都是可以使用多个插件自定义的日志摄取工具,允许您一次路由到所有目的地。 对于logstash,您甚至可能想要使用filebeat。

    另外,fluentd 似乎有一个official plugin from Google that does most of what you want

    使用 DaemonSets 收集主机日志

    这是in this k8s blog post about cluster-level loggingthis blog post in the fluentd blog 描述的过程。

    这个想法是运行一个 DaemonSet(一组运行在集群中每个节点上的 pod),它挂载容器日志文件所在的主机路径。

    但是,这只会将您的应用程序生成的日志收集到标准输出。 要收集其他的,您可以使用here 中描述的技术:运行一个非常轻量级的sidecar,它只跟踪日志文件。

    【讨论】:

    • 你能指导我使用解决方案 3 作为我们应该采取哪些安全措施,考虑到 kubernetes 持久卷进行读写和安全取出数据,以防自动缩放
    • 我已经更新了我的答案。不幸的是,我从来没有使用过这个设置,所以它的细节不是很丰富......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2019-02-11
    • 1970-01-01
    • 2020-01-19
    • 2020-11-11
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多