Вступление
Для начала давайте определимся с целью статьи. Точное время в контейнерах является важным критерием работы современных программных систем, так как в эру микросервисов и распределённых систем различное время может привести к ошибкам в работе и дополнительным временным затратам при анализе проблем. А часовой пояс является, как кажется, не самой важной характеристикой. Но всё же, точный временной пояс поможет вам корректно отображать и работать с временем без дополнительных проблем.
Итак, мы решили выставить один часовой пояс во всех наших контейнерах. В чём же дело?
Но, к сожалению, сделать это, оказывается, не так легко. Почему? Всё дело в работе системы виртуализации. Время не является характеристикой виртуальной машины и берётся из операционной системы хоста. Виртуальная машина обычно наследует часовой пояс и текущее время от хост-системы, на которой она выполняется. Это позволяет обеспечить корректную синхронизацию времени между виртуальной машиной и хост-системой.
Говоря простыми словами, в kubernates timezone запускаемых контейнеров наследуется от timezone нод кластера. Если вы настроили кластер на собстенном bare-metal server, то сложностей никаких нет, достаточно выставить tz на сервере и дело закрыто.
Но что если у вас отказоустойчивый гео-распределённый кластер, в котором, к тому же, используется несколько арендуемых площадок от разных service-провайдеров?
Итак, давайте посмотрим, какие есть варианты в данном случае.
Выставление timezone вручную
- Определите список nodes в кластере: для этого используем команду kubectl get nodes для получения списка node.
- Подключитесь по SSH к каждой из node.
- Измените timezone для каждой из нод: Например, используйте команду sudo timedatectl set-timezone <timezone> для выставления требуемой timezone. Изммените <timezone> с нужной вам настройкой, например, Asia/Novosibirsk.
- Проверьте изменение timezone: Используйте команду timedatectl для проверки timezone в операционной системе ноды.
- Сделайте рестарт компонентов кластера: перезапусnbnt kubernates cluster для того, чтобы убедиться, что timezone прописана во всех компонентах кластера. Вы можете использовать команду sudo systemctl restart kubelet для перезапуска kubelet на каждой ноде.
- Проверьте применение tz: запустите приложение и проверьте, что настройки верно применились.
Выставление timezone автоматически с помощью k8tz
k8tz или Kubernetes Timezone Controller - специальный аддон, который призван помочь администраторам в выставлении timezone глобально для всех контейнеров и CronJobs.
Установка в данном случае будет намного проще, например, можно воспользоваться пакетным менеджером helm:
helm repo add k8tz https://k8tz.github.io/k8tz/
helm install k8tz k8tz/k8tz --set timezone=Africa/Addis_Ababa
Ниже пример работы с k8tz