• Русский
  • Сбой при push образа с ошибкой 500 или Unauthorized из-за рассинхронизации часов

    Описание проблемы

    В развертывании Harbor с несколькими репликами (например, если Harbor Core имеет 2 или более Pods) пользователи могут столкнуться с одним из следующих симптомов, даже если учетные данные указаны верно:

    • docker push завершается ошибкой unauthorized: unauthorized to access repository.
    • При просмотре тегов интерфейс Harbor UI возвращает 500 Internal Server Error.
    • Получение списка образов с платформы контейнеров периодически завершается сбоем.

    Эти симптомы часто носят непостоянный характер — повторный запуск той же операции может завершиться успешно, поскольку балансировщики нагрузки направляют запросы на разные Pods Core.

    Корневая причина

    Компоненты Harbor выполняют аутентификацию внутренних вызовов с помощью токенов с ограниченным временем действия (JWT). Когда узлы, на которых размещены Pods разных компонентов Harbor (обычно harbor-core и harbor-registry), не синхронизированы по системному времени, токены, выданные одним компонентом, отклоняются другим как not valid yet или expired.

    Смещение часов всего на несколько секунд уже достаточно, чтобы нарушить проверку токена.

    Ссылки на upstream:

    Поиск и устранение неисправностей

    Проверьте журналы Deployment Harbor Core. Следующие ошибки указывают на проблему рассинхронизации времени:

    2023-10-12T07:10:59Z [ERROR] [/pkg/token/token.go:66]: parse token error, token is not valid yet
    2023-10-12T07:10:59Z [WARNING] [/server/middleware/security/v2_token.go:48][requestID="0968ba9698aa27dc3e07fce7fcd62b9a"]: failed to decode bearer token: token is not valid yet

    Подтвердить гипотезу можно, уменьшив количество реплик Harbor Core до одной. Если проблема исчезает при одном Pod, это подтверждает, что причина — рассинхронизация часов между Pods (а не другая проблема аутентификации).

    kubectl -n <NAMESPACE> scale deployment <RELEASE>-harbor-core --replicas=1

    Чтобы проверить время на каждом узле, на котором размещены Pods компонентов Harbor:

    # Посмотреть, на каком узле запланирован каждый Pod Harbor
    kubectl -n <NAMESPACE> get pods -l app=harbor -o wide
    
    # На каждом указанном узле проверить текущее время
    date -u

    Любое расхождение более чем на 2 секунды между этими узлами необходимо устранить.

    Решение

    Синхронизируйте системные часы всех узлов кластера с помощью NTP (или chrony). После выравнивания времени ошибки проверки токенов прекращаются, а операции push/pull выполняются стабильно.

    Общие требования:

    • Все узлы, на которых размещены Pods Harbor, должны иметь синхронизированное время.
    • Расхождение между любыми двумя узлами должно быть менее 2 секунд.
    • Используйте надежный источник NTP, доступный с каждого узла.

    После синхронизации времени восстановите исходное количество реплик Harbor Core, если вы изменяли его во время поиска и устранения неисправностей:

    kubectl -n <NAMESPACE> scale deployment <RELEASE>-harbor-core --replicas=<ORIGINAL_REPLICAS>

    Примечания

    • Этот класс проблем не специфичен только для Harbor Core. Любой компонент Harbor, размещенный на разных узлах с рассинхронизированными часами, может столкнуться с аналогичными сбоями проверки токенов.
    • Перезапуск Pods Harbor не является обходным решением — токены будут продолжать отклоняться, пока системное время на узлах остается несинхронизированным.