Регистрация Fluentd на kubernetes пропускает журналы при ротации журналов - PullRequest
0 голосов
/ 29 июня 2018

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

  • В модуле запущен сервис и контейнер с коляской (называемый logger).
  • Службы записывают данные в файл, контейнер с дополнительной тележкой читает этот файл и записывает его в стандартный вывод.
  • Fluentd daemonset сконфигурирован для чтения выходных данных (которые собраны в файле в /var/log/containers/*_logger-*.log, который является ссылкой на другой файл (последний файл с момента последнего вращения файла, на более старые файлы, без ссылок) .
  • Всегда 3 сообщения журнала принадлежат друг другу (одни и те же поля)

Эта конфигурация работает, как и ожидалось, для тысяч сообщений.

Однако вот в чем проблема:

Я заметил, что fluentd иногда только перенаправляет сообщения журнала 1 или 2 из 3 сообщений, которые принадлежат друг другу, хотя все 3 сообщения написаны службой и контейнером коляски.

Для пояснения предположим, что 1 перенаправлен, 2 и 3 нет. После некоторых исследований я обнаружил, что в таких случаях сообщение 1 является последним сообщением перед поворотом журнала, сообщения 2 и 3 находятся в другом файле (где символическая ссылка указывает с момента ротации, и поэтому должна быть прочитана).

Таким образом, похоже, что fluentd пропускает некоторые строки, прежде чем продолжить чтение нового файла после ротации журнала kubernetes.

  • Это известная проблема?
  • Почему флюэнт и куберне ведут себя так?
  • И главный вопрос: Что я могу сделать, чтобы предотвратить такое поведение, чтобы получать все сообщения журнала?

Я использую docker-image fluent/fluentd-kubernetes-daemonset:v0.12.33-elasticsearch

Если требуется дополнительная информация, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 04 февраля 2019

TLDR

Теоретически это должно работать с последней версией fluentd-kubernetes-daemonset. Если это не значение по умолчанию rotate_wait, вероятно, его придется перезаписать для конфигурации in_tail_container_logs из-за проблем с синхронизацией.

Для этого вам нужно создать собственный образ докера, который будет перезаписывать файл kubernetes.conf, или использовать карту конфигурации с вашей пользовательской конфигурацией, смонтировать ее в контейнере и установить FLUENT_CONF в основной файл конфигурации в смонтированном каталоге.

Объяснение

Процесс docker читает как из stdout, так и из stderr контейнера. При сбрасывании потоков в файл журнала он также будет отслеживать установленные ограничения. Когда лимит будет достигнут, начнется ротация журнала.

В то же время Fluentd смотрит символическую ссылку. Когда символическая ссылка изменится, средство просмотра файла fluentd будет запущено, чтобы обновить свой внутренний указатель на фактический файл журнала и сбросить позицию в файле pos, потому что вновь созданный файл журнала пуст.

Используя параметр config rotate_wait, мы говорим fluentd ждать установленное количество секунд (по умолчанию 5), чтобы можно было выбрать последние строки журнала, которые были сброшены в файл (или скоро будут) прежде чем мы продолжим с недавно созданным файлом журнала. Это также обеспечит обработку строк журнала в правильном порядке.

...