Поиск по сайту:

Как отслеживать журналы пода Kubernetes в режиме реального времени с помощью Stern


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

Зачем использовать Штерн?

Kubectl предлагает встроенную запись журнала с помощью команды kubectl logs. Хотя это может хорошо работать в простых случаях, в нем отсутствует поддержка агрегирования журналов из нескольких источников с дальнейшей фильтрацией результатов. Это может затруднить использование, когда вам нужно отслеживать несколько модулей или вы работаете с подробными данными.

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

Также есть встроенные возможности фильтрации для выбора журналов на основе метки времени, состояния контейнера и селектора Kubernetes. В этой статье мы покажем, как использовать все эти функции для ускорения доступа к вашим журналам Kubernetes.

Начиная

Stern распространяется в виде предварительно скомпилированных двоичных файлов для Windows, macOS и Linux на странице релизов проекта GitHub. Выберите подходящую загрузку для вашей системы и добавьте двоичный файл в свой PATH. Пользователи macOS могут выбрать установку через Homebrew, запустив brew install stern.

Stern использует ваши существующие файлы конфигурации Kubernetes для подключения к вашему кластеру. По умолчанию загружается .kube/config. Используйте флаг --kubeconfig или установите переменную среды KUEBCONFIG, если вам нужно изменить этот путь.

Контексты Kubernetes также легко поддерживаются. Добавьте флаг --context, чтобы указать конкретный контекст в загруженном в данный момент файле конфигурации. Вы также можете использовать флаг --namespace, чтобы вручную выбрать пространство имен в вашем кластере. Stern будет отслеживать журналы только объектов в указанном контексте и пространстве имен; флаг --all-namespaces можно использовать для потоковой передачи журналов из всего кластера.

Основное использование

Базовый синтаксис Стерна требует только одного аргумента:

stern api-server

Укажите имя пода для потоковых журналов, исходящих из контейнеров в этом поде. Однако это использование противоречит истинной силе Стерна; имя модуля — это только один пример запроса модуля.

Под запросы

Stern использует запросы Pod для определения потоков журналов, которые нужно вывести на поверхность. Запросы — это регулярные выражения, поэтому вы можете собирать расширенные наборы модулей, используя стандартный синтаксис.

Приведенный выше пример stern api-server будет соответствовать любому поду, содержащему api-server в своем имени. Если вы измените это на stern .*-server, вы увидите журналы, исходящие от всех ваших модулей, имена которых заканчиваются на -server. Это позволяет быстро собирать потоки журналов, объединяющие строки из нескольких компонентов в вашем стеке.

Запросы влияют только на выбранные модули. Stern автоматически включает журналы из всех контейнеров в этих модулях. Вы можете управлять этим, используя необязательный флаг ---container, который принимает другое регулярное выражение, определяющее допустимые имена контейнеров для включения.

stern .*-server --container .*-0

Точно так же вы можете исключить определенные контейнеры, используя флаг --exclude-container и регулярное выражение:

stern .*-server --exclude-container .*-helper

Селекторы меток также поддерживаются. Установите флаг ---selector с регулярным выражением, определяющим метки для сопоставления модулей. По умолчанию это .*, включая все модули, соответствующие исходному запросу.

stern .*-server --selector app-version=v1.*

Фильтрация на основе состояния контейнера

По умолчанию Stern показывает журналы только из запущенных контейнеров. Используйте флаг --container-state, чтобы получить строки, регистрируемые контейнерами в другом состоянии. Он поддерживает параметры running, waiting и terminated:

# Show logs from stopped containers
stern .*-server --container-state terminated

Фильтрация отдельных строк журнала

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

  • --since – получить журналы, записанные в течение удобочитаемого относительного периода времени, начиная с 5 минут или 1 часа.
  • --tail — для начала получите много строк этого лога. По умолчанию -1 (без ограничений), поэтому ваш терминал заполняется всеми ранее существовавшими журналами до начала вывода в реальном времени.
  • --exclude — исключить строки журнала, соответствующие этому регулярному выражению. Вы можете использовать этот флаг несколько раз; условия будут объединены в виде логического предложения «и».

Вот пример получения ограниченного набора последних значимых журналов из веб-службы:

stern web-server --since 1h --tail 100 --exclude .*GET /robots.txt.*

Использование шаблонов вывода

Стерн обычно представляет строки журнала в следующем формате:

<namespace name> <pod name> <container name> <original log line>

Этот формат настраивается с помощью флага --template. Синтаксис шаблонов Go поддерживается для доступа к переменным Namespace, PodName, ContainerName и Message внутри вашего средства форматирования:

stern .*-server --template 'Namespace: {{.Namespace}} Pod: {{.PodName}} - {{.Message}}'

Иногда вам может понадобиться прочитать строки журнала без дополнительного форматирования. Использование --output raw покажет простые сообщения как есть, производя вывод, аналогичный Kubectl.

Альтернативным вариантом является --output json, чтобы получить данные журнала в формате, более подходящем для программного использования. Он создаст поток объектов JSON со свойствами message, namespace, podName и containerName.

Stern может автоматически добавлять временные метки к каждой строке журнала, если вы включаете флаг --timestamps. По умолчанию это отключено, так как многие популярные серверы сами добавляют эту информацию перед отправкой сообщения.

Наконец, Stern поддерживает флаг --color, который можно использовать для принудительного или отключения использования цветного вывода. Он принимает auto, никогда или всегда в качестве своего значения. Последний вариант полезен, если программа неправильно определяет TTY вашей оболочки.

Краткое содержание

Stern — это удобный инструмент Kubernetes, который делает журналы Pod более полезными и доступными. Вы можете легко следить за несколькими модулями и контейнерами с помощью раскрашенного вывода, сложных селекторов и настраиваемых форматов вывода.

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