Ceph melalui iSCSI - atau bermain ski sambil berdiri di tempat tidur gantung

Apakah ada di antara kita (tsefovodov) yang tidak menyukai “ekstrim profesional”?

Kecil kemungkinannya - jika tidak, kami tidak akan bermain-main dengan produk yang sangat menarik dan lucu ini.

Banyak dari mereka yang terlibat dalam pengoperasian Ceph telah menemukan kasus yang tidak terlalu sering (atau bahkan sangat jarang), tetapi terkadang dalam permintaan - menghubungkan Ceph melalui iSCSI atau FC. Untuk apa? Misalnya, kirimkan gambar dari Ceph ke server Windows atau Solaris yang belum tervirtualisasi karena alasan tertentu. Atau yang tervirtualisasi, tetapi menggunakan hypervisor yang tidak bisa melakukan Ceph - dan, seperti kita tahu, ada banyak sekali. Misalnya? Nah, misalnya HyperV atau ESXi yang aktif digunakan. Dan jika muncul tugas untuk menyajikan gambar dari Ceph ke mesin tamu, ini menjadi tugas yang sangat menarik.

Jadi diberikan:

  1. cluster Ceph yang sudah berjalan
  2. gambar yang sudah ada yang harus disajikan melalui iSCSI
  3. Nama kolam kolam saya, nama gambar gambarku

Mulai?

Pertama-tama, ketika kita berbicara tentang FC atau iSCSI, kita memiliki entitas seperti inisiator dan target. Target sebenarnya adalah server, inisiator adalah klien. Tugas kita adalah mengirimkan gambar Ceph ke pemrakarsa dengan sedikit usaha. Artinya kita harus memperluas target. Tapi di mana, di komputer apa?

Untungnya, dalam cluster Ceph kami memiliki setidaknya satu komponen yang alamat IP-nya tetap dan salah satu komponen terpenting Ceph dikonfigurasi, dan komponen tersebut adalah monitor. Oleh karena itu, kami memasang target iSCSI pada monitor (dan initator pada saat yang sama, setidaknya untuk pengujian). Saya melakukan ini di CentOS, tetapi solusinya juga cocok untuk distribusi lain - Anda hanya perlu menginstal paket dengan cara yang dapat diterima di distribusi Anda.

# yum -y install iscsi-initiator-utils targetcli

Apa tujuan dari paket yang diinstal?

  • targetcli — sebuah utilitas untuk mengelola target SCSI yang dibangun di dalam kernel Linux
  • iscsi-inisiator-utils — paket dengan utilitas yang digunakan untuk mengelola inisiator iSCSI yang terpasang di kernel Linux

Untuk mengirimkan gambar melalui iSCSI ke pemrakarsa, ada dua opsi untuk pengembangan peristiwa - gunakan backend ruang pengguna target atau sambungkan gambar sebagai perangkat blok yang terlihat oleh sistem operasi dan ekspor melalui iSCSI. Kami akan memilih cara kedua - backend ruang pengguna masih dalam status "eksperimental" dan sedikit belum siap untuk penggunaan produktif. Selain itu, ada jebakan yang bisa Anda bicarakan banyak dan (oh ngeri!) Berdebat.

Jika kita menggunakan distribusi yang agak stabil dengan siklus dukungan yang panjang, maka kernel yang kita miliki adalah versi yang sangat kuno. Misalnya, di CentOS7 adalah 3.10.*, di CentOS8 adalah 4.19. Dan kami tertarik pada kernel minimal 5.3 (atau lebih tepatnya 5.4) dan yang lebih baru. Mengapa? Karena secara default image Ceph memiliki serangkaian opsi yang diaktifkan yang tidak kompatibel dengan kernel lama. Ini berarti kita menghubungkan repositori dengan kernel baru untuk distribusi kita (misalnya, untuk CentOS ini adalah elrepo), menginstal kernel baru dan me-reboot sistem agar bekerja dengan kernel baru:

  • Hubungkan ke monitor yang dipilih untuk percobaan
  • Kami menghubungkan repositori elrepo sesuai dengan instruksi - elrepo.org/tiki/tiki-index.php
  • Instal kernel: yum -y —enablerepo=elrepo-kernel instal kernel-ml
  • Reboot server dengan monitor (kami punya tiga monitor, kan?)

Menghubungkan gambar sebagai perangkat blok

# rbd map mypool/myimage
/dev/rbd0

Yang tersisa hanyalah mengkonfigurasi target. Dalam contoh ini, saya akan mengkonfigurasi target dalam apa yang disebut. mode demo - tanpa otentikasi, terlihat dan dapat diakses oleh semua orang. Dalam lingkungan produksi, Anda mungkin ingin mengonfigurasi autentikasi - namun hal tersebut agak di luar cakupan latihan yang hanya untuk bersenang-senang saat ini.

Buat backend bernama disk1 yang terkait dengan file /dev/rbd/mypool/myimage. File yang ditentukan adalah tautan simbolik yang secara otomatis dibuat oleh daemon udev ke /dev/rbd0. Kami menggunakan tautan simbolik karena nama perangkat rbd dapat berubah tergantung pada urutan koneksi gambar Ceph ke host.

Buat bagian belakang:

# targetcli /backstores/block create disk1 /dev/rbd/mypool/myimage

Buat target iSCSI:

# targetcli /iscsi create iqn.2020-01.demo.ceph:mypool

Kami menghubungkan backend sebagai LUN ke target:

# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/luns create /backstores/block/disk1

Mari konfigurasikan target untuk mode demo:

# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute demo_mode_write_protect=0
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute generate_node_acls=1
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute cache_dynamic_acls=1

Simpan konfigurasi:

# targetcli saveconfig

Memeriksa ketersediaan target:

# iscsiadm -m discovery -t st -p 127.0.0.1:3260
127.0.0.1:3260,1 iqn.2020-01.demo.ceph:mypool

Kami menghubungkan target:

# iscsiadm -m node --login
Logging in to [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] (multiple)
Login to [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] successful.

Jika Anda melakukan semuanya dengan benar, disk baru akan muncul di server, yang terlihat seperti perangkat SCSI, tetapi sebenarnya merupakan gambar dari Ceph, diakses melalui target iSCSI. Untuk menghindari masalah boot, lebih baik menghapus disk yang terhubung dan target yang terdeteksi dari inisiator lokal:

# iscsiadm -m node --logout
# iscsiadm -m discoverydb -o delete -t st -p 127.0.0.1:3260

Yang tersisa hanyalah mempertahankan konfigurasi sehingga gambar terhubung secara otomatis dan, setelah koneksi, targetnya bertingkat. Meluncurkan target terdiri dari dua langkah - menghubungkan RBD dan meluncurkan target secara nyata.

Pertama, mari konfigurasikan koneksi otomatis gambar RBD ke host. Hal ini dilakukan dengan menambahkan baris berikut ke file /etc/ceph/rbdmap:

# cat /etc/ceph/rbdmap
# RbdDevice Parameters
mypool/myimage id=admin
# systemctl enable rbdmap

Memulihkan konfigurasi target sedikit lebih rumit - kita perlu menulis unit untuk systemd yang akan memulihkan konfigurasi:

# cat /usr/lib/systemd/system/scsi-target.service
[Unit] Description=Start iSCSI target

After=network-online.target rbdmap.service
Before=remote-fs-pre.target
Wants=network-online.target remote-fs-pre.target

[Service] Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/targetcli restoreconfig

[Install] WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl enable scsi-target

Tes terakhir adalah me-reboot monitor kita lagi (sekarang menjadi target iSCSI). Perlu diperhatikan jika kita belum membersihkan database inisiator dengan perintah iscsiadm -n Discoverydb -o hapus ... Anda mungkin mendapatkan server yang tidak memuat atau membutuhkan waktu lama untuk dimuat.

Apa yang tersisa?

Konfigurasikan inisiator di server tempat kita ingin mengirim target.

Bagaimana cara memastikan toleransi kesalahan target kita?

Anda juga dapat mengkonfigurasi target pada monitor lain dan mengatur multipath (vmware akan memahami hal ini dan bahkan berfungsi, Hyper-V tidak akan mengerti - ini memerlukan kunci SCSI). Karena klien Ceph dari kernel tidak menggunakan caching, ini cukup bisa dilakukan. Atau pilihan lain adalah membuat sumber daya cluster yang terdiri dari tiga komponen - alamat IP target khusus dan layanan rbdmap dan scsi-target, dan mengelola sumber daya ini melalui alat clustering (siapa bilang alat pacu jantung?)

bukan sebuah epilog

Jelasnya, artikel ini sedikit bercanda - tetapi di dalamnya saya mencoba "dengan cepat dan dengan contoh" mempertimbangkan beberapa topik yang cukup populer secara bersamaan - target iSCSI, yang belum tentu mengekspor gambar Ceph - tetapi misalnya, mengekspor volume LVM, dasar-dasar bekerja dengan inisiator iSCSI ( cara memindai target, cara menyambung ke target, memutuskan sambungan, menghapus entri target dari database), menulis unit Anda sendiri untuk systemd dan beberapa lainnya

Saya harap meskipun Anda tidak mengulangi seluruh percobaan ini secara penuh, setidaknya sesuatu dari artikel ini akan bermanfaat bagi Anda.

Sumber: www.habr.com

Tambah komentar