Stern – это инструмент с открытым исходным кодом, который упрощает передачу логов Kubernetes в режиме реального времени на ваш терминал.
Вы можете использовать Stern для одновременного мониторинга логов из нескольких контейнеров, что дает вам комбинированное представление об активности внутри подов.
Зачем использовать Stern?
Kubectl предлагает встроенную фильтрацию логов с помощью команды kubectl logs.
Хотя это может хорошо работать в простых случаях, в ней отсутствует поддержка агрегирования логов из нескольких источников с последующей фильтрацией результатов.
Это может сделать его громоздким в использовании, когда вам нужно контролировать несколько подсистем или вы работаете с подробными данными.
Stern предлагает опыт работы с логами Kubernetes с первоклассной поддержкой нескольких подов и контейнеров.
Каждый контейнер в потоке логов имеет уникальную окраску, поэтому вы можете быстро идентифицировать строки, прокручиваемые перед вами.
Stern позволяет выбирать контейнеры для включения в логи с помощью сложных запросов, построенных на основе регулярных выражений.
Также есть встроенные возможности фильтрации для выбора логов на основе временной метки, статуса контейнера и селектора Kubernetes.
В этой статье мы покажем, как использовать все эти возможности для ускорения доступа к логам Kubernetes.
Начало работы
Stern распространяется в виде предварительно скомпилированных бинарных файлов для Windows, macOS и Linux на странице релизов проекта на GitHub.
Выберите подходящую загрузку для вашей системы и добавьте двоичный файл в PATH.
Пользователи macOS могут выбрать установку через Homebrew, выполнив команду brew install stern.
Stern использует существующие конфигурационные файлы Kubernetes для подключения к кластеру.
По умолчанию он загружает .kube/config.
Используйте флаг –kubeconfig или установите переменную окружения KUBECONFIG, если вам нужно изменить этот путь.
Контексты Kubernetes также поддерживаются без проблем.
Добавьте флаг –context, чтобы указать конкретный контекст в текущем загруженном файле конфигурации.
Вы также можете использовать флаг —namespace, чтобы вручную выбрать пространство имен в вашем кластере.
Stern будет отправлять в tail только логи от объектов в указанном контексте и пространстве имен; флаг –all-namespaces можно использовать для потоковой передачи логов со всего кластера.
Базовое использование
Основной синтаксис Stern требует только одного аргумента:
stern api-server
Введите имя пода для потоковой передачи логов, происходящих в контейнерах этого пода.
Однако такое использование не раскрывает истинных возможностей Stern: имя пода – это только один из примеров запроса Pod.
Запросы подов
Stern использует запросы пода для определения потоков логов, которые необходимо вывести на поверхность.
Запросы представляют собой регулярные выражения, поэтому вы можете составлять расширенные подборки подов, используя стандартный синтаксис.
Приведенный выше пример stern api-server будет соответствовать любому поду, содержащему api-server в своем имени.
Если вы измените это на stern .*-server, вы увидите логи, исходящие от всех ваших Pod, имена которых заканчиваются на -server.
Это позволяет быстро собирать потоки логов, которые объединяют строки из нескольких компонентов в вашем стеке.
Запросы влияют только на выбранные поды.
Stern автоматически включает логи из всех контейнеров в этих подах.
Вы можете управлять этим с помощью дополнительного флага –container, который принимает другой regex, определяющий допустимые имена контейнеров.
stern .*-server --container .*-0
Аналогично, вы можете исключить определенные контейнеры с помощью флага –exclude-container и символа regex:
stern .*-server --exclude-container .*-helper
Также поддерживаются селекторы меток.
stern .*-server --selector app-version=v1.*
Фильтрация на основе состояния контейнера
По умолчанию Stern показывает только логи запущенных контейнеров.
Используйте флаг –container-state, чтобы получить строки, записанные контейнерами в другом состоянии.
Поддерживаются параметры running, waiting и terminated:
# Show logs from stopped containers stern .*-server --container-state terminated
Фильтрация отдельных строк логов
После того как вы выбрали подходящий набор подов и контейнеров, можно переходить к фильтрации фактических данных журнала.
Stern предоставляет вам несколько опций, которые помогут вам уменьшить ненужный мусор и сосредоточиться на значимых данных:
–since – Получить логи, записанные в пределах относительных временных рамок, удобных для чтения человеком, например, 5 м или 1 ч.
–tail – Количество строк от конца логов, которые нужно показать. По умолчанию -1, при этом показываются все логи.
–exclude – Исключить строки логов, соответствующие данному регулярному выражению. Вы можете использовать этот флаг несколько раз; условия будут объединены как логическое предложение “AND”.
Вот пример получения ограниченного набора последних значимых логов из веб-службы:
stern web-server --since 1h --tail 100 --exclude .*GET /robots.txt.*
Заключение
Stern – это удобный инструмент Kubernetes, который делает логи Pod более полезными и доступными.
Вы можете легко следить за несколькими подами и контейнерами благодаря цветному выводу, сложным селекторам и настраиваемым форматам вывода.
см. также:
- ☸️ Выполняем проверку безопасности манифестов Kubernetes и чартов Helm с помощью Datree
- ☸️ Обновление ConfigMap и secrets без перезапуска пода в K8s
- ☸️ Перехват трафика контейнеров в Kubernetes
- 🐳 Docker, containerd и CRI-O: Углубленное сравнение
- ☸️ Внедрили Kubernetes? Попробуйте эти 5 инструментов для аудита прав Rbac
- 🐳 Мониторинг и управление Docker контейнерами – обзор инструментов CLI
- ☸️ Ломаем и чиним Kubernetes
- 📜 Самоучитель по YAML | Начало работы с YAML
- ☸️ Развертывание контроллера Nginx Ingress на Kubernetes с помощью чарта Helm