Tangan kami bukan untuk kebosanan: memulihkan cluster Rook di K8s



Kita sudah bicara tentang bagaimana / mengapa kita suka Rook: sampai batas tertentu, ini menyederhanakan bekerja dengan penyimpanan di cluster Kubernetes. Namun, dengan kesederhanaan ini beberapa kesulitan datang. Kami berharap bahwa materi baru akan membantu untuk lebih memahami kesulitan seperti itu bahkan sebelum mereka menampakkan diri.

Dan untuk membacanya lebih menarik, kita mulai dengan konsekuensi dari masalah hipotetis di kluster.

"Semuanya hilang!"


Bayangkan bahwa Anda pernah mengkonfigurasi dan meluncurkan Rook di cluster K8s Anda, ia senang dengan pekerjaannya, tetapi pada saat "luar biasa" hal berikut terjadi:

  • Pod baru tidak dapat me-mount Ceph RBDs.
  • Perintah seperti lsblk dan df tidak berfungsi pada host Kubernetes. Ini secara otomatis berarti "ada sesuatu yang salah" dengan gambar RBD yang dipasang di simpul. Saya tidak bisa membacanya, yang menunjukkan tidak dapat diaksesnya monitor ...
  • Ya, tidak ada monitor operasional di cluster. Selain itu - bahkan tidak ada pod dengan OSD, atau pod dari MGR.

Kapan rook-ceph-operator pod rook-ceph-operator diluncurkan? Belum lama ini saat dia dikerahkan. Mengapa Operator-pemula memutuskan untuk membuat cluster baru ... Bagaimana kita sekarang dapat mengembalikan cluster dan data di dalamnya?

Untuk memulai, mari kita pergi ke cara yang lebih menarik, setelah melakukan penyelidikan mendalam terhadap "internal" Rook dan restorasi komponennya secara bertahap. Tentu saja, ada cara yang benar lebih pendek : menggunakan cadangan. Seperti yang Anda ketahui, admin dibagi menjadi dua jenis: mereka yang tidak melakukan backup, dan mereka yang sudah melakukannya ... Tetapi lebih lanjut tentang ini setelah penyelidikan.

Sedikit latihan, atau jauh


Lihatlah dan pulihkan monitor


Jadi, mari kita lihat daftar ConfigMaps: ada rook-ceph-config dan rook-config-override diperlukan untuk cadangan. Mereka muncul setelah penyebaran cluster berhasil.

NB : Dalam versi baru, setelah adopsi PR ini , ConfigMaps tidak lagi menjadi indikator keberhasilan penyebaran cluster.

Untuk melakukan tindakan lebih lanjut, kita perlu mem-boot ulang semua server yang telah memasang gambar RBD ( ls /dev/rbd* ). Itu harus dilakukan melalui sysrq (atau "berjalan kaki" ke pusat data). Persyaratan ini disebabkan oleh tugas melepaskan RBD yang terpasang, yang untuk itu reboot biasa tidak akan berfungsi (itu tidak akan berhasil mencoba melepasnya secara normal).

Teater dimulai dengan gantungan, dan cluster Ceph dimulai dengan monitor. Mari lihat mereka.

Rook memasang entitas berikut di pod monitor:

 Volumes: rook-ceph-config: Type: ConfigMap (a volume populated by a ConfigMap) Name: rook-ceph-config rook-ceph-mons-keyring: Type: Secret (a volume populated by a Secret) SecretName: rook-ceph-mons-keyring rook-ceph-log: Type: HostPath (bare host directory volume) Path: /var/lib/rook/kube-rook/log ceph-daemon-data: Type: HostPath (bare host directory volume) Path: /var/lib/rook/mon-a/data Mounts: /etc/ceph from rook-ceph-config (ro) /etc/ceph/keyring-store/ from rook-ceph-mons-keyring (ro) /var/lib/ceph/mon/ceph-a from ceph-daemon-data (rw) /var/log/ceph from rook-ceph-log (rw) 

Mari kita lihat apa rahasia dari rook-ceph-mons-keyring :

 kind: Secret data: keyring: LongBase64EncodedString= 

Kami men-decode dan mendapatkan keyring biasa dengan hak admin dan monitor:

 [mon.] key = AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA== caps mon = "allow *" [client.admin] key = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp== caps mds = "allow *" caps mon = "allow *" caps osd = "allow *" caps mgr = "allow *" 

Ingat. Sekarang lihat keyring di rook-ceph-admin-keyring rahasia:

 kind: Secret data: keyring: anotherBase64EncodedString= 

Apa isinya?

 [client.admin] key = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp== caps mds = "allow *" caps mon = "allow *" caps osd = "allow *" caps mgr = "allow *" 

Yang sama. Mari kita lihat lebih lanjut ... Di sini, misalnya, adalah rahasia rook-ceph-mgr-a-keyring :

 [mgr.a] key = AQBZR19dbVeaIhBBXFYyxGyusGf8x1bNQunuew== caps mon = "allow *" caps mds = "allow *" caps osd = "allow *" 

Pada akhirnya, kami menemukan beberapa rahasia lagi di ConfigMap rook-ceph-mon :

 kind: Secret data: admin-secret: AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp== cluster-name: a3ViZS1yb29r fsid: ZmZiYjliZDMtODRkOS00ZDk1LTczNTItYWY4MzZhOGJkNDJhCg== mon-secret: AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA== 

Dan ini adalah daftar awal dengan keyring, dari mana semua rahasia yang dijelaskan di atas berasal.

Seperti yang Anda ketahui (lihat dataDirHostPath dalam dokumentasi ), Rook menyimpan data ini di dua tempat. Oleh karena itu, mari kita pergi ke node untuk melihat keyring'y berbaring di direktori yang dipasang di pod dengan monitor dan OSD. Untuk melakukan ini, cari node /var/lib/rook/mon-a/data/keyring dan lihat:

 # cat /var/lib/rook/mon-a/data/keyring [mon.] key = AXAbS19d8NNUXOBB+XyYwXqXI1asIzGcGlzMGg== caps mon = "allow *" 

Tiba-tiba, rahasianya ternyata berbeda - tidak seperti di ConfigMap.

Bagaimana dengan keyring admin? Kami juga memilikinya:

 # 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 *" 

Inilah masalahnya. Terjadi kegagalan: kluster diciptakan kembali ... tetapi kenyataannya tidak.

Menjadi jelas bahwa keyring yang baru dibuat disimpan dalam rahasia, dan itu bukan dari cluster lama kami. Oleh karena itu:

  • kami mengambil keyring dari monitor dari file /var/lib/rook/mon-a/data/keyring (atau dari cadangan);
  • mengubah keyring di secret rook-ceph-mons-keyring ;
  • mendaftar keyring dari admin dan monitor di ConfigMap'e rook-ceph-mon ;
  • menghapus pengontrol pod dengan monitor.

Mukjizat tidak akan lama: monitor akan muncul dan mulai. Hore, sebuah awal!

Kembalikan OSD


Kami masuk ke rook-operator pod pod: memanggil ceph mon dump menunjukkan bahwa semua monitor ada di tempatnya, dan ceph -s bahwa mereka berada dalam kuorum. Namun, jika Anda melihat pohon OSD ( ceph osd tree ), Anda akan melihat sesuatu yang aneh di dalamnya: OSD mulai muncul, tetapi semuanya kosong. Ternyata mereka juga perlu dipulihkan. Tapi bagaimana caranya?

Sementara itu, rook-ceph-config dan rook-config-override , serta banyak ConfigMaps lainnya dengan nama form rook-ceph-osd-$nodename-config , muncul di ConfigMap yang sangat dibutuhkan. Mari kita lihat mereka:

 kind: ConfigMap data: osd-dirs: '{"/mnt/osd1":16,"/mnt/osd2":18}' 

Semuanya salah, semuanya tercampur aduk!

Skala pod operator ke nol, hapus pod Deployment yang dihasilkan dari OSD, dan perbaiki ConfigMaps ini. Tapi di mana mendapatkan peta OSD yang benar dengan node?

  • Mari mencoba menggali /mnt/osd[1-2] pada node lagi - dengan harapan kita dapat menangkap sesuatu di sana.
  • Ada 2 subdirektori dalam direktori /mnt/osd1 : osd0 dan osd16 . Yang terakhir hanyalah ID yang ditentukan dalam ConfigMap (16)?
  • Mari kita osd0 ukurannya dan lihat bahwa osd0 jauh lebih besar dari osd16 .

Kami menyimpulkan bahwa osd0 adalah OSD yang diperlukan, yang ditetapkan sebagai /mnt/osd1 di ConfigMap (karena kami menggunakan osd berbasis direktori .)

Langkah demi langkah, kami memeriksa semua node dan mengedit ConfigMap. Setelah semua instruksi, Anda dapat menjalankan pod dari operator Rook dan membaca log-nya. Dan semuanya indah di dalamnya:

  • Saya adalah operator klaster;
  • Saya menemukan drive di node;
  • Saya menemukan monitor;
  • monitor menjadi teman, mis. membentuk kuorum;
  • menjalankan penyebaran OSD ...

Mari kita kembali ke pod dari operator Rook dan memeriksa cluster liveness ... ya, kami membuat sedikit kesalahan dengan kesimpulan tentang nama OSD pada beberapa node! Tidak masalah: mereka sekali lagi memperbaiki ConfigMaps, menghapus direktori tambahan dari OSD baru dan sampai pada keadaan HEALTH_OK telah lama ditunggu-tunggu!

Periksa gambar di kolam:

 # 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 … 

Semuanya ada di tempatnya - kluster disimpan!

Saya malas melakukan backup, atau Fast Way


Jika cadangan dilakukan untuk Rook, maka prosedur pemulihan menjadi lebih sederhana dan bermuara sebagai berikut:

  1. Skala ke nol penyebaran operator Benteng;
  2. Kami menghapus semua penyebaran kecuali operator Benteng;
  3. Kami mengembalikan semua rahasia dan ConfigMaps dari cadangan;
  4. Kembalikan isi /var/lib/rook/mon-* pada node;
  5. Pulihkan (jika tiba-tiba hilang) CRD CephCluster , CephFilesystem , CephBlockPool , CephNFS , CephObjectStore ;
  6. Skala penyebaran operator Rook kembali ke 1.

Tips Berguna


Buat cadangan!

Dan untuk menghindari situasi ketika Anda harus pulih dari mereka:

  1. Sebelum skala besar bekerja dengan cluster, yang terdiri dari reboot server, skala operator Rook ke nol sehingga tidak terlalu banyak.
  2. Pada monitor, tambahkan nodeAffinity terlebih dahulu.
  3. Perhatikan pengaturan waktu ROOK_MON_HEALTHCHECK_INTERVAL dan ROOK_MON_OUT_TIMEOUT .

Alih-alih sebuah kesimpulan


Tidak ada gunanya berargumentasi bahwa Rook, sebagai β€œlapisan” tambahan (dalam skema umum mengatur penyimpanan di Kubernetes), yang lebih disederhanakan, juga menambah kesulitan baru dan potensi masalah dalam infrastruktur. Masalahnya tetap "kecil": untuk membuat pilihan yang seimbang dan terinformasi antara risiko ini di satu sisi dan manfaat yang dibawa solusi dalam kasus khusus Anda, di sisi lain.

Omong-omong, bagian "Mengadopsi kluster Rook Ceph yang ada ke dalam kluster Kubernet baru" baru-baru ini ditambahkan ke dokumentasi Rook. Ini menjelaskan secara lebih terperinci apa yang perlu dilakukan untuk memindahkan data yang ada ke kluster Kubernet baru atau mengembalikan kluster yang telah runtuh karena satu dan lain alasan.

PS


Baca juga di blog kami:

Source: https://habr.com/ru/post/id477680/


All Articles