Kubernetes Observability: sidecar logging

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Автор статьи: Рустем Галиев

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. Лекторы расскажут про историю проекта, использование различных источников, хранилище дашбордов, формирование и версионирование собственных дашбордов. Регистрация на вебинар доступна по ссылке ниже.

  • Зарегистрироваться на бесплатный вебинар

Источник: https://habr.com/ru/companies/otus/articles/741626/


Интересные статьи

Интересные статьи

Я продолжаю цикл статей по приручению домашнего сервера разработчика, который хочет уметь в DevOps. В первой своей статье я рассказал о развёртывании Xen Project гипервизора и миграции Windows-виртуал...
Но зачем Знаю, о чем вы думаете — Kubernetes? На домашнем сервере? Кто может быть настолько сумасшедшим? Что ж, раньше я согласился бы, однако недавно кое-что изменило мое мнение. Я начал работать...
Администраторы кластеров kubernetes сталкиваются с задачей сохранить конфигурацию ресурсов из пространства имен и перенести в другой кластер, или же сделать резервную коп...
Поздравляем! Вам удалось убедить ваше начальство в миграции приложений на микросервисную архитектуру с использованием контейнеров и Kubernetes.Вы очень довольны и все иде...
Прим. перев.: В этой статье компания Banzai Cloud делится примером использования её специальных утилит для облегчения эксплуатации Kafka в рамках Kubernetes. Приводимые инструкции иллюстрируют, к...