У меня была такая же проблема с одним сторонним приложением. Он записывал журналы в файл журнала, и я хотел, чтобы Fluentd мог их получить, поэтому я хотел как-то распечатать их на stdout. Я нашел обходной путь с одним дополнительным контейнером, работающим вместе с контейнером приложения в том же модуле.
Допустим, приложение стороннего производителя пишет журналы в следующем файле:
/ some /folders/logs/app_log_file.log
В следующем модуле будут запущены два контейнера, один с приложением, а другой с изображением 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 / folder / logs в контейнере приложения и в папку / var / log в контейнере средства извлечения журнала. Теперь каждый файл, который контейнер приложения записывает в / some / folder / logs, будет также виден в / var / log. Вот почему в образе busybox запускается команда оболочки:
sleep 60 && tail -n+1 -f /var/log/app_log_file.log
Сначала мы ждем 60 секунд, потому что у контейнера приложения должно быть время для запуска и создания файла журнала, а затем команда tail будет печатать каждую новая строка в файле журнала к стандартному выводу контейнера средства сбора журналов.
И теперь fluentd сможет получать журналы из файла журнала контейнера приложения, получая журналы стандартного вывода контейнера сбора журналов.