Перейти к основному содержанию
`Ctrl`+`K`

# Синхронизация времени (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.

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

- 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