Kubernetes предоставляет ряд абстракций для управления экосистемой сервисов. С их помощью решены проблемы с виртуализацией, сетевым взаимодействием и системами хранения данных. Однако централизованное хранение и сбор журналов в этом списке отсутствуют.
Восстановление контекста, в рамках которого работало приложение, или трассировка хода обработки запроса пользователя усложняются вместе с ростом количества участников.
В зависимости от предъявляемых требований способ агрегации может отличаться. В общем виде журналирование может быть организовано в одном из следующих подходов, или их комбинаций:
На каждом узле кластера запускается агент. Его задача - передача логов в хранилище. Он может быть развернут как отдельный процесс в операционной системе или запущен в контейнере, управляемом kubernetes.
Запуск агента отдельным процессом оправдан в случае специфичных требований к окружению и производительности, или же он управляется другой системой оркестрации.
Более простой и удобный способ запуска агента - в контейнере под управлением kubernetes. DaemonSet позволяет запускать поды в рамках выделенных узлов кластера. Таким образом достаточно настроить агента один раз: kubernetes сам запустит под на каждом новом узле кластера.
Применяется в ситуациях, где нужен более тонкий контроль в журналировании. Например, когда сбор логов необходим лишь для некоторых приложений и требуются дополнительные манипуляции с этими логами.
Подход очень гибок в построении выделенных схем журналирования. Может паралельно существовать с другими решениями.
Его недостаток - повышенный расход ресурсов из-за необходимости запуска копии агента для каждого пода.
Применяется в ситуациях, где используются собственные решения в журналировании. Например, если сбор логов производится через специальный протокол или управляется частью экосистемы.
Стандартная схема построения центролизованной системы журналирования строится на агентах на уровне сервера. В приложениях, к которым не может быть применен общий подход, применяется агент журналирования на уровне пода (например, они пишут свои логи в файлы, а не стандартный вывод). Прямая запись в хранилище логов из приложения может использоваться в случаях агрегации журналов в специфичных задачах.