【问题标题】:kubernetes how to collect log file without stdout or stderrkubernetes 如何在没有 stdout 或 stderr 的情况下收集日志文件
【发布时间】:2017-05-27 09:32:04
【问题描述】:

我的 pod 有多个日志文件,例如 php-fpm + nginx 堆栈。如何收集日志文件?

我知道 nginx 是用符号链接来做的。但这不能处理超过 2 个日志文件。

我想将主机中的卷挂载到 pod,但是如何为每个 pod 设置不同的文件夹?有没有办法将主机中以podname命名的文件夹挂载到pod文件夹/logs

raychaser 提供了一种将文件夹收集到/var/log/containers/ 的方法,但我认为它不适用于 kubernetes。

【问题讨论】:

  • 这和stdout/stderr有什么关系?这是“kubernetes stdout”的最佳结果,但我可以告诉它与它无关

标签: kubernetes


【解决方案1】:

最后,我找到了收集日志的方法。

  1. 确保所有应用程序都将所有日志文件写入一个文件夹,例如 /med/log
  2. 确保所有应用程序都使用脚本启动作业,例如 entrypoint.sh
  3. 在挂载卷中创建一个以 $HOSTNAME 命名的文件夹,例如 /log/$HOSTNAME
  4. 链接文件夹:ln -sf /log/$HOSTNAME /med/log

在k8s中,需要将主机日志文件夹/var/log/k8s/挂载到/log。日志目录如下所示:

/var/log/k8s/
|-- app1-${container_id}/
|   |-- access.log
|   |-- error.log
|-- app2-${container_id}/
    |-- access.log
    |-- error.log

【讨论】:

  • 这很好,但是会带来消耗整个 /var/ 磁盘并导致其他 pod 或服务失败的风险。有一个 PR 提议要在即将推出的 k8s 中创建一个 logDir,从而启用资源限制。
  • 您也可以尝试利用--log-dir=XXX
  • 谢谢,Subodh,你的意思是kubectl --logtostderr=false --log-dir=/med/log?并且你能把“PR 提案在即将到来的 k8s 中创建 logDir”解释清楚吗?
  • 是的,这就是预期的使用方式。该提案的实施是相同的。谢谢赵。
【解决方案2】:

您可以使用 Fluentd 之类的日志记录解决方案,它允许您定义多个信息源。由于您有多个日志文件,因此它可能适用于您的用例。

http://docs.fluentd.org/v0.12/articles/quickstart http://docs.fluentd.org/v0.12/articles/config-file

【讨论】:

  • 但是fluentd只收集主机文件,如/var/lib/docker/containers/*/var/log/container/*,不能收集容器中的文件,除非你把日志挂载到主机上。但是我们如何确保每个容器都挂载到主机中的不同文件夹呢?
猜你喜欢
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
相关资源
最近更新 更多