如何将K8S Pod日志保存到主机磁盘

时间:2020-04-13 04:18:20

标签: kubernetes fluentd

我在k8s日志存储库中堆叠。我们有无法输出到stdout的日志,但必须保存到dir。我们要保存到glusterfs共享目录,例如/data/logs/./xxx.log应用是用Java编写的,我们该怎么做

2 个答案:

答案 0 :(得分:1)

这主要取决于您的CRI插件,通常是Docker命令行选项。默认情况下,它们已经确实写入本地磁盘,您只需要在正确的位置安装卷即可(可能是/ var / log / containers或类似的文件,请查看Docker配置)。

答案 1 :(得分:1)

我在一个第三方申请中遇到了同样的问题。它是在日志文件中写入日志,我希望Fluentd能够获取它们,所以我想以某种方式在stdout上打印它们。 我发现了一种解决方法,可以在同一个容器中同时运行一个附加容器和应用容器。

让我们说第三方应用程序正在以下文件中写入日志:

/some/folders/logs/app_log_file.log

以下pod将运行两个容器,一个运行应用程序,另一个运行busybox映像,我们将使用它们从应用程序容器中获取日志。

apiVersion: v1
kind: Pod
metadata:
  name: application-pod
spec:
  containers:
  - name: app-container
    image: <path-to-app-image>
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: log-volume
      mountPath: /some/folders/logs
  - name: log-fetcher-container
    image: busybox
    args: [/bin/sh, -c, 'sleep 60 && tail -n+1 -f /var/log/app_log_file.log']
    volumeMounts:
    - name: log-volume
      mountPath: /var/log
  volumes:
  - name: log-volume
    emptyDir: {}

正如您所看到的,清单是在app容器中的/ some / folders / logs文件夹和log fetcher容器中的/ var / log文件夹中创建一个空卷并将其装入。现在,应用程序容器写入/ some / folders / logs的每个文件也将在/ var / log中可见。 这就是busybox映像运行shell命令的原因:

sleep 60 && tail -n+1 -f /var/log/app_log_file.log

首先,我们等待60秒钟,因为应用程序容器必须有时间启动并创建日志文件,然后tail命令将在日志文件中的每一行都打印到日志提取器容器的标准输出。

现在,流利的人将能够从应用程序容器的日志文件中获取日志,从而获取日志提取器容器的标准输出日志。