Как я могу сохранить логи k8s pod на диск хоста? - PullRequest
0 голосов
/ 13 апреля 2020

Я нахожусь в хранилище логов k8s. У нас есть логи, которые не могут быть выведены на стандартный вывод, но должны быть сохранены в dir. Мы хотим сохранить в общий каталог glusterfs, например /data/logs/./xxx.log приложения написаны на java, как мы можем это сделать

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

У меня была такая же проблема с одним сторонним приложением. Он записывал журналы в файл журнала, и я хотел, чтобы 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 сможет получать журналы из файла журнала контейнера приложения, получая журналы стандартного вывода контейнера сбора журналов.

1 голос
/ 13 апреля 2020

Это в основном зависит от вашего плагина CRI, обычно Docker параметры командной строки. По умолчанию они уже выполняют запись на локальный диск, вам просто нужно смонтировать том в нужном месте (вероятно, / var / log / Containers или аналогичный, посмотрите на ваш Docker config).

...