【发布时间】:2020-04-13 04:18:20
【问题描述】:
我是 k8s 日志存储的堆栈。我们有无法输出到标准输出的日志,但必须保存到目录。我们想保存到 glusterfs 共享目录,例如 /data/logs/./xxx.log 我们的应用程序是用java编写的,我们怎么能这样做
【问题讨论】:
标签: kubernetes fluentd
我是 k8s 日志存储的堆栈。我们有无法输出到标准输出的日志,但必须保存到目录。我们想保存到 glusterfs 共享目录,例如 /data/logs/./xxx.log 我们的应用程序是用java编写的,我们怎么能这样做
【问题讨论】:
标签: kubernetes fluentd
这主要取决于您的 CRI 插件,通常是 Docker 命令行选项。默认情况下,它们已经写入本地磁盘,您只需将卷安装在正确的位置(可能是 /var/log/containers 或类似的,查看您的 Docker 配置)。
【讨论】:
我在使用一个第 3 方应用程序时遇到了同样的问题。它在日志文件中写入日志,我希望 Fluentd 能够获取它们,所以我想以某种方式将它们打印到标准输出上。 我找到了一种解决方法,即在同一个 pod 中与应用容器一起运行一个额外的容器。
假设第 3 方应用正在以下文件中写入日志:
/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: {}
如您所见,此清单正在创建一个空卷并将卷挂载到应用容器中的 /some/folders/logs 文件夹和日志提取器容器中的 /var/log 文件夹。现在,应用程序容器写入 /some/folders/logs 的每个文件也将在 /var/log 中可见。 这就是为什么busybox镜像运行一个shell命令的原因:
sleep 60 && tail -n+1 -f /var/log/app_log_file.log
首先我们等待 60 秒,因为应用容器必须有时间启动并创建日志文件,然后 tail 命令会将日志文件中的每个新行打印到日志提取器容器的标准输出。
现在 fluentd 将能够从应用容器的日志文件中获取日志,获取日志提取器容器的标准输出日志。
【讨论】: