Логирование – это процесс сбора, записи и хранения данных о различных событиях, действиях и состоянии системы или приложения в определенном формате. Данный процесс относится к такому свойству распределенных систем, как наблюдаемость или observability.
Источник изображения: thealgorists.com
Данные, которые собираются в процессе логирования, могут включать в себя:
В Kubernetes логирование – это процесс сбора, управления и анализа логов, сгенерированных контейнерами приложения и компонентами Kubernetes для выполнения мониторинга, отладки и обнаружения проблем в среде кластера.
В данной инструкции мы рассмотрим процесс логирования в среде Kubernetes, начиная от ее архитектуры и заканчивая инструментами для обработки логов.
kube
В данном разделе инструкции мы рассмотрим архитектуру сбора логов в Kubernetes.
Ниже будут приведены основные уровни сбора логов:
Каждый под фиксирует логи своих контейнеров, сгенерированные приложением. Вы можете изучить их сразу после создания и настройки пода, используя для этого командную строку.
Источник изображения: kubernetes.io
На картинке выше изображен процесс логирования на уровне контейнеров пода. Здесь некоторый контейнер app-container
пода my-pod
отправляет логи в стандартные потоки stdout
и stderr
контейнеризированного приложения, где stdout
– это поток вывода, а stderr
– ошибок. Агент kubelet
, подключенный к среде выполнения контейнера с помощью CRI, отвечает за обработку и контроль логов, собранных контейнером.
Чтобы посмотреть логи пода в Kubernetes, необходимо воспользоваться следующей командой:
kubectl logs название_пода
Кроме того, вы можете столкнуться с ситуацией, когда внутри вашего пода развернуто несколько контейнеров, а логи нужны только от одного из них. Для этого к предыдущей команде необходимо добавить специальный флаг и имя контейнера:
kubectl logs название_пода -c название_контейнера
В результате выполнения команд будут показаны журналы, сгенерированные контейнером или целым подом приложения. Они могут содержать информацию о статусе приложения, ошибках или успешных и неудачных операциях.
Если на рабочих узлах установлена systemd
, то kubelet
записывает системные логи в journald
, а для их чтения используется команда:
journalctl -u kubelet
Если на узле отсутствует systemd
, то запись логов будет осуществляться в log-файлы в каталог /var/log
.
В K8s отсутствует встроенная возможность ведения журнала на уровне кластера. Для ее реализации пользователи используют разные подходы. Ниже приведем два самых распространенных способа обработки логов:
logging-agent
) на уровне узла.Источник изображения: kubernetes.io
Один из способов сбора и обработки логов в Kubernetes на уровне кластера — это использование агента ведения журналов на уровне узла. Этот агент (например, Fluentd или Logstash) является компонентом, работающим на каждом узле кластера. Он отвечает за сбор, обработку и отправку логов агрегатору. Его интеграция происходит за счет объекта DaemonSet
, который добавляет копию агента на каждый рабочий узел кластера.
sidecar
на уровне пода или узла.Sidecar — это дополнительный контейнер, который работает вместе с основным контейнером в одном поде или на одном узле. Правильно настроенный sidecar
-контейнер собирает логи из файла, сокета или journald
, а затем передает их в собственные потоки stdout
или stderr
.
Источник изображения: kubernetes.io
Для сбора логов разных форматов рекомендуется настраивать несколько sidecar
-контейнеров. В таком случае каждый из них будет перенаправлять логи из общего тома в свой поток stdout
.
Чтобы посмотреть на собранные логи, можно воспользоваться уже знакомой командой:
kubectl logs название_пода название_sidecar-контейнера
В данном разделе инструкции мы рассмотрим некоторые популярные инструменты с открытым исходным кодом, которые подойдут для сбора логов в Kubernetes.
Fluentd и Fluent Bit – это два агента ведения логов, которые предназначены для сбора, фильтрации, агрегации и передачи логов в различных средах, в том числе и в Kubernetes. Fluentd больше подойдет для обработки собранных логов из-за наличия различных плагинов. Fluent Bit, в свою очередь, подойдет для сбора логов и их отправки конечным адресатам.
Fluent Operator – это инструмент, разработанный для управления и автоматического развертывания агентов Fluentd и Fluent Bit в среде Kubernetes. Он упрощает процесс их установки, настройки и масштабирования в кластере с помощью ресурсов Custom Resource Definitions (CRD). С помощью Fluent Operator пользователь может развернуть каждый из агентов по отдельности, либо Fluent Bit в сочетании с Fluentd.
Процесс работы с Fluent Operator изображен на следующей картинке:
Источник изображения: github.com
Ниже перечислены пользовательские ресурсы Fluent Operator:
Взаимосвязь и работа ресурсов представлены на следующей картинке:
Источник изображения: github.com
ELK Stack – это комбинация трех популярных инструментов для сбора, агрегации, обработки и визуализации данных логов: Elasticsearch, Logstash и Kibana. C 2015 года к ним был добавлен Beats для повышения производительности, а весь стек был переименован в Elastic Stack.
Рабочий процесс ELK Stack представлен на картинке ниже:
Источник изображения: medium.com
Здесь Beats и Logstash совместно выполняют сбор и обработку логов, Elasticsearch хранит их, а Kibana создает визуализацию.
Подготовили для вас выгодные тарифы на облачные серверы
В среде Kubernetes существует множество источников логов, которые, в целях улучшения системы, необходимо собирать и обрабатывать. В настоящей инструкции мы рассмотрели архитектуру логирования в Kubernetes, а также изучили процесс ведения логов на разных уровнях. Кроме того, были продемонстрированы инструменты для сбора и агрегирования логов, такие как Fluent Operator (Fluentd и Fluent Bit) и Elastic Stack.