Синхронизация времени (NTP)#

Корректное время является обязательным условием для надёжной работы TLS/сертификатов, аутентификации, журналирования, корреляции метрик и событий, а также для корректного поведения распределённых систем.

Предполагается использование NTP-клиента chrony или systemd-timesyncd.

Источник времени#

В инфраструктуре используются следующие варианты источника точного времени:

  • Внутренний источник в локальной сети:

    • доменный контроллер (предпочтительно при наличии домена и корректно настроенной иерархии времени);

    • выделенный сервер времени в локальной сети.

  • Внешние серверы времени:

    • публичные NTP-серверы (включая пул-сервисы), при наличии разрешения на доступ из сети.

Настройка синхронизации времени на Debian#

Установка chrony#

sudo apt-get update
sudo apt-get install -y chrony

Конфигурация chrony#

Отредактируйте файл: /etc/chrony/chrony.conf.

Рекомендуемый пример для внутреннего NTP:

server ntp1.local iburst
server ntp2.local iburst

makestep 1.0 3
rtcsync

Пример для внешнего пула:

pool pool.ntp.org iburst

makestep 1.0 3
rtcsync

Примечание

  • iburst - ускоряет первичную синхронизацию после старта сервиса.

  • makestep 1.0 3 - разрешает «шаговую» корректировку при большом расхождении в первые 3 попытки (актуально при первичном вводе узла в эксплуатацию).

  • rtcsync - синхронизирует аппаратные часы (RTC) с системным временем.

различие директив server и pool в chrony.conf

Директива server указывает конкретный NTP-сервер (статический адрес или имя).

Пример:

server ntp1.local iburst
server ntp2.local iburst

Особенности:

  • фиксированное указание источника (контролируемо и предсказуемо);

  • оптимально для внутренней сети (DC/внутренний сервер времени);

  • при использовании имени, которое резолвится в один IP, фактически будет использоваться один адрес до изменения DNS/конфигурации;

  • отказоустойчивость достигается добавлением нескольких строк server (минимум два источника).

Рекомендуемое применение: внутренние источники времени (предпочтительно) или выделенные внешние NTP-серверы организации.


Директива pool указывает пул серверов через доменное имя, которое разрешается в несколько адресов. Chrony обновляет и переоценивает доступные сервера из пула и выбирает наиболее подходящие источники.

Пример:

pool pool.ntp.org iburst

Особенности:

  • доменное имя возвращает несколько серверов, обеспечивая резервирование;

  • список источников может обновляться автоматически;

  • повышается устойчивость к недоступности отдельных NTP-узлов;

  • в отличие от server, конфигурация не привязывается к одному IP.

Рекомендуемое применение: сети с доступом в интернет, когда требуется максимальная устойчивость к недоступности отдельных источников.


Практическая рекомендация выбора:

  • При наличии внутреннего NTP (DC/сервер времени в локальной сети) следует применять server и указать как минимум два внутренних адреса.

  • При синхронизации через интернет следует применять pool (если это разрешено политикой безопасности).

  • Допустима комбинированная схема (внутренние server как приоритет + внешний pool как резерв), если это допускается правилами доступа.

Запуск и проверка#

sudo systemctl enable --now chrony

chronyc sources -v
chronyc tracking
timedatectl status

Ожидаемые признаки корректной работы:

  • chronyc sources -v показывает доступные источники, один из них выбирается как основной;

  • chronyc tracking показывает состояние синхронизации и текущее смещение (offset).

Конфигурация systemd-timesyncd#

Отредактируйте файл: /etc/systemd/timesyncd.conf

[Time]
NTP=ntp1.local ntp2.local
FallbackNTP=ntp3.local

Команды:

sudo systemctl enable --now systemd-timesyncd
timedatectl timesync-status
timedatectl status

Kubernetes-кластер#

Kubernetes-поды используют время хостовой ОС узла. Следовательно, синхронизация времени выполняется на каждом узле кластера (control plane и worker).

Обязательные действия на каждом узле:

  • настроить NTP-клиент (рекомендуется chrony);

  • обеспечить сетевую доступность UDP/123;

  • выполнить проверку:

    chronyc tracking
    chronyc sources -v
    timedatectl status
    

HAProxy: требования в зависимости от размещения#

HAProxy внутри Kubernetes (Pod)#

Отдельная настройка NTP внутри pod не требуется. Требуется обеспечить корректное время на узлах, где запускается pod HAProxy (см. раздел про Kubernetes).

HAProxy как отдельный сервер/VM#

Настройка выполняется как для обычной машины: chrony-клиент на утверждённые источники времени (см. раздел про Debian/Astra).


PostgreSQL#

PostgreSQL не обращается к NTP напрямую и использует:

  • системное время ОС (влияет на now(), TTL/таймеры, корректность работы TLS, временные метки логов и т.д.);

  • параметры конфигурации Postgres, определяющие таймзону отображения и таймзону логов.

Внимание

Критичное требование: на сервере, где работает PostgreSQL, должна быть настроена синхронизация времени (chrony/systemd-timesyncd).

Ключевые параметры времени в postgresql.conf#

При необходимости отредактируйте конфигурационный файл: /etc/postgresql/<версия>/main/postgresql.conf

timezone

  • Задаёт таймзону по умолчанию для новых сессий (как Postgres интерпретирует/отображает время).

  • влияет на вывод временных значений (например, SELECT now(););

  • влияет на преобразования при работе с timestamptz;

  • не заменяет системную синхронизацию времени (NTP остаётся обязательным).

Пример (UTC):

timezone = 'UTC'

Пример (IANA):

timezone = 'Europe/Moscow'

log_timezone

  • Задаёт таймзону, используемую при записи временных меток в логах PostgreSQL.

Рекомендуется согласовать с принятым стандартом:

log_timezone = 'UTC'

ИЛИ:

log_timezone = 'Europe/Moscow'

После изменения postgresql.conf необходимо выполнить перезапуск:

sudo systemctl reload postgresql

Примечание

Значения «по умолчанию» гарантированно применяются для новых подключений. При наличии пулов соединений (pgBouncer, pool в приложении) может потребоваться пересоздание соединений на стороне приложения.

Проверка в PostgreSQL#

SELECT now() AS server_now;
SHOW
TimeZone;
SHOW
log_timezone;

Дополнительно рекомендуется сверить таймзону ОС:

timedatectl status

Grafana: требования к синхронизации времени#

Grafana использует системное время хоста/контейнера:

  • при размещении в Kubernetes - время узла;

  • при размещении на отдельной VM/сервере - время ОС.

Рекомендуется придерживаться единого стандарта таймзоны на уровне ОС (UTC либо утверждённая локальная таймзона) и на уровне источников данных.

Мониторинг синхронизации#

Для мониторинга времени рекомендуется поставить node_exporter на все хосты (узлы k8s, серверы HAProxy, PostgreSQL и прочие) и через внешнюю Grafana смотреть метрики timesync/timex.

node_exporter_time_sync

Основные параметры мониторинга:

  • Drift/Offset - фактическое расхождение локальных часов с эталоном (чем ближе к нулю, тем лучше)

  • Maximum error - оценка верхней границы возможной ошибки времени (часто растёт «пилой» и сбрасывается при успешной синхронизации)

  • Sync status (1=ok) - признак, что система считает себя синхронизированной

  • PLL adjust / Frequency adjustment - параметры и величина плавной подстройки частоты локальных часов (норма - стабильные значения без резких скачков)

  • PPS - показатели аппаратного эталона (если PPS не используется - нули).

Стандарт таймзоны#

В Linux и в PostgreSQL рекомендуется указывать IANA-таймзону (формат Region/City), а не смещение по времени ( UTC+3). Это снижает риск неоднозначной интерпретации и обеспечивает согласованность инструментов.

Настройка таймзоны на Debian/Astra#

Установка таймзоны (пример для UTC+03:00):

sudo timedatectl set-timezone Europe/Moscow

Проверка:

timedatectl status