Результаты TaskRun отсутствуют при использовании Sidecar Logs
Содержание
Описание проблемыПроявление ошибкиАнализ причиныПоиск и устранение неисправностейРешениеПрофилактические мерыСвязанный контентОписание проблемы
Когда включена опция results-from: sidecar-logs, PipelineRun или TaskRun могут не получить результаты, если контроллер не может прочитать логи пода. Обычно это проявляется как отсутствие результатов Task или Pipeline при сборе результатов.
Проявление ошибки
-
PipelineRun показывает ошибку сбора результатов:
-
TaskRun показывает отсутствие ссылки на результат задачи:
-
Под всё ещё существует, но логи sidecar получить не удаётся:
Анализ причины
Чтобы обойти ограничение на сообщение о завершении размером 4 КБ, Tekton может читать результаты из логов sidecar с помощью results-from: sidecar-logs (бета-функция с версии Tekton v0.61.0). Этот механизм опирается на API логов Kubernetes для получения вывода sidecar. Если API логов не может вернуть данные, Tekton не сможет разобрать результаты, что приведёт к отсутствию ссылок TaskResult или PipelineResult.
Частые причины:
- Логи пода недоступны, хотя под всё ещё существует.
- На узлах с файловыми логами записи в
/var/log/containersили/var/log/podsудаляются или ротируются слишком агрессивно. - kubelet или контейнерный рантайм временно нестабильны или перезапускаются.
- Сборка мусора подов или контейнеров удаляет логи до того, как результаты собраны.
Поиск и устранение неисправностей
- Проверьте, что
results-from: sidecar-logsвключён в TektonConfig и ConfigMap feature-flags. - Просмотрите события PipelineRun и TaskRun, чтобы подтвердить ошибки сбора результатов.
- Проверьте логи sidecar напрямую. Если следующая команда возвращает ошибку, как показано ниже, значит логи больше недоступны:
- Проверьте, что для контроллера Tekton настроены права RBAC на доступ к логам пода. Отсутствие прав также может вызвать ошибки получения логов:
- На узле убедитесь, что файлы логов пода и символические ссылки существуют, а kubelet/containerd работают корректно.
Решение
Рекомендуется увеличить время хранения завершённых подов, чтобы логи sidecar оставались доступны во время сбора результатов.
- Увеличьте параметр
terminated-pod-gc-threshold(например, до1000) на управляющей плоскости и наблюдайте за поведением.- Почему это помогает: В загруженных средах много подов TaskRun могут завершаться одновременно. Если количество завершённых подов превышает порог, сборщик мусора подов удаляет их сразу. После удаления пода API логов для sidecar становится недоступным, и результаты не собираются. Повышение порога задерживает очистку и даёт Tekton больше времени для чтения логов sidecar и извлечения результатов.
- Как изменить: См. kube-controller-manager flags для параметра
--terminated-pod-gc-threshold. - Как подобрать значение: Оцените, сколько подов переходит в состояние
SucceededилиFailedза короткий промежуток (например, 1 минуту), добавьте запас. Используйте метрики нагрузки платформы или количество завершённых pipeline для приближённой оценки пиковых значений в минуту и установите порог выше этого пика. - Примечание: Этот параметр может быть недоступен для настройки в управляемых Kubernetes-сервисах (например, EKS, AKS, GKE), где пользователи не имеют доступа к управляющей плоскости.
- Убедитесь, что на узлах достаточно свободного места на диске.
- Почему это помогает: При достижении узлами дискового давления kubelet и containerd могут агрессивно очищать логи и директории подов. Это может привести к удалению или усечению логов sidecar до того, как контроллер их прочитает.
- Как изменить: Проверьте конфигурацию эвакуации kubelet в KubeletConfiguration и настройте пороги дискового давления в соответствии с планированием ёмкости.
- Практический совет: Мониторьте использование дискового пространства на сборочных узлах и планируйте своевременную очистку до срабатывания эвакуации или очистки логов.
- Убедитесь, что настройки хранения логов (например, ротация логов kubelet) соответствуют ожидаемой длительности pipeline.
- Почему это помогает: Если логи ротируются слишком быстро или сохраняется слишком мало файлов, вывод sidecar может исчезнуть до разбора результатов, даже если под всё ещё существует.
- Как изменить: Проверьте параметры
containerLogMaxSizeиcontainerLogMaxFilesв KubeletConfiguration.
- Рассмотрите возможность возврата к методу по умолчанию
termination-message.- Почему это помогает: Метод
termination-messageне зависит от логов пода, поэтому полностью избегает описанных проблем с доступностью логов. - Компромисс: Этот метод ограничен размером результата 4 КБ. Если результаты Task превышают этот лимит, pipeline завершится с ошибкой. Это может негативно сказаться на опыте пользователя при необходимости больших результатов.
- Как изменить: Установите
results-from: termination-messageв TektonConfig. Обратите внимание, что прямое изменение ConfigMap feature-flags не вступит в силу, если Tekton развернут через TektonConfig, так как оператор будет синхронизировать и перезаписывать изменения ConfigMap.
- Почему это помогает: Метод
Профилактические меры
- Мониторьте доступность API логов подов в кластере.
- Поддерживайте разумный размер результатов Task и собирайте результаты как можно раньше.
- Рассматривайте бета-функции как потенциально менее стабильные по сравнению с GA-функциями в нестабильных средах логов и периодически пересматривайте их использование.