Автор статьи: Рустем Галиев

IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM

Привет Хабр!

Реальный кластер Kubernetes управляет сотнями или даже тысячами подов. Для каждого пода есть как минимум один контейнер, в котором запущен процесс. Каждый процесс может производить вывод журнала в стандартный поток вывода или стандартные потоки ошибок. Крайне важно записывать выходные данные журнала, чтобы точно определить основную причину ошибки приложения. Кроме того, компоненты кластера создают журналы (логи и далее будут логи) для диагностических целей.

Как видите, механизм ведения логов Kubernetes имеет решающее значение для отслеживания ошибок и мониторинга компонентов и приложений кластера. Kubernetes можно настроить для входа на уровне кластера или узла. Подходы к реализации и их потенциальные компромиссы могут отличаться друг от друга.

Ведение логов кластера

Kubernetes не предоставляет собственного решения для ведения логов на уровне кластера, но мы можем выбрать один из следующих трех вариантов:

  • Создание экземпляра агента ведения логов на уровне каждой ноды кластера.

  • Настройка sidecar-контейнера, отвечающего за обработку логов приложений.

  • Отправка логов непосредственно в серверную часть ведения логов из логики приложения.

Давайте займемся sidecar опцией

Pod можно настроить для запуска другого контейнера sidecar вместе с контейнером основного приложения. Контейнер sidecar передает стандартный вывод и ошибки, создаваемые приложением, и перенаправляет потоки в другое место (например, в серверную часть ведения журнала или том, подключенный к контейнеру).

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

Для этого нам необходимо:

  1. Настроить под с сайдкаром,

  2. Примонтировать том (Volume) для обмена данными между контейнерами,

  3. Конфигурация доступа к эндпоинту, предоставляемого процессом, запущенным в основном контейнере приложения.

  4. Запуск лог комманды для сайдкар контейнера.

Шаг первый

Мы должны реализовать ведение журнала на уровне кластера с помощью sidecar-контейнера.

Определяем многоконтейнерный под с именем multi в файле multi-container.yaml. Основной контейнер приложения с именем nginx должен использовать образ nginx:1.21.6. Контейнер sidecar с именем streaming использует образ busybox:1.35.0 и аргументы /bin/sh, -c, 'tail -n+1 -f /var/log/nginx/access.log'. Пока не создавайте Pod.

Начнем с создания начальной точки YAML для пода в файле с именем multi-container.yaml. Следующая команда создает файл:

Редактируем манифест YAML. Мы добавляем контейнер sidecar в spec.containers[]. Содержимое файла YAML будет выглядеть следующим образом:

apiVersion: v1
kind: Pod
metadata:
  name: multi
  namespace: log
spec:
  containers:
  - image: nginx:1.21.6
	name: nginx
  - image: busybox:1.35.0
	name: streaming
	args: [/bin/sh, -c, 'tail -n+1 -f /var/log/nginx/access.log']

Пока не создавайте Pod, так как нам потребуется дополнительно отредактировать манифест YAML.

Шаг два: Установка тома в оба контейнера

Мы определяем том типа emptyDir для пода и монтируем его по пути /var/log/nginx для обоих контейнеров.

Редактируем наш манифест yaml

apiVersion: v1
kind: Pod
metadata:
  name: multi
  namespace: log
spec:
  containers:
  - image: nginx:1.21.6
    name: nginx
    volumeMounts:
    - name: accesslog
      mountPath: /var/log/nginx
  - image: busybox:1.35.0
    name: streaming
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/nginx/access.log']
    volumeMounts:
    - name: accesslog
      mountPath: /var/log/nginx
  volumes:
  - name: accesslog
    emptyDir: {}


Создаем

Шаг 3. Доступ к конечной точке и журналам

Мы обращаемся к конечной точке службы nginx пару раз, используя команду wget или curl. Осматриваем логи сайдкара.

Определяем IP-адрес Pod. В приведенном ниже примере IP-адрес 10.244.1.2:

Делаем три вызова nginx с помощью временного пода:

kubectl run tmp --image=busybox -n log --restart=Never -it --rm -- wget 10.244.1.2

В журналах потокового контейнера есть три записи:

Все отлично работает и Вы восхитительны.

Завершить статью хочу полезной рекомендацией. Уже скоро у моих коллег из OTUS пройдет бесплатный вебинар, на котором будет рассмотрено построение графиков из различных источников данных при помощи Grafana. Лекторы расскажут про историю проекта, использование различных источников, хранилище дашбордов, формирование и версионирование собственных дашбордов. Регистрация на вебинар доступна по ссылке ниже.

Комментарии (2)


  1. saboteur_kiev
    14.06.2023 09:17
    +1

    А есть другие варианты, чем запускать еще тысячу процессов для каждого из тысячи подов?
    Например централизованно грабить stdout из приложений, или научить приложения отправлять логи на удаленный logstash/elastic, или маунтить сетевой диск и писать логи прямо на него, при этом не нужно запускать


    1. Neveil
      14.06.2023 09:17
      +2

      Есть, но статью написал контент-маркетолог)