Отсутствуют результаты TaskRun при использовании sidecar logs
Содержание
Описание проблемыПроявление ошибкиАнализ первопричиныУстранение неполадокРешениеПредотвращениеСвязанный контентОписание проблемы
Когда включен results-from: sidecar-logs, PipelineRun или TaskRun может не суметь разрешить результаты, если controller не может прочитать логи Pod. Обычно это проявляется как отсутствие результатов Task или Pipeline во время сбора результатов.
Проявление ошибки
-
PipelineRunпоказывает сбой сбора результатов: -
TaskRunпоказывает отсутствующую ссылку на результат Task: -
Pod по-прежнему существует, но sidecar log недоступен для получения:
Анализ первопричины
Чтобы обойти ограничение в 4 KB на termination message, Tekton может читать результаты из sidecar logs с помощью results-from: sidecar-logs (beta-функция с Tekton v0.61.0). Этот механизм использует Kubernetes pod logs API для получения вывода sidecar. Если API логов не может вернуть данные, Tekton не может разобрать результаты, что приводит к отсутствующим ссылкам на TaskResult или PipelineResult.
Наиболее распространенные причины:
- Логи Pod недоступны, хотя сам Pod еще существует.
- На узлах, использующих файловые логи, записи в
/var/log/containersили/var/log/podsудаляются либо ротируются слишком агрессивно. kubeletили container runtime временно работают нестабильно или были перезапущены.- Сборщик мусора для Pod или контейнеров удаляет логи до того, как результаты будут собраны.
Устранение неполадок
- Проверьте, что
results-from: sidecar-logsвключен вTektonConfigиConfigMapfeature-flags. - Проверьте события
PipelineRunиTaskRun, чтобы подтвердить сбои при сборе результатов. - Проверьте sidecar logs напрямую. Если следующая команда возвращает ошибку вроде указанной ниже, это означает, что логи больше недоступны:
- Проверьте, что для Tekton controller настроен pod log RBAC. Отсутствие разрешений RBAC также может вызывать сбои при получении логов:
- На узле убедитесь, что файлы логов Pod и symlink'и по-прежнему существуют, а
kubelet/containerd работают нормально.
Решение
Рекомендуемый подход — дольше сохранять завершенные Pod, чтобы sidecar logs оставались доступны во время сбора результатов.
- Увеличьте
terminated-pod-gc-threshold(например, до1000) на control plane и понаблюдайте за поведением.- Почему это помогает: в загруженных средах множество Pod для TaskRun может завершаться примерно одновременно. Если число завершенных Pod превышает порог, pod GC удаляет их немедленно. После удаления Pod log API для sidecar становится недоступным, и результаты нельзя собрать. Увеличение порога откладывает это окно очистки и дает Tekton больше времени на чтение sidecar logs и извлечение результатов.
- Как изменить: см. kube-controller-manager flags для
--terminated-pod-gc-threshold. - Как подобрать значение: оцените, сколько Pod переходят в
SucceededилиFailedза короткий интервал (например, за 1 минуту), затем добавьте запас. Используйте метрики рабочей нагрузки платформы или количество завершенных pipeline, чтобы приблизительно определить пик завершений в минуту, и задайте порог выше этого пика. - Примечание: этот параметр может быть недоступен для настройки в managed Kubernetes-сервисах (таких как EKS, AKS или GKE), где у пользователей нет доступа к control plane.
- Убедитесь, что на узле достаточно дискового пространства.
- Почему это помогает: когда на узлах возникает disk pressure,
kubeletи containerd могут агрессивно очищать логи и каталоги Pod. Это может удалить или обрезать sidecar logs до того, как controller прочитает их. - Как изменить: изучите настройки eviction
kubeletв KubeletConfiguration и настройте пороги disk pressure в соответствии с вашим планированием емкости. - Операционный совет: отслеживайте использование хранилища на узлах сборки в вашей платформе и выполняйте предварительную очистку до того, как disk pressure вызовет eviction или очистку логов.
- Почему это помогает: когда на узлах возникает disk pressure,
- Убедитесь, что настройки хранения логов (например, ротация логов
kubelet) соответствуют ожидаемой продолжительности pipeline.- Почему это помогает: если логи ротируются слишком быстро или сохраняется слишком мало файлов, вывод sidecar может исчезнуть до того, как результаты будут разобраны, даже если Pod по-прежнему существует.
- Как изменить: проверьте
containerLogMaxSizeиcontainerLogMaxFilesв KubeletConfiguration.
- Рассмотрите возможность возврата к методу по умолчанию
termination-message.- Почему это помогает: подход
termination-messageне зависит от pod logs, поэтому полностью исключает описанные выше проблемы с доступностью логов. - Компромисс: у этого метода есть ограничение на размер результатов в 4 KB. Если результаты Task превышают этот лимит, pipeline завершится ошибкой. Это может негативно сказаться на пользовательском опыте, когда нужны более крупные результаты.
- Как изменить: задайте
results-from: termination-messageвTektonConfig. Обратите внимание, что прямое изменениеConfigMapfeature-flags не вступит в силу, если Tekton развернут черезTektonConfig, так как operator выполнит reconciliation и перезапишет измененияConfigMap.
- Почему это помогает: подход
Предотвращение
- Отслеживайте доступность pod logs API в кластере.
- Держите результаты Task достаточно компактными и собирайте их как можно раньше.
- Относитесь к beta-функциям как к потенциально менее стабильным, чем GA-функции, в нестабильных средах логирования и периодически пересматривайте их использование.