Jika Anda memerlukan beberapa node untuk membaca dan menulis secara konkuren ke disk cloud yang sama guna mencapai berbagi data yang efisien dan failover cepat, Anda dapat menggunakan fitur multi-attach untuk menyambungkan satu ESSD, ESSD AutoPL, atau jenis disk cloud lainnya ke beberapa node yang mendukung protokol NVMe dalam zona yang sama, atau menyambungkan satu ESSD penyimpanan redundan zona ke beberapa node dalam wilayah yang sama. Topik ini menjelaskan cara menggunakan fitur multi-attach dan Reservation disk cloud NVMe dalam kluster ACK.
Sebelum memulai
Untuk memanfaatkan fitur multi-attach dan Reservation disk cloud NVMe secara optimal, kami menyarankan agar Anda memahami informasi berikut sebelum membaca dokumen ini:
Untuk informasi mengenai protokol NVMe, lihat Ikhtisar protokol NVMe.
Untuk informasi mengenai fitur multi-attach disk cloud dan batasannya, lihat Fitur multi-attach disk cloud.
Skenario
Fitur multi-attach cocok untuk skenario berikut:
Batasan
Satu disk cloud NVMe dapat disambungkan ke maksimal 16 Instance ECS dalam zona yang sama secara bersamaan.
Jika Anda ingin membaca dan menulis ke disk cloud dari beberapa node secara bersamaan, Anda harus memasang disk cloud menggunakan volumeDevices. Metode ini memasang disk cloud sebagai perangkat blok dan tidak mendukung akses melalui sistem file.
Untuk informasi lebih lanjut mengenai batasan, lihat Batasan fitur multi-attach.
Persiapan
Kluster ACK yang dikelola telah dibuat, dan versi Kubernetes kluster tersebut adalah 1.20 atau lebih baru. Untuk informasi selengkapnya, lihat Membuat Kluster ACK yang dikelola.
Komponen csi-plugin dan csi-provisioner telah diinstal, dan versi komponen tersebut adalah v1.24.10-7ae4421-aliyun atau lebih baru. Untuk informasi tentang cara memperbarui komponen csi-plugin dan csi-provisioner, lihat Mengelola komponen csi-plugin dan csi-provisioner.
Kluster berisi minimal dua node yang berada dalam zona yang sama dan mendukung fitur multi-attach. Untuk informasi mengenai keluarga instance yang mendukung fitur multi-attach, lihat Batasan fitur multi-attach.
Aplikasi bisnis yang memenuhi persyaratan berikut telah disiapkan dan dikemas menjadi gambar kontainer untuk diterapkan di kluster ACK:
Aplikasi mendukung akses data pada disk cloud yang sama dari beberapa replika secara bersamaan.
Aplikasi dapat memastikan konsistensi data dengan menggunakan fitur standar seperti NVMe Reservation.
Deskripsi penagihan
Fitur multi-attach tidak dikenakan biaya tambahan. Sumber daya yang mendukung protokol NVMe tetap ditagih berdasarkan metode penagihan aslinya. Untuk informasi selengkapnya mengenai penagihan disk cloud, lihat Volume Elastic Block Storage.
Contoh aplikasi
Topik ini menggunakan kode sumber dan Dockerfile dari contoh aplikasi berikut. Setelah aplikasi dibuat, unggah ke repository image untuk diterapkan di kluster. Dalam contoh aplikasi ini, beberapa replika secara bersama mengelola sebuah lease, tetapi hanya satu replika yang memegang lease tersebut. Jika replika tidak dapat berfungsi dengan baik, replika lain secara otomatis mengambil alih lease tersebut. Perhatikan hal berikut saat menulis aplikasi:
Dalam contoh ini,
O_DIRECTdigunakan untuk membuka perangkat blok guna operasi baca dan tulis guna mencegah cache apa pun memengaruhi pengujian.Dalam contoh ini, antarmuka sederhana Reservation yang disediakan oleh kernel Linux digunakan. Anda juga dapat menggunakan salah satu metode berikut untuk menjalankan perintah terkait Reservation. Metode-metode ini memerlukan hak istimewa.
Kode C:
ioctl(fd, NVME_IOCTL_IO_CMD, &cmd);Antarmuka baris perintah:
nvme-cli
Untuk informasi selengkapnya mengenai fitur NVMe Reservation, lihat Spesifikasi NVMe.
Langkah 1: Terapkan aplikasi dan konfigurasikan fitur multi-attach
Buat StorageClass bernama alicloud-disk-shared dan aktifkan fitur multi-attach untuk disk cloud.
Buat PVC bernama data-disk dan atur accessModes ke ReadWriteMany dan volumeMode ke Block.
Buat aplikasi StatefulSet bernama lease-test dan gunakan gambar contoh aplikasi dalam topik ini.
Buat file lease.yaml dengan konten berikut.
Ganti alamat gambar kontainer dalam YAML berikut dengan alamat gambar aktual aplikasi Anda.
PentingKarena NVMe Reservation berlaku di tingkat node, beberapa pod pada node yang sama dapat saling mengganggu. Oleh karena itu,
podAntiAffinitydigunakan dalam contoh ini untuk mencegah beberapa pod dijadwalkan ke node yang sama.Jika kluster Anda mencakup node lain yang tidak menggunakan protokol NVMe, Anda perlu mengonfigurasi afinitas untuk memastikan pod dijadwalkan ke node yang menggunakan protokol NVMe.
Parameter
Deskripsi konfigurasi untuk fitur multi-attach
Deskripsi konfigurasi untuk pemasangan normal
StorageClass
parameters.multiAttach
Atur ke true untuk mengaktifkan fitur multi-attach untuk disk cloud.
Tidak perlu konfigurasi
PVC
accessModes
ReadWriteMany
ReadWriteOnce
volumeMode
Block
Filesystem
Metode pemasangan volume penyimpanan
volumeDevices: Mengakses data pada disk cloud secara langsung melalui perangkat blok.
volumeMounts: Terutama digunakan untuk memasang volume bertipe sistem file.
Jalankan perintah berikut untuk menerapkan aplikasi:
kubectl apply -f lease.yaml
Langkah 2: Verifikasi efek multi-attach dan Reservation
Untuk memastikan konsistensi data pada disk cloud NVMe, Anda dapat mengontrol izin baca dan tulis melalui Reservation dalam aplikasi Anda. Jika satu pod melakukan operasi tulis, pod lain hanya dapat melakukan operasi baca.
Beberapa node dapat membaca dan menulis ke disk cloud yang sama
Jalankan perintah berikut untuk melihat log pod:
kubectl logs -l app=lease-test --prefix -fHasil yang diharapkan:
[pod/lease-test-0/lease] Register as key 4745d0c5cd9a2fa4
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed leaseHasil yang diharapkan menunjukkan bahwa Pod lease-test-1 dapat langsung membaca konten yang ditulis oleh Pod lease-test-0.
NVMe Reservation berhasil dibuat
Jalankan perintah berikut untuk mendapatkan ID disk cloud:
kubectl get pvc data-disk -ojsonpath='{.spec.volumeName}'Login ke salah satu dari dua node tersebut dan jalankan perintah berikut untuk memeriksa apakah NVMe Reservation berhasil dibuat:
Ganti
2zxxxxxxxxxxxdalam kode berikut dengan konten setelahd-pada ID disk cloud yang Anda peroleh pada langkah sebelumnya.nvme resv-report -c 1 /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_2zxxxxxxxxxxxHasil yang diharapkan:
NVME Reservation status: gen : 3 rtype : 1 regctl : 1 ptpls : 1 regctlext[0] : cntlid : ffff rcsts : 1 rkey : 4745d0c5cd9a2fa4 hostid : 4297c540000daf4a4*****Hasil yang diharapkan menunjukkan bahwa NVMe Reservation berhasil dibuat.
Reservation dapat memblokir operasi I/O tulis dari node abnormal
Login ke node tempat Pod lease-test-0 berada dan jalankan perintah berikut untuk menjeda proses guna mensimulasikan skenario kegagalan:
pkill -STOP -f /usr/local/bin/leaseTunggu selama 30 detik lalu jalankan perintah berikut untuk melihat log lagi:
kubectl logs -l app=lease-test --prefix -fHasil yang diharapkan:
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease [pod/lease-test-1/lease] Remote is dead, preempting [pod/lease-test-1/lease] Register as key 4745d0c5cd9a2fa4 [pod/lease-test-1/lease] Refreshed lease [pod/lease-test-1/lease] Refreshed lease [pod/lease-test-1/lease] Refreshed leaseHasil yang diharapkan menunjukkan bahwa Pod lease-test-1 telah mengambil alih dan memegang lease sebagai node utama layanan.
Login kembali ke node tempat Pod lease-test-0 berada dan jalankan perintah berikut untuk melanjutkan proses yang dijeda:
pkill -CONT -f /usr/local/bin/leaseJalankan perintah berikut untuk melihat log lagi:
kubectl logs -l app=lease-test --prefix -fHasil yang diharapkan:
[pod/lease-test-0/lease] failed to write lease: Invalid exchangeHasil yang diharapkan menunjukkan bahwa Pod lease-test-0 tidak dapat lagi menulis ke disk cloud, dan kontainer lease secara otomatis dimulai ulang. Hal ini menunjukkan bahwa operasi I/O tulis telah berhasil diblokir oleh Reservation.
Referensi
Jika disk cloud NVMe Anda tidak memiliki ruang yang cukup atau penuh, lihat Memperluas volume disk cloud.