Стратегии обновления YTsaurus

В этой статье описаны стратегии обновления компонентов кластера YTsaurus, их отличия и порядок настройки. Выбирайте стратегию в зависимости от требований к доступности кластера во время обновления.

Обзор стратегий

Стратегия обновления определяет, перезапускает ли оператор pod'ы компонента одновременно или последовательно по одному. От этого зависит, будет ли кластер доступен во время обновления.

Чтобы выбрать стратегию, опишите правила обновления в поле updatePlan. В каждом правиле вы указываете, какие компоненты обновлять и по какой стратегии. Одно правило может охватывать весь кластер, отдельные компоненты или группы компонент. Подробнее — в разделе Настройка поля updatePlan.

Оператор поддерживает три стратегии обновления:

Стратегия

Описание

Доступность кластера

BulkUpdate

Оператор применяет эту стратегию по умолчанию, если вы не указали её явно. Оператор одновременно удаляет и пересоздаёт все pod'ы компонента. При обновлении мастер-серверов оператор включает safe mode и создаёт снапшоты. Планируйте такое обновление в период минимальной нагрузки. Подробнее — в разделе Стратегия по умолчанию BulkUpdate

Кластер недоступен

RollingUpdate

Доступна с версии оператора 0.31.0. Оператор обновляет pod'ы по одному или группами и гарантирует минимальное количество доступных инстансов. Подходит не для всех компонентов: мастер-серверы можно обновить только через BulkUpdate или OnDelete. Для остальных компонентов требуется минимум 2 инстанса. Подробнее — в разделе Стратегия RollingUpdate

Кластер доступен, кроме обновления мастер-серверов

OnDelete

Доступна с версии оператора 0.31.0. Оператор обновляет спецификацию StatefulSet, но не перезапускает pod'ы автоматически — вы удаляете их вручную. Для мастер-серверов удаляйте pod'ы по одному, иначе кластер станет недоступен

Зависит от действий пользователя

Настройка поля updatePlan

Добавьте поле updatePlan в спецификацию кластера YTsaurus. В нём вы перечисляете правила: в каждом правиле выбираете компоненты по полю class или component и задаёте стратегию обновления в поле strategy. Оператор проверяет правила сверху вниз и применяет первое подходящее. Поэтому специфичные правила по полю component ставьте перед общими правилами по полю class.

Описание полей

Поле

Описание

class

Выбор компонентов по классу. Доступные значения:

  • Everything — оператор обновляет все компоненты;
  • Stateless — оператор обновляет все stateless-компоненты, кроме мастер-серверов, Data-нод и Tablet-нод;
  • Nothing — оператор не обновляет ни один компонент.

component.type

Выбор по типу компонента: Master, HttpProxy, RpcProxy, DataNode, ExecNode, TabletNode, Scheduler, ControllerAgent, Discovery и другие

component.name

Выбор конкретной instance group по имени. Необязательное поле

concurrency

Максимальное количество instance groups, которые оператор обновляет одновременно

strategy.rollingUpdate

Стратегия RollingUpdate: оператор обновляет pod'ы по одному

strategy.onDelete

Стратегия OnDelete: вы удаляете pod'ы вручную

strategy.runPreChecks

Запускать ли 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 задаёт список правил: в каждом правиле вы выбираете компоненты и стратегию их обновления.

Прямое соответствие старого флага и нового поля:

Флаг enableFullUpdate

Поле updatePlan

Результат

enableFullUpdate: true

Правило с class: Everything

Обновить все серверные компоненты

enableFullUpdate: false

Пустой updatePlan или правило с class: Nothing

Не обновлять ничего

Пример: полное обновление
# Оператор 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 пока не реализован. Оператор обновляет их через BulkUpdate или OnDelete

При BulkUpdate кластер недоступен

Важно

Для корректной работы стратегии 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 их не обновляет.

Предыдущая
Следующая