PermissionDenied в Gitaly, вызванный рассинхронизацией времени
Содержание
Описание проблемыКорневая причинаДиагностикаРешениеПредварительные требованияВажные замечанияШагиРекомендацииОписание проблемы
-
При переходе на страницы, связанные с репозиторием, в GitLab UI возвращается HTTP 500.
-
В логах pod Gitaly присутствует ключевое слово:
-
Системное время pod Gitaly и pod
webservice/sidekiqотличается на несколько секунд или более.
Корневая причина
Gitaly выполняет аутентификацию своих клиентов (webservice, sidekiq) с помощью JWT, в claims которого входит временная метка. Если часы узлов расходятся, на стороне Gitaly JWT считается истекшим или еще не вступившим в силу, и RPC отклоняется с PermissionDenied. На практике это обычно срабатывает при рассинхронизации более чем примерно на 30 секунд, но точный допустимый порог зависит от настроек допустимого отклонения в библиотеке JWT.
Распространенные причины рассинхронизации времени:
- На узлах кластера не настроен NTP, либо служба NTP не запущена.
- NTP настроен, но не может получить доступ к внешнему источнику времени, например из-за блокировки firewall.
- Узел работает на оборудовании с неточным RTC (real-time clock) и ни разу не синхронизировался.
Диагностика
-
Подтвердите наличие ключевого слова
PermissionDeniedв логах Gitaly: -
Сравните время, которое сообщает pod Gitaly, и pod-клиент (
webserviceилиsidekiq). Разница более чем в несколько секунд вызывает подозрения: -
Определите, на каких узлах размещены затронутые pod, а затем проверьте системные часы хоста напрямую:
На каждом узле проверьте, синхронизированы ли системные часы с источником NTP. Если NTP не активен, именно этот узел является источником рассинхронизации.
Решение
Предварительные требования
- Доступ по SSH ко всем узлам кластера (после перераспределения pod эти pod могут оказаться на любом узле).
- Разрешение на перезапуск компонентов GitLab.
Важные замечания
- Изменение системного времени на работающем узле — чувствительная операция. По возможности выполняйте ее в окне обслуживания.
- Значительные обратные скачки времени могут нарушить работу баз данных и распределенных систем. Предпочтительнее плавная корректировка времени, а не резкое изменение, например с помощью
date -s.
Шаги
-
Настройте NTP на каждом узле кластера и убедитесь, что служба активна. Конкретный инструмент (chrony, systemd-timesyncd, ntpd и т. д.) зависит от вашей ОС и выходит за рамки этого документа. После внесения изменений убедитесь на каждом узле, что системные часы синхронизированы с внешним источником времени.
-
Перезапустите компоненты GitLab, чтобы после выравнивания времени они выпустили новые JWT. Подберите имена workload в соответствии с вашим release:
-
Проверьте результат:
- В логах Gitaly больше не появляются записи
PermissionDenied. - Страницы репозитория в GitLab UI возвращают 200.
- Значения
date -u, выполненные внутри pod Gitaly и webservice, теперь отличаются менее чем на одну секунду.
- В логах Gitaly больше не появляются записи
Рекомендации
- Для быстрой проверки рассинхронизации по всему кластеру выполните
date -uна каждом узле и сравните результаты; любой выбивающийся узел является кандидатом на проблему.