
Ние , как\/поради какво ни харесва Rook: значително улеснява работата с хранилища в Kubernetes клъстери. Но с тази леснота идват и определени трудности. Надяваме се, новият материал да помогне да разбрахме по-добре тези трудности, преди да се проявят.
А за да бъде четенето по-интересно, ще започнем с последствията от хипотетичен проблем в клъстера.
„Всичко е загубено!“
Представете си, че един ден сте настроили и пуснали Rook в своя K8s клъстер. Той ви радва с работата си, но в един „прекрасен“ момент се случва следното:
- Новите pod’ове не могат да монтират RBD изображения от Ceph.
- Команди като
lsblkиdfне работят на възлите на Kubernetes. Това автоматично означава: „нещо не е наред“ с монтираните на възлите RBD изображения. Не може да се прочетат, което указва на недостъпност на мониторите… - Да, в клъстера няма работещи монитори. Освен това – няма дори pod’ове с OSD, нито pod на MGR.
Кога беше стартиран pod : сред значимите промени в релиза Rook 1.0.0, свързани с Ceph, мога да отбележа поддръжка на Ceph Nautilus и възможността да се използва NFS за CephFS или RGW контейнери. От останалите се откроява "узряването" на поддръжката на EdgeFS до бета ниво.? Не так давно, как его деплоили. Почему? Rook-operator решил сделать новый кластер… Как же нам теперь восстановить работу кластера и данные в нём?
Първо ще тръгнем по по-дългия интересен път, извършвайки задълбочено разследване по „вътрешностите“ на Rook и стъпка по стъпка възстановяване на компонентите му. Разбира се, има и по-кратък правилен път: използване на резервни копия. Както е известно, администраторите се делят на два типа: на тези, които не правят резервни копия, и на тези, които вече правят… Но за това – след разследването.
Малко практика, или Дългият път
Нека се огледаме и възстановим мониторите
И така, нека разгледаме списъка с ConfigMap’ове: там има необходимите за резервиране rook-ceph-config и rook-config-override. Те се появяват при успешен деплой на клъстера.
NB: В новите версии, след приемането на , ConfigMap’ите престават да бъдат показател за успешност на деплоя на клъстера.
За извършване на по-нататъшни действия ни е необходима остри ребут на всички сървъри, на които присъстват монтирани RBD изображения (ls \/dev\/rbd*). Трябва да се направи чрез sysrq (или „пешком“ в ЦОД). Това изискване произлиза от необходимостта да се откачат монтираните RBD, за което обикновеният ребут не е подходящ (ще бъде безуспешно да се опитват да се отмонтират нормално).
Театърът започва с закачалката, а Ceph клъстерът – с мониторите. Нека да ги разгледаме.
Rook монтира в pod на монитора следните единици:
Томове:
rook-ceph-config:
Тип: ConfigMap (том, заполняемый с помощью ConfigMap)
Имя: rook-ceph-config
rook-ceph-mons-keyring:
Тип: Secret (том, заполняемый с помощью секрета)
SecretName: rook-ceph-mons-keyring
rook-ceph-log:
Тип: HostPath (оболочка с директориями хоста)
Путь: /var/lib/rook/kube-rook/log
ceph-daemon-data:
Тип: HostPath (оболочка с директориями хоста)
Путь: /var/lib/rook/mon-a/data
Монтаж:
/etc/ceph от rook-ceph-config (ro)
/etc/ceph/keyring-store/ от rook-ceph-mons-keyring (ro)
/var/lib/ceph/mon/ceph-a от ceph-daemon-data (rw)
/var/log/ceph от rook-ceph-log (rw) Да видим, что в секрете rook-ceph-mons-keyring:
вид: Secret
data:
keyring: LongBase64EncodedString=Декодируем и получаем обычный keyring с правами для администратора и мониторов:
[mon.]
key = AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==
caps mon = "allow *"
[client.admin]
key = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *" Запомним. А теперь посмотрим на keyring в секрете rook-ceph-admin-keyring:
вид: Secret
data:
keyring: anotherBase64EncodedString=Что в нём?
[client.admin]
key = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *" Тот же. Посмотрим ещё… Вот, например, секрет rook-ceph-mgr-a-keyring:
[mgr.a]
key = AQBZR19dbVeaIhBBXFYyxGyusGf8x1bNQunuew==
caps mon = "allow *"
caps mds = "allow *"
caps osd = "allow *" В конечном итоге мы находим ещё несколько секретов в ConfigMap’е rook-ceph-mon:
вид: Secret
data:
admin-secret: AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
cluster-name: a3ViZS1yb29r
fsid: ZmZiYjliYjMtODRkOS00ZDk1LTczNTItYWY4MzZhOGJkNDJhCg==
mon-secret: AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==И это изначальный список с keyring’ами, откуда берутся все описанные выше секреты.
Как известно (см. dataDirHostPath в ), Rook хранит такие данные в двух местах. Поэтому давайте сходим на узлы, чтобы посмотреть на keyring’и, лежащие в каталогах, что примонтированы в pod’ы с мониторами и OSD. Для этого найдём на узлах /var/lib/rook/mon-a/data/keyring и увидим:
# cat /var/lib/rook/mon-a/data/keyring
[mon.]
key = AXAbS19d8NNUXOBB+XyYwXqXI1asIzGcGlzMGg==
caps mon = "allow *"Внезапно тут секрет оказался другим — не как в ConfigMap’ах.
А что насчет админского keyring’а? Он тоже у нас есть:
# cat /var/lib/rook/kube-rook/client.admin.keyring
[client.admin]
key = AXAbR19d8GGSMUBN+FyYwEqGI1aZizGcJlHMLgx=
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *"Вот тут и проблема. Произошел некий сбой: кластер пересоздался… но в действительности нет.
Становится понятно, что в секретах хранятся заново сгенерированные keyring’и, и они не от нашего старого кластера. Поэтому:
- берём keyring от монитора из файла
/var/lib/rook/mon-a/data/keyring(либо из бекапа); - изменяем keyring в секрете
rook-ceph-mons-keyring; - прописываем keyring от админа и монитора в ConfigMap’е
rook-ceph-mon; - удаляем контроллеры pod’ов с мониторами.
Чудо не заставит себя долго ждать: мониторы появятся и запустятся. Ура, начало положено!
Восстановим OSD
Заходим в pod rook-operator: вызов ceph mon dump показывает, что все мониторы на месте, а ceph -s — на това, че са в кворума. Въпреки това, ако погледнем на дървото на OSD (ceph osd tree), ще видим нещо странно: OSD-те започнаха да се появяват, но са празни. Значи, трябва да ги възстановим по някакъв начин. Но как?
Междувременно, в ConfigMap-ите се появиха толкова нужните ни rook-ceph-config и rook-config-override, както и множество други ConfigMap-ове с имена вида rook-ceph-osd-$nodename-config. Нека да ги разгледаме:
kind: ConfigMap
data:
osd-dirs: '{"/mnt/osd1":16,"/mnt/osd2":18}'Всичко е грешно, всичко е объркано!
Нека да скалираме pod-а на оператора до нулата, да изтрием генерираните Deployment-и на pod-овете с OSD и да поправим тези ConfigMap-ове. Но откъде да вземем правилната карта на OSD по възлите?
- Нека отново да копаем в директориите
/mnt/osd[1-2]на възлите — с надеждата, че можем да се закачим за нещо. - В каталога
/mnt/osd1има 2 подкаталога:osd0иosd16. Последният — това е точно онзи ID, който е посочен в ConfigMap (16)? - Нека да проверим по размерите и да видим, че
osd0е значително по-голямоosd16.
Стигаме до извода, че osd0 — това е нужният OSD, който е бил посочен като /mnt/osd1 в ConfigMap (все пак използваме .)
Стъпка по стъпка проверяваме всички възли и поправяме ConfigMap-ите. След всички указания можем да стартираме pod на Rook-оператора и да прочетем логовете му. А в тях всичко е прекрасно:
- Аз съм оператор на кластера;
- Намерих дисковете на възлите;
- Намерих мониторите;
- мониторите се свързаха, т.е. образуваха кворум;
- стартирам деплойментите на OSD…
Отново ще влезем в pod на оператора Rook и ще проверим живота на кластера… да, малко се объркахме с изводите за имената на OSD на някои възли! Няма проблем: отново поправихме ConfigMap-ите, изтрихме излишните каталози от новите OSD и стигнахме до дългоочакваното състояние HEALTH_OK!
Нека да проверим образите в пула:
# rbd ls -p kube
pvc-9cfa2a98-b878-437e-8d57-acb26c7118fb
pvc-9fcc4308-0343-434c-a65f-9fd181ab103e
pvc-a6466fea-bded-4ac7-8935-7c347cff0d43
pvc-b284d098-f0fc-420c-8ef1-7d60e330af67
pvc-b6d02124-143d-4ce3-810f-3326cfa180ae
pvc-c0800871-0749-40ab-8545-b900b83eeee9
pvc-c274dbe9-1566-4a33-bada-aabeb4c76c32
…Всичко е на мястото си — кластерът е спасен!
Аз съм мързелив и правя резервни копия, или Бързият начин
Ако резервните копия за Rook са правени, процедурата за възстановяване става значително по-проста и се свежда до следното:
- Скалираме deployment на Rook-оператора до нула;
- Изтриваме всички деплойменти, с изключение на Rook-оператора;
- Възстановяваме всички секрети и ConfigMap-ове от резервното копие;
- Възстановяваме съдържанието на директориите
/var/lib/rook/mon-*на възлите; - Възстановяваме (ако случайно сме загубили) CRD
CephCluster,CephFilesystem,CephBlockPool,CephNFS,CephObjectStore; - Обратно скалираме deployment на Rook-оператора на 1.
Полезни съвети
Правете резервни копия!
А за да избегнем ситуации, в които ще се наложи възстановяване от тях:
- Преди мащабни операции с кластера, включващи рестартиране на сървърите, скалирайте Rook-оператора до нула, за да не прави излишни действия.
- На мониторите предварително .
- Обърнете внимание на предварителната
ROOK_MON_HEALTHCHECK_INTERVALиROOK_MON_OUT_TIMEOUT.
Вместо заключение
Няма смисъл да спорим, че Rook, като допълнителен „слой“ (в общата схема на организация на хранилищата в Kubernetes), както много опростява, така и добавя нови трудности и потенциални проблеми в инфраструктурата. Остава само да се направи обоснован избор между тези рискове от една страна и ползата, която решението носи в конкретния ви случай, от друга.
Между другото, наскоро в документацията на Rook раздел „Adopt an existing Rook Ceph cluster into a new Kubernetes cluster“. В него се описва по-подробно какво е необходимо да се направи, за да се премести с наличните данни в нов Kubernetes клъстер или да се възстанови работата на клъстера, който е бил разрушен по някаква причина.
P.S.
Прочетете също в нашия блог:
- «»;
- «»;
- «».
- «».
Източник: habr.com
