Как восстановить журналы из контейнеров AWS EC2 и Docker безошибочно?

В настоящее время у нас есть следующие настройки:

Несколько машин AWS EC2, на некоторых из которых работает Docker Container, на некоторых нет докеров. Для извлечения системных журналов, журналов веб-сервера (Apache) и журналов приложений у нас есть агент Fluentd (td-agent), работающий на экземпляре EC2. Это пересылка сообщений журнала ошибок на централизованный сервер Fluentd (агрегатор журналов), который затем, в свою очередь, отправляет их в Graylog. Для журналов доступа все td-агенты в экземплярах перенаправляют их непосредственно в AWS Kinesis Firehose, который, в свою очередь, сохраняет их на S3 каждые 5 минут (в буфере) и будет доступен для поиска AWS Athena. Журналы доступа к контейнерам Docker записываются в stdout, а журналы ошибок - в stderr. Драйвер ведения докера для fluentd используется для пересылки их на td-agent, установленный на соответствующем хост-компьютере.

Теперь есть некоторые проблемы с этой настройкой:

  1. Журналы доступа не могут быть просмотрены в режиме реального времени (например, в целях отладки разработчиками)
  2. Кэширование / буферизация td-агентов может стать проблемой при высоких нагрузках
  3. Кеширование / буферизация контейнеров td-agent или Docker может стать проблемой, когда агрегатор журналов или td-агенты не работают

Мы не используем CloudWatch Logs из-за цены и других причин. Работа с реальными файлами журналов также будет означать, что нам нужно будет регулярно их вращать, обращать внимание на дисковое пространство и т. Д. Последний момент может быть решен с помощью RAM-диска или отдельного диска. Но это не решило бы реальную проблему наличия фиксированного размера кэша / буфера, который мог бы заполниться, и блокирования входящих журналов.

Как лучше подходить к этой проблеме? Есть ли лучшие практики в отношении регистрации контейнеров Docker?

1 ответ

Решение

В случае, если кто-то еще споткнется здесь и задастся вопросом, как это сделать, вот каковы были наши варианты и что мы наконец-то сделали:

  1. Свободный драйвер журнала Docker: Было бы здорово, но вы не можете легко ограничить размер плагина вывода файла. Хаки с только просмотром буфера также не были успешными.
  2. Драйвер json-файла докера: Вы можете ограничить количество файлов журнала, а также их размер. Они легко доступны для просмотра docker logs, но они предназначены только для пользователя root. Они не предназначены для хвоста автоматизированной системой. Поверь мне, я попробовал это, и оно того не стоило. Несколько недостатков, включая отсутствие поддержки tag директива td-agent использует не менее 30 секунд для использования файлов журналов новых контейнеров и так далее.
  3. Драйвер системного журнала Docker: это то, что мы используем сейчас. Поддерживает tag, могут просматриваться и отображаться другими пользователями для просмотра в реальном времени и прекрасно работают с td-agent. Недостатки: добавляет еще один сервис и накладные расходы. Не поддерживает docker logs, Также может быть проблема с ограничением скорости и т. Д.
Другие вопросы по тегам