Имеется такой кластер

  • Ceph 15.2.1 установленный с cephadm
  • 14 OSD
  • 3 MON
  • 3 RGW
  • 3 MDS
  • 3 CRUSH

Вышла версия 15.2.4, хотим обновиться.

Запускаемся

Cephadm предоставляет механизм для обновления, но с ходу у меня он не завёлся, пришлось его сопровождать. Давайте посмотрим что вообще нужно обновить.

ceph orch upgrade check ceph/ceph 15.2.4

Перед глазами JSON со списком демонов, которые уже обновлены и те, которые ещё отличаются от запрошенной версии, то есть все, на данный момент. Пора запускаться.
Так, процедура запущена, теперь есть насколько команд, которые стоит выполнять для получения сводки.

  1. ceph status - для получения обобщённой информации о состоянии кластера. Можно в отдельном терминале запустить так: watch -n 10 ceph status
  2. ceph status -W cephadm - вот эту команду точно стоит запустить в терминале, чтобы смотреть именно лог оркестратора.

Временные трудности

Вызываем ceph orch ps и видим, что все мониторы и менеджеры обновлены, хорошо, но теперь мы в HEALTH_ERROR с ошибкой, что я привёл ниже.

module 'cephadm' has failed: auth get failed: failed to find client.crash.01 in keyring retval: -2

Оказывается, не хватает ключей. Создать нужно по одному для каждого crash-a и перезапустить оркестрацию.

for i in $(ceph orch ps | grep -oE 'crash.[0-9]+'); do
  ceph auth get-or-create "client.$i" mgr "profile crash" mon "profile crash"
done
ceph orch upgrade stop
ceph mgr module disable cephadm
ceph mgr module enable cephadm
ceph orch upgrade start ceph/ceph 15.2.4

И вот мы видим, что crash-ы тоже готовы, хорошо, но дальше что-то всё висит. Да, HEALTH_OK, но ceph orch ps показывает, что все OSD ещё на старой версии. В логах видим следующее.

Upgrade: It is NOT safe to stop osd.0

Ага, оркестратор боится останавливать демоны osd с данными. Поможем. У меня ситуация обстоит так.

# ceph osd tree
ID  CLASS  WEIGHT    TYPE NAME       STATUS  REWEIGHT  PRI-AFF
-1         14.00000  root default                             
-3          5.00000      host 01                              
 0    hdd   1.00000          osd.0       up   1.00000  1.00000
 1    hdd   1.00000          osd.1       up   1.00000  1.00000
 2    hdd   1.00000          osd.2       up   1.00000  1.00000
 3    hdd   1.00000          osd.3       up   1.00000  1.00000
 4    hdd   1.00000          osd.4       up   1.00000  1.00000
-5          5.00000      host 02                              
 5    hdd   1.00000          osd.5       up   1.00000  1.00000
 6    hdd   1.00000          osd.6       up   1.00000  1.00000
 7    hdd   1.00000          osd.7       up   1.00000  1.00000
 8    hdd   1.00000          osd.8       up   1.00000  1.00000
 9    hdd   1.00000          osd.9       up   1.00000  1.00000
-7          4.00000      host 03                              
10    hdd   1.00000          osd.10      up   1.00000  1.00000
11    hdd   1.00000          osd.11      up   1.00000  1.00000
12    hdd   1.00000          osd.12      up   1.00000  1.00000
13    hdd   1.00000          osd.13      up   1.00000  1.00000

Сначала я останавливал osd по одному.

ceph osd out osd.0

Потом расслабился и стал выбрасывать по очереди целый сервер. Когда мы выводим из оборота osd.0, через время, когда балансировка заканчивается, ceph status -W cephadm жалуется уже на osd.1, а ceph orch ps показывает, что osd.0 обновлён. Мысль ясна, главное назад не забыть ввести.

ceph osd in osd.0

Короче говоря, выводим osd первого сервера, ждём пока cephadm жалуется на следующие и вводим обратно. Дальше, стоит дождаться HEALTH_OK, прежде чем выводить osd следующего сервера, а то так и без данных не долго остаться...
Опираясь на свой osd tree, план, если делать начисто, таков:

  1. out 0, 1, 2, 3, 4
  2. ждём жалобу на 5
  3. in 0, 1, 2, 3, 4
  4. ждём HEALTH_OK
  5. out 5, 6, 7, 8, 9
  6. ждём жалобу на 10
  7. in 5, 6, 7, 8, 9
  8. ждём HEALTH_OK
  9. out 10, 11, 12, 13
  10. смотрим, что всё обновилось ceph orch ps
  11. in 10, 11, 12, 13
  12. ждём HEALTH_OK
┏━╸┏━╸┏━┓╻ ╻   ╻ ╻┏━┓┏━╸┏━┓┏━┓╺┳┓┏━╸╺┳┓╻
┃  ┣╸ ┣━┛┣━┫   ┃ ┃┣━┛┃╺┓┣┳┛┣━┫ ┃┃┣╸  ┃┃╹
┗━╸┗━╸╹  ╹ ╹   ┗━┛╹  ┗━┛╹┗╸╹ ╹╺┻┛┗━╸╺┻┛╹

P.S.

Кластер полупустой, по этому было быстро. Будь оно иначе, заняло бы дни...

% sudo ceph osd df
ID  CLASS  WEIGHT   REWEIGHT  SIZE     RAW USE  DATA     OMAP     META      AVAIL    %USE  VAR   PGS  STATUS
 0    hdd  1.00000   1.00000  5.5 TiB  1.4 GiB  438 MiB   39 KiB  1024 MiB  5.5 TiB  0.03  1.11   37      up
 1    hdd  1.00000   1.00000  5.5 TiB  1.4 GiB  454 MiB  2.2 MiB  1022 MiB  5.5 TiB  0.03  1.12   46      up
 2    hdd  1.00000   1.00000  5.5 TiB  1.3 GiB  314 MiB  1.0 MiB  1023 MiB  5.5 TiB  0.02  1.01   24      up
 3    hdd  1.00000   1.00000  5.5 TiB  1.2 GiB  161 MiB  2.5 MiB  1022 MiB  5.5 TiB  0.02  0.90   34      up
 4    hdd  1.00000   1.00000  5.5 TiB  1.2 GiB  242 MiB   21 KiB  1024 MiB  5.5 TiB  0.02  0.96   34      up
 5    hdd  1.00000   1.00000  5.5 TiB  1.2 GiB  212 MiB  3.0 MiB  1021 MiB  5.5 TiB  0.02  0.93   34      up
 6    hdd  1.00000   1.00000  5.5 TiB  1.5 GiB  485 MiB  533 KiB  1023 MiB  5.5 TiB  0.03  1.14   35      up
 7    hdd  1.00000   1.00000  5.5 TiB  1.3 GiB  280 MiB  1.8 MiB  1022 MiB  5.5 TiB  0.02  0.99   41      up
 8    hdd  1.00000   1.00000  5.5 TiB  1.3 GiB  265 MiB   19 MiB  1005 MiB  5.5 TiB  0.02  0.97   38      up
 9    hdd  1.00000   1.00000  5.5 TiB  1.4 GiB  359 MiB  949 KiB  1023 MiB  5.5 TiB  0.02  1.05   28      up
10    hdd  1.00000   1.00000  5.5 TiB  1.2 GiB  179 MiB  467 KiB  1024 MiB  5.5 TiB  0.02  0.91   33      up
11    hdd  1.00000   1.00000  5.5 TiB  1.1 GiB  132 MiB  2.8 MiB  1021 MiB  5.5 TiB  0.02  0.87   23      up
12    hdd  1.00000   1.00000  5.5 TiB  1.3 GiB  358 MiB   19 MiB  1005 MiB  5.5 TiB  0.02  1.04   36      up
13    hdd  1.00000   1.00000  5.5 TiB  1.3 GiB  301 MiB  734 KiB  1023 MiB  5.5 TiB  0.02  1.00   39      up
                       TOTAL   76 TiB   18 GiB  4.1 GiB   54 MiB    14 GiB   76 TiB  0.02                   
MIN/MAX VAR: 0.87/1.14  STDDEV: 0.00