Стратегии обновления YTsaurus
В этой статье описаны стратегии обновления компонентов кластера YTsaurus, их отличия и порядок настройки. Выбирайте стратегию в зависимости от требований к доступности кластера во время обновления.
Обзор стратегий
Стратегия обновления определяет, перезапускает ли оператор pod'ы компонента одновременно или последовательно по одному. От этого зависит, будет ли кластер доступен во время обновления.
Чтобы выбрать стратегию, опишите правила обновления в поле updatePlan. В каждом правиле вы указываете, какие компоненты обновлять и по какой стратегии. Одно правило может охватывать весь кластер, отдельные компоненты или группы компонент. Подробнее — в разделе Настройка поля updatePlan.
Оператор поддерживает три стратегии обновления:
|
Стратегия |
Описание |
Доступность кластера |
|
|
Оператор применяет эту стратегию по умолчанию, если вы не указали её явно. Оператор одновременно удаляет и пересоздаёт все pod'ы компонента. При обновлении мастер-серверов оператор включает safe mode и создаёт снапшоты. Планируйте такое обновление в период минимальной нагрузки. Подробнее — в разделе Стратегия по умолчанию |
Кластер недоступен |
|
|
Доступна с версии оператора 0.31.0. Оператор обновляет pod'ы по одному или группами и гарантирует минимальное количество доступных инстансов. Подходит не для всех компонентов: мастер-серверы можно обновить только через |
Кластер доступен, кроме обновления мастер-серверов |
|
|
Доступна с версии оператора 0.31.0. Оператор обновляет спецификацию |
Зависит от действий пользователя |
Настройка поля updatePlan
Добавьте поле updatePlan в спецификацию кластера YTsaurus. В нём вы перечисляете правила: в каждом правиле выбираете компоненты по полю class или component и задаёте стратегию обновления в поле strategy. Оператор проверяет правила сверху вниз и применяет первое подходящее. Поэтому специфичные правила по полю component ставьте перед общими правилами по полю class.
Описание полей
|
Поле |
Описание |
|
|
Выбор компонентов по классу. Доступные значения:
|
|
|
Выбор по типу компонента: |
|
|
Выбор конкретной instance group по имени. Необязательное поле |
|
|
Максимальное количество instance groups, которые оператор обновляет одновременно |
|
|
Стратегия |
|
|
Стратегия |
|
|
Запускать ли pre-checks перед обновлением каждого pod'а |
Примеры настройки поля updatePlan для стратегии RollingUpdate смотрите в разделе Обновление без остановки кластера.
Предзагрузка образов
По умолчанию оператор скачивает новый образ во время обновления, когда pod уже остановлен. Из-за этого компонент дольше остаётся недоступным. Чтобы скачать образы заранее, включите предзагрузку — оператор скачает нужные образы до начала обновления, и переключение pod'ов пройдёт быстрее.
Предзагрузку для всех компонентов включает флаг enableImageHeater в блоке clusterFeatures:
spec:
clusterFeatures:
enableImageHeater: true
Предзагрузка особенно полезна при стратегии RollingUpdate, когда важно минимальное время недоступности. Пример совместной настройки — в разделе Обновление без остановки кластера.
Ход предзагрузки отражается в статусе WaitingForImageHeater поля UPDATESTATE.
Переход с enableFullUpdate на updatePlan
Начиная с версии оператора 0.32.0, поле updatePlan заменило флаг enableFullUpdate, поэтому этот флаг больше не действует. Информацию о релизах оператора смотрите на странице релизов.
Флаг enableFullUpdate только включал или отключал полное обновление. Поле updatePlan задаёт список правил: в каждом правиле вы выбираете компоненты и стратегию их обновления.
Прямое соответствие старого флага и нового поля:
|
Флаг |
Поле |
Результат |
|
|
Правило с |
Обновить все серверные компоненты |
|
|
Пустой |
Не обновлять ничего |
Пример: полное обновление
# Оператор 0.31.0 и старше
spec:
enableFullUpdate: true
# Оператор 0.32.0 и новее
spec:
updatePlan:
- class: Everything
Кроме прямого соответствия, updatePlan даёт возможности, которых не было у enableFullUpdate:
- Выбор набора компонентов. Правило с
class: Statelessобновляет все stateless-компоненты, кроме мастер-серверов, Data-нод и Tablet-нод. Также можно выбрать отдельный компонент по типу через полеcomponent. - Выбор стратегии обновления. В поле
strategyкаждого правила вы задаёте стратегиюRollingUpdateилиOnDelete. Подробнее — в разделе Настройка поля updatePlan.
Пример: обновить только HTTP-прокси
# Оператор 0.32.0 и новее
spec:
updatePlan:
- component:
type: HttpProxy
Флаг enableFullUpdate не позволял выбрать отдельный компонент — он обновлял либо все серверные компоненты, либо ни одного. Обновить один компонент можно было только переопределением его образа в поле image. Этот способ работает и сейчас — подробнее в разделе Обновление отдельных компонентов.
Оператор обновляет только те компоненты, которые явно перечислены в updatePlan. Остальные компоненты он не трогает, даже если их образ изменился: такой компонент переходит в состояние UpdateBlocked и ждёт, пока вы добавите его в план.
Если updatePlan пуст или не задан, оператор не обновляет ничего. При изменении coreImage кластер перейдёт в состояние UpdateBlocked — обновление подготовлено, но заблокировано.
Стратегия по умолчанию BulkUpdate
Если вы не задали поле updatePlan или задали его без поля strategy, оператор применяет стратегию BulkUpdate. Обновление проходит в три фазы:
- Подготовка.
- Оператор включает safe mode и запрещает запись в кластер, сохраняет и удаляет таблет-целлы — динамические таблицы становятся недоступны. Затем оператор создаёт снапшоты мастер-серверов и переводит их в режим
read-only. - Замена pod'ов.
- Оператор одновременно удаляет pod'ы всех компонентов — на этом этапе кластер полностью недоступен. После этого оператор пересоздаёт pod'ы с новым образом.
- Восстановление.
- Оператор дожидается выхода мастер-серверов из режима
read-only, восстанавливает таблет-целлы и отключает safe mode.
Кластер полностью недоступен от начала подготовки до конца восстановления. Длительность зависит от размера кластера — от нескольких минут до десятков минут.
Стратегия RollingUpdate
При стратегии RollingUpdate оператор обновляет pod'ы по одному или группами и гарантирует минимальное количество доступных инстансов.
Доступность компонентов при RollingUpdate
|
Компонент |
Что делает оператор |
Доступность |
|
HTTP/RPC-прокси |
Оператор обновляет pod'ы по одному. Kubernetes Service автоматически перенаправляет трафик на готовые pod'ы |
Клиенты могут обращаться к кластеру |
|
Data-ноды |
Оператор обновляет pod'ы по одному. Данные доступны через реплики на других нодах |
Чтение и запись работают |
|
Exec-ноды |
Перед обновлением pod'а оператор отключает scheduler jobs, после обновления — включает обратно |
Оставшиеся ноды выполняют операции |
|
Tablet-ноды |
Оператор обновляет pod'ы по одному |
Динамические таблицы доступны через оставшиеся ноды |
|
Планировщик, Controller-агент |
Оператор обновляет pod'ы по одному |
Планирование операций работает |
|
Мастер-серверы |
Для мастер-серверов |
При |
Важно
Для корректной работы стратегии RollingUpdate у каждого компонента должно быть минимум 2 инстанса. Если инстанс один, при его обновлении компонент будет недоступен так же, как при BulkUpdate.
Рекомендуемое количество инстансов
|
Компонент |
Минимум для доступности |
Рекомендуется |
|
HTTP/RPC-прокси |
2 |
3 и более |
|
Data-ноды |
3 — для репликации данных |
3 и более |
|
Exec-ноды |
2 |
2 и более |
|
Мастер-серверы |
3 — для кворума |
3 |
|
Tablet-ноды |
2 |
3 и более |
Примеры настройки RollingUpdate для кластера — в разделе Дополнительные сценарии инструкции по обновлению.
Настройка доступности pod'ов
По умолчанию при стратегии RollingUpdate оператор обновляет по одному pod'у за раз. Чтобы задать другое количество, используйте поле minReadyInstanceCount:
spec:
httpProxies:
- instanceCount: 5
minReadyInstanceCount: 3 # всегда минимум 3 pods доступны
role: default
Оператор вычисляет количество одновременно обновляемых pod'ов по формуле:
maxUnavailable = max(1, instanceCount - minReadyInstanceCount)
В примере выше оператор обновляет до 2 pod'ов одновременно, а 3 pod'а всегда обслуживают запросы: maxUnavailable = max(1, 5 - 3) = 2.
Примеры расчёта maxUnavailable
|
instanceCount |
minReadyInstanceCount |
maxUnavailable |
Что происходит |
|
1 |
не задано → 0 |
1 |
Оператор обновляет единственный pod, компонент недоступен |
|
3 |
не задано → 2 |
1 |
Оператор обновляет по 1 pod'у, 2 pod'а всегда доступны |
|
5 |
3, задано явно |
2 |
Оператор обновляет по 2 pod'а, 3 pod'а всегда доступны |
|
5 |
не задано → 4 |
1 |
Оператор обновляет по 1 pod'у, 4 pod'а всегда доступны |
Stateless-компоненты не хранят данные — это HTTP- и RPC-прокси, планировщик, Controller-агент и другие. Мастер-серверы, Data-ноды и Tablet-ноды относятся к stateful-компонентам: они отвечают за хранение данных, поэтому стратегия Stateless их не обновляет.