Обновление серверных компонент YTsaurus

Выбор образа и старт обновления

Периодически выпускаются новые релизы, а также вносятся исправления в рамках текущих стабильных релизов. Почитать подробнее про выпущенные релизы можно в отдельном разделе. Докер-образы со стабильными релизами имеют вид ghcr.io/ytsaurus/ytsaurus:23.N.M, например ghcr.io/ytsaurus/ytsaurus:23.2.1.

Kubernetes оператор поддерживает обновление докер-образов, используемых для серверных компонент. Для обновления необходимо поменять coreImage в спецификации YTsaurus и запушить её в k8s с помощью kubectl apply -f my_ytsaurus_spec.yaml -n <namespace>.

Внимание

Можно обновляться только на более свежие версии. При попытке обновления на более старый образ мастера не смогут подняться. После успешного обновления на свежую версию откатиться обратно уже невозможно.

Крайне не рекомендуется обновляться на dev версию, собранную из текущей main ветки, так как такие версии YTsaurus не является стабильными и не оттестированы. При этом обновиться обратно на последний выпущенный стабильный релиз будет невозможно по описанным выше причинам.

Важно

Перед обновлением YTsaurus необходимо обновить оператор на последний релиз. Работоспособность новых стабильных образов не гарантируется со старым оператором, а также не гарантируется работоспособность оператора с нестабильными версиями YTsaurus, например, с dev. Найти список стабильных образов можно на страницe Релизы.

Статус обновления

Следить за статусом обновления можно с помощью статуса ресурса Ytsaurus:

$ kubectl get ytsaurus -n <namespace>
NAME         CLUSTERSTATE      UPDATESTATE            UPDATINGCOMPONENTS
minisaurus   Updating          WaitingForPodsRemoval

Если обновление началось, то кластер переходит в состояние Updating (CLUSTERSTATE) и далее можно следить за состоянием обновления (UPDATESTATE). Более детальную информацию о происходящем можно узнать, выполнив kubectl describe ytsaurus -n <namespace>.

После окончания обновления кластер снова переходит в состояние Running:

$ kubectl get ytsaurus -n <namespace>
NAME         CLUSTERSTATE   UPDATESTATE   UPDATINGCOMPONENTS
minisaurus   Running        None

Полное и частичное обновление

В спецификации Ytsaurus можно указать как один образ на все серверные компоненты (coreImage), так и разные образы для разных компонент (в поле image компонент). Указывать отдельные образы следует в редких случаях, желательно предварительно обсудить такое решение с командой YTsaurus. Если у компоненты указан свой собственный образ, то будет использоваться он. При изменении image также запускается обновление кластера, но в результате обновится только часть компонент.

Обновление статических конфигов

По спецификации Ytsaurus оператор генерирует статические конфиги компонент. Поэтому при некоторых изменениях (например, при изменении locations) может потребоваться перегенерировать конфиг, а также перезапустить поды соответствующей компоненты. Поэтому при изменении конфига также будет запускаться обновление.

Невозможность обновления

Существует ряд ситуаций, в которых запускать обновление может быть небезопасно. Поэтому оператор перед стартом обновления выполняет различные проверки, например, проверяет, живы ли на данный момент все tablet cell bundles. Если по результатам проверок оператор приходит к выводу, что обновление сейчас невозможно, то выставляется состояние обновления ImpossibleToStart.

$ kubectl get ytsaurus -n <namespace>
NAME         CLUSTERSTATE   UPDATESTATE           UPDATINGCOMPONENTS
minisaurus   Updating       ImpossibleToStart

Узнать причину можно в статусе Ytsaurus, выполнив kubectl describe ytsaurus -n <namespace> и посмотрев на Conditions в UpdateStatus.

Пример причины невозможности запуска обновления
$ kubectl describe ytsaurus -n <namespace>
...
  Update Status:
    Conditions:
      Last Transition Time:  2023-09-26T09:18:11Z
      Message:               Tablet cell bundles ([sys default]) aren't in 'good' health
      Reason:                Update
      Status:                True
      Type:                  NoPossibility
    State:                   ImpossibleToStart

Если подобное произошло, необходимо вернуть спецификацию в прежнее значение, чтобы образы компонент не поменялись, а также по спецификации генерировались те же статические конфиги, что и раньше. Далее оператор отменит обновление и переведет YTsaurus обратно в состояние Running.

Ручное вмешательство

В процессе обновления потенциально могут возникнуть различные проблемы, и может понадобиться ручное вмешательство. Для этого в спецификации Ytsaurus можно выставить флаг isManaged=false. После этого оператор прекратит что-либо делать с данным кластером, и можно делать ручные действия.

Внимание

В случае возникновения непредвиденных проблем в процессе обновления рекомендуется проконсультироваться с командой YTsaurus перед осуществлением каких-либо ручных действий.

Обновление оператора

Внимание

Перед обновлением оператора кластер должен находиться в работоспособном состоянии. Например, на кластере не должно быть lvc, а также все tablet cell bundles должны быть живы.

Инструкция

  1. Запустите обновление чарта helm upgrade ytsaurus --install oci://ghcr.io/ytsaurus/ytop-chart --version <new-version>
  2. Проверить, что старые поды оператора удалились, а новые создались:
$ kubectl get pod -n <namespace>
NAME                                                      READY   STATUS        RESTARTS   AGE
ytsaurus-ytop-chart-controller-manager-6f67fd5d5c-6bbws   2/2     Running       0          21s
ytsaurus-ytop-chart-controller-manager-7478f9b6cb-qr8wd   2/2     Terminating   0          23h

$ kubectl get pod -n <namespace>
NAME                                                      READY   STATUS    RESTARTS   AGE
ytsaurus-ytop-chart-controller-manager-6f67fd5d5c-6bbws   2/2     Running   0          25s

Возможное автоматическое обновление кластера

Разные версии оператора могут генерировать разные конфиги для одних и тех же компонент (например, в новой версии оператора может добавиться новое поле). В таком случае, сразу после запуска оператора будет запущено обновление кластера.

Если обновление окажется невозможно, то кластер останется в состоянии Updating, а статус обновления станет ImpossibleToStart. В таком случае можно откатить оператор, тогда обновление отменится и кластер перейдет в состояние Running. Либо можно выставить флаг enableFullUpdate = false в спецификации Ytsaurus, в таком случае обновление также будет отменено и новый оператор не будет больше пытаться запускать обновление кластера. После этого можно привести кластер в рабочее состояние и повторить попытку обновления, выставив флаг enableFullUpdate = true.