Олег Марков
Использование логирования в Kubernetes
Введение
Работая с Kubernetes, вы сталкиваетесь с большим количеством компонентов, сервисов и приложений, работающих в кластере. Для эффективной диагностики, поиска и решения проблем крайне важно организовать грамотное логирование ваших приложений и самого Kubernetes. Лог-файлы позволяют оперативно отслеживать ошибки, аномалии и получать информацию о работе сервисов, без которых поддержка современной инфраструктуры невозможна.
Давайте посмотрим, какие типы логирования вы можете встретить в кластере Kubernetes, какой подход лучше выбрать для архитектуры сбора логов, как их централизировать, визуализировать и анализировать. Все нюансы – от стандарта stdout/stderr
до интеграции с такими системами как ELK (Elasticsearch, Logstash, Kibana), Loki, Fluentd и другими популярными инструментами – разберём на понятных примерах и с подробными пояснениями.
Что такое логирование в Kubernetes
Логирование в Kubernetes – это процесс сбора, хранения и анализа сообщений от запущенных контейнеров, самих компонентов Kubernetes (kubelet, apiserver, controller-manager и др.), а также системных логов узлов (нод). Лог-файлы используются для мониторинга, отладки, аудита и автоматизации задач управления кластером.
Ключевой особенностью Kubernetes является то, что контейнеры зачастую являются "эфемерными" – перезапускаются, переезжают между нодами, и у них нет постоянной файловой системы. Поэтому логирование отличается по сравнению с традиционным миром монолитных приложений.
Типы логов в Kubernetes
Логи контейнеров
Когда вы запускаете приложение внутри контейнера, стандартной практикой является вывод логов в стандартные потоки вывода (stdout
) и ошибок (stderr
). Смотрите, что происходит: Docker (или другой контейнер-рантайм) захватывает этот вывод и сохраняет его в файлы на хосте (например, в /var/log/containers
). Затем Kubernetes или сторонние инструменты могут собирать эти файлы для дальнейшего анализа.
Пример логирования в Go-приложении:
// Этот код выводит сообщение в стандартный поток вывода
log.Println("Service started successfully")
Важно: Не рекомендуется писать логи с привязкой к локальным файлам внутри контейнера (например, /app/logs/service.log
), потому что эти файлы исчезнут при удалении или перезапуске контейнера.
Логи узлов (нод)
На каждой виртуальной или физической машине (ноде), которую использует ваш кластер, имеются собственные системные логи. Примеры:
/var/log/messages
(общесистемные логи)/var/log/syslog
(в системах на основе Debian/Ubuntu)/var/log/kubelet.log
(лог kubelet-агента)
Эти логи играют вспомогательную роль, чаще используются администраторами для диагностики системного уровня.
Логи компонентов кластера
Kubernetes сам по себе состоит из различных сервисов и компонентов, каждый из которых хранит свои журналы:
- kube-apiserver
- kube-controller-manager
- kube-scheduler
- etcd
Сообщения этих сервисов формируют важный слой для анализа и аудита работы кластера.
События Kubernetes
Не стоит путать логи с эвентами. События (Events) – это специфические уведомления о важных изменениях состояния объектов кластера. Посмотреть их можно командой:
kubectl get events
Эвенты важны для отслеживания нарушений, проблем старта подов, проблем с образами, но они не заменяют полноценных логов.
Лучшие практики логирования в Kubernetes
1. Всегда выводите логи в stdout/stderr
Поскольку контейнеры могут быть пересозданы или перемещены, не используйте локальные файлы для логирования. Все современные системы сбора логов поддерживают захват стандартного вывода, поэтому просто пишите:
console.log('App started')
// Или для ошибок:
console.error('Error occurred')
// В Python:
print("Started processing task")
import sys
print("Error in processing", file=sys.stderr)
Вы облегчаете себе последующую интеграцию с инфраструктурой логирования.
2. Используйте структурированное логирование
Структурированные логи (обычно в формате JSON) позволяют делать более сложный поиск и фильтрацию. Например, в Go:
log.Printf(`{"level":"info","msg":"Order created","order_id":%d,"user_id":%d}`, 1234, 567)
Аналогично для Node.js/Python можно использовать форматтеры, которые выводят логи в виде JSON-объектов.
3. Настройте агрегатор логов
Развернутый кластер производит огромное количество логов; собирать их централизованно – мастхэв. Стандартные инструменты:
- Fluentd
- Logstash
- Loki (от Grafana Labs)
- Filebeat
- Vector
С их помощью вы можете буквально "тащить" логи со всех узлов, фильтровать, перекидывать в базы логов (Elasticsearch, S3, Kafka) и просматривать через удобные веб-интерфейсы.
4. Учитывайте ротацию и хранение логов
Лог-файлы могут быстро вырасти до гигантских размеров. Kubernetes сам управляет ротацией контейнерных логов, например, на базовом уровне Docker:
- по умолчанию сохраняет до 10 файлов по 10 МБ (можно менять параметры через
/etc/docker/daemon.json
).
Ротация логов на хосте нужна, чтобы не "забить" диск старым мусором.
Способы сбора логов в Kubernetes
Sidecar-контейнер для логирования
Один из популярных паттернов: в каждый Pod добавляете отдельный контейнер (sidecar), который занимается сбором и отправкой логов. Очень удобно, если вам нужно логировать специфические данные, объединять несколько потоков логов или парсить нестандартные форматы.
Пример Pod-манифеста с sidecar:
apiVersion: v1
kind: Pod
metadata:
name: logger-demo
spec:
containers:
- name: app
image: your-app
volumeMounts:
- name: logs
mountPath: /logs
- name: log-shipper
image: fluentd
volumeMounts:
- name: logs
mountPath: /logs
volumes:
- name: logs
emptyDir: {}
Здесь оба контейнера имеют доступ к общей директории /logs
. Sidecar собирает логи, которые ваш основной контейнер пишет туда (если без stdout
, но лучше не замыкать только на этом способе).
Демон-сеты для сбора логов
Классическая схема – на каждую ноду разворачивается демонсет, например, с Fluentd, Filebeat, Vector или Logagent. Демонсет в Kubernetes – это POD, запускаемый на каждой (или выбранных) ноде.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd:v1.13
resources:
limits:
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
Этот способ прозрачен для ваших приложений – они просто пишут логи в stdout, а демонсет собирает файлы на каждой машине и пересылает их дальше.
Сбор логов из stdout/stderr
Ручным способом можно просмотреть логи любого пода:
kubectl logs podname
Для получения логов всех контейнеров в POD:
kubectl logs podname -c containername
Для "живого" просмотра (фолловинг):
kubectl logs -f podname
Для поиска логов только за последний запуск, особенно если контейнер перезапускался:
kubectl logs --previous podname
Архитектура централизованного логирования
Когда логов много и они нужны для анализа, не обойтись без централизованных решений. Принятые схемы:
- Логи собираются с каждой ноды (через демонсет), отправляются в брокер (например, Kafka или Logstash), затем в систему хранения и поиска (часто Elasticsearch).
- Визуализация через Kibana, Grafana, Loki – при этом поиск делается мгновенным и удобным.
- Хранение логов регулируется политиками – старые логи архивируются или удаляются.
Совет: обращайте внимание на аутентификацию и контроль доступа к логам – там могут содержаться чувствительные данные.
Примеры популярных систем централизованного логирования
ELK Stack (Elasticsearch, Logstash, Kibana)
- Elasticsearch – индексирует и хранит данные логов.
- Logstash – агрегирует, фильтрует и трансформирует логи.
- Kibana – для просмотра, визуализации и анализа.
Базовый пайплайн:
- Приложения выводят логи в stdout.
- Filebeat или Fluentd (через демонсет) читает логи на ноде.
- Отправляет их в Logstash/Elasticsearch.
- Просмотр через Kibana.
Loki и Grafana
- Loki – современное решение для скалируемого сбора и поиска логов (аналогично Prometheus, только для логов).
- Grafana – отображает, фильтрует и анализирует логи.
Loki легче и проще в поддержке, меньше ресурсов (не строит индексы, как Elasticsearch), быстро внедряется в Kubernetes через Helm чарты.
Другие инструменты
- Graylog – распространяемый, поддерживает UDP и GELF форматы.
- Splunk – платформа для enterprise-auditing, мощный анализатор.
- Sentry – часто используется для логирования ошибок (но не полной лог-агрегации).
Тонкости интеграции и отладки логирования
Использование аннотаций и метаданных
Система агрегирования может добавлять к логам информацию о namespace, поде, контейнере, label – чтобы вы могли находить нужный лог по любому признаку.
Обработка мультинейминга (мульти-контейнерных подов)
В логах появляется дополнительное поле "container_name". Пример структурированного лога с помощью Filebeat:
{
"log": "User has logged in",
"kubernetes": {
"container_name": "app",
"namespace_name": "production",
"pod_name": "my-app-5468f4fcf6-jtk37"
}
}
Логирование на уровне ingress-контроллеров
Иногда вы захотите получить доступ к логам входящего трафика. Большинство ingress-контроллеров (Nginx Ingress, Traefik) поддерживают свой формат логирования. Обыщайте их документацию для настройки.
Пример развертывания централизованного логирования с помощью Helm
Helm позволяет быстро развернуть такие решения как Loki или ELK.
Команда для установки Loki:
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install loki grafana/loki-stack --namespace=loki --create-namespace
Команда для установки ELK (Elasticsearch, Kibana, Filebeat):
helm repo add elastic https://helm.elastic.co
helm install elasticsearch elastic/elasticsearch --namespace=logs --create-namespace
helm install kibana elastic/kibana --namespace=logs
helm install filebeat elastic/filebeat --namespace=logs
Не забудьте настроить политики доступа, ротацию и ресурсы!
Мониторинг и алертинг на основе логов
Не ограничивайтесь только просмотром логов — подключайте алертинг! Очень распространенная практика – ставить триггеры (например, на HTTP 500 ошибок) и получать уведомления (Slack, Telegram, email).
В Grafana Alerts или ElastAlert (для ELK) можно задать выражения, по которым система "поднимает тревогу".
В итоге, Kubernetes предлагает гибкую и мощную основу для построения системы логирования. Вы не ограничены одним инструментом или схемой сбора – инфраструктуру можно и нужно адаптировать под размеры и задачи вашего бизнеса. Главное – не полагаться на логи, локализованные в контейнере, и заранее строить централизованную, отказоустойчивую схему.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Как получить логи всех подов в одном namespace?
Вы можете использовать такой однострочник:
bash
for p in $(kubectl get pods -n my-namespace -o name); do
kubectl logs -n my-namespace $p;
done
Это выведет последовательность логов от всех подов в выбранном namespace.
Как видеть логи уже удаленного pod, если контейнер перезапустился?
Kubernetes сохраняет логи только для текущих и предыдущих контейнеров (при рестарте). Если под был удалён, его логи теряются. Чтобы этого избежать, настройте централизованный сбор логов через демонсет (Fluentd, Filebeat, Loki), который пишет логи в базу или в облако.
Что делать если логи не выводятся командой kubectl logs?
Проверьте, не завершился ли контейнер мгновенно после запуска. Если да — используйте флаг --previous
для просмотра логов предыдущей инстанции. Также убедитесь, что контейнер вообще выводит логи в stdout/stderr и не пишет их только во внутренние файлы.
Как ограничить размер логов на ноде и сделать их ротацию?
Для Docker настройте файл /etc/docker/daemon.json
:
json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Перезапустите Docker: systemctl restart docker
.
Для других рантаймов (containerd, CRI-O) аналогичные опции ищите в их документации.
Можно ли фильтровать логи по ключевым словам прямо в kubectl logs?
Да, используйте команду grep:
bash
kubectl logs podname | grep "ERROR"
Для постоянного "живого" просмотра нескольких строк используйте kubectl logs -f podname | grep "pattern"
.
Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!
Kubernetes — часть карты развития DevOps
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Kubernetes
Лучшие курсы по теме

Kubernetes и Helm
Антон Ларичев
Docker и Ansible
Антон Ларичев