Я предлагаю одно решение, которое я сейчас выбрал для себя. Это не тот ответ, который я искал, но тот, который, кажется, плывет по течению.
Мне все еще любопытно, может ли это быть обработано какой-либо общей командой Unix.
Во всяком случае, вот что я сделал:
Обычный способ, кажется, использует инструмент под названием свободно, что позволяет собирать логи из различных источников и
транспортируйте их в любое место, которое вы считаете нужным - своего рода ETL для журналов.
Я решил отправить журналы на сервер системного журнала, так как он у меня уже был запущен, но вы можете выбрать любой из выходных плагинов здесь: Плагины вывода.
Также имеется большой набор дополнительных плагинов: Все плагины
Шаг 1
Получите установку Fluentd с установленным подключаемым модулем remote_syslog. Этого нет в официальном образе докера, но вы можете настроить его самостоятельно.
ОТ свободно/свободно:v1.14.0-1.0
ПОЛЬЗОВАТЕЛЬ root
# https://github.com/fluent-plugins-nursery/fluent-plugin-remote_syslog
RUN fluent-gem install fluent-plugin-remote_syslog
ПОЛЬЗОВАТЕЛЬ свободно говорит
Создайте образ и отправьте его в реестр.
Шаг 2
Затем настройте манифест развертывания Fluentd с утверждениями тома только для чтения для доступа к журналам модулей. Фактические файлы находятся в /var/log/pods/*, а /var/log/containers фактически содержит символические ссылки. Нам нужны настоящие файлы.
Эти журналы принадлежат пользователю root на хост-компьютере, и обычный пользователь не будет иметь доступа для их чтения.
Нам нужно установить некоторые контексты безопасности. Чтобы все заработало, я использовал корневую группу для fsGroup.
Не стесняйтесь копать глубже и найти / прокомментировать наиболее оптимальное решение для этой безопасности.
apiVersion: приложения/v1
вид: развертывание
...
спецификация:
...
спецификация:
безопасностьКонтекст:
фсГрупп: 0
тома:
- имя: varlogpods-pv
персистентволумеклайм:
ClaimName: pvc-var-log-pods
...
контейнеры:
- имя: свободно
изображение: ваше/свободное изображение
См. мой полный манифест в этой сути: свободное развертывание
Шаг 3
Перед развертыванием вам также необходимо настроить свободно.conf
и описать там некоторые правила.
Мой настроен на соответствие строке журнала следующим образом:
2022-04-26T20:05:00.847016854+03:00 stderr F time="2022-04-26 17:05:00" level=info msg="обработка 3 записей..."
Подробнее о плагине tail: хвост
<source>
@type tail
@id in_tail_container_logs
path "/var/log/pods/default_cron-*/*/*.log"
pos_file "/tmp/cron_.log.pos"
read_from_head true
tag cron
<parse>
@type regexp
expression /^(?<logtime>[^ ]*) .* level=(?<level>[^ ]*) msg="(?<message>[^"]*)"$/
time_key logtime
time_format %FT%T.%N%:z
</parse>
</source>
<match cron>
@type remote_syslog
host 172.16.3.10
port 514
protocol udp
severity info
program "fluentd"
hostname "k3sserver"
<buffer>
</buffer>
<format>
@type single_value
message_key message
</format>
</match>
Один важный атрибут конфигурации здесь read_from_head истина
который читает файлы журнала сверху.
Это необходимо для этого сценария, поскольку журналы модулей меняются, и мы хотим, чтобы Fluentd считывал полный журнал модулей, а не только несколько строк обновления в конце. Для короткого задания cron файл журнала просто появляется, и tail не сообщает о каких-либо начальных строках в нем.
Шаг 4
Поиграйся с конфигом и попробуй, попробуй еще раз.
Не забудьте перезапустить развертывание после обновления конфигурации в configMap.
Несколько фрагментов из поисковой выдачи: