Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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