Memperkenalkan Versi Alpha dari Snapshots Volume di Kubernetes



Catatan perev. : Artikel asli baru-baru ini diterbitkan di blog Kubernetes dan ditulis oleh karyawan Google dan Huawei (Jing Xu, Xing Yang, Saad Ali), yang aktivitasnya sudah pasti Anda lihat di GitHub proyek, jika Anda pernah tertarik dengan fitur dan masalah K8 yang terkait dengan dengan penyimpanan data. Insinyur berbicara tentang tujuan snapshot volume, kemampuan mereka saat ini dan dasar-dasar bekerja dengan mereka.

Kubernetes v1.12 memperkenalkan versi alfa dukungan untuk snapshot untuk volume. Fitur ini memungkinkan Anda untuk membuat dan menghapus snapshot volume, serta membuat volume baru dari snapshot menggunakan sarana "asli" dari sistem - melalui API Kubernetes.

Apa itu snapshot?


Banyak sistem penyimpanan (seperti Google Cloud Persistent Disk, Amazon Elastic Block Storage, dan banyak sistem penyimpanan di lokasi) menawarkan kemampuan untuk membuat snapshot ("snapshot") untuk volume persisten. Cuplikan adalah salinan volume pada titik waktu tertentu. Ini dapat digunakan untuk memberikan volume baru (sudah diisi dengan data dari snapshot) atau mengembalikan volume yang ada ke keadaan sebelumnya (yang disajikan dalam snapshot).

Mengapa menambahkan snapshot ke Kubernetes?


Sebuah abstraksi yang kuat sudah tersedia di sistem plug-in volume Kubernetes, mengotomatisasi penyediaan, menghubungkan dan memasang blok dan penyimpanan file.

Menyediakan semua kemampuan ini adalah bagian dari tujuan toleransi beban kerja Kubernetes: Kubernetes bertujuan untuk membuat tingkat abstraksi antara aplikasi yang bekerja sebagai sistem terdistribusi dan kluster yang mendasarinya sehingga aplikasi independen dari kluster spesifik yang mereka jalankan, dan penerapan aplikasi tidak memerlukan pengetahuan khusus klaster.

Kubernetes Storage SIG telah mengidentifikasi operasi snapshot sebagai kemampuan penting untuk berbagai beban kerja stateful. Misalnya, administrator basis data mungkin ingin memotret basis datanya sebelum melakukan operasi apa pun di dalamnya.

Dengan mendapatkan API Kubernetes cara standar untuk menjalankan operasi snapshot, pengguna Kubernetes dapat bekerja dengannya tanpa perlu penyelesaian masalah (dan doa manual operasi khusus untuk sistem penyimpanan). Sebagai gantinya, pengguna diberi kesempatan untuk menanamkan operasi snapshot dalam alat dan kebijakan mereka dengan pemahaman yang tenang bahwa semuanya akan bekerja dengan kluster Kubernetes apa pun, terlepas dari penyimpanan yang mendasarinya.

Selain itu, primitif Kubernetes ini berfungsi sebagai blok bangunan dasar, membuka jalan bagi pengembangan fitur tingkat perusahaan yang lebih maju untuk manajemen penyimpanan - misalnya, untuk perlindungan, replikasi, dan migrasi data.

Apa plugin volume yang mendukung snapshot di Kubernetes?


Kubernetes mendukung tiga jenis plugin volume: in-tree, Flex, dan CSI. Lihat FAQ Plugin Volume Kubernetes untuk detailnya.

Snapshots hanya didukung untuk driver CSI (mereka tidak didukung untuk in-tree atau Flex). Untuk memanfaatkan fitur ini, pastikan bahwa driver CSI yang mengimplementasikan dukungan snapshot dikerahkan di cluster Kubernetes.

Pada saat posting blog ini (9 Oktober 2018 - sekitar Terjemahan ) , Snapshots didukung oleh driver CSI berikut:


Dukungan untuk snapshot untuk driver lain sedang dalam pengembangan dan akan segera tersedia. Rincian lebih lanjut tentang CSI dan cara menggunakan driver CSI dijelaskan dalam publikasi " Container Storage Interface (CSI) untuk Kubernetes Goes Beta " (dan juga lihat terjemahan kami dari catatan " Memahami Antarmuka Penyimpanan Kontainer (dalam Kubernetes dan banyak lagi) " - sekitar Terjemahan. )

API Kubernetes untuk snapshot


Untuk mengelola snapshot, Volume Snapshots Kubernetes memperkenalkan tiga objek API baru dengan cara yang sama seperti di Kubernetes Persistent Volumes API:

  • VolumeSnapshot
    • Dibuat oleh pengguna Kubernetes untuk meminta snapshot untuk volume yang ditentukan. Berisi informasi tentang operasi snapshot, seperti cap waktu untuk menghapus snapshot dan apakah siap untuk digunakan.
    • Seperti objek PersistentVolumeClaim , membuat dan menghapus objek ini mewakili keinginan pengguna untuk membuat atau menghapus sumber daya klaster (snapshot).
  • VolumeSnapshotContent
    • Dibuat oleh driver CSI ketika snapshot berhasil dibuat. Berisi informasi tentang foto itu termasuk ID-nya.
    • Seperti objek PersistentVolume , itu mewakili sumber daya yang sudah dilayani oleh cluster (snapshot).
    • Seperti objek PersistentVolumeClaim dan PersistentVolume , saat snapshot dibuat, objek VolumeSnapshotContent dilampirkan ke VolumeSnapshot yang dibuatnya (pemetaan satu-ke-satu digunakan).
  • VolumeSnapshotClass
    • Didefinisikan oleh administrator cluster untuk menjelaskan snapshot mana yang dapat dibuat. Termasuk informasi pengemudi, rahasia untuk mengakses foto, dll.

Penting untuk dicatat bahwa - tidak seperti objek Volume Persisten utama di Kubernetes - objek snap shot ini didefinisikan sebagai CustomResourceDefinitions (CRDs) . Proyek Kubernetes secara bertahap bergerak menjauh dari tipe sumber daya yang telah ditentukan sebelumnya di Server API, mendekati model di mana Server API tidak tergantung pada objek API. Pendekatan ini memungkinkan Anda untuk menggunakan kembali server API di proyek lain (selain Kubernetes), dan konsumen (seperti Kubernetes) dapat menetapkan jenis sumber daya yang mereka butuhkan sebagai CRD.

Driver CSI yang mendukung snapshot akan secara otomatis menginstal CRD yang diperlukan. Pengguna akhir Kubernetes hanya perlu memverifikasi bahwa driver CSI yang mendukung snapshot dikerahkan di cluster.

Selain objek-objek baru ini, PersistentVolumeClaim ada PersistentVolumeClaim bidang DataSource baru:

 type PersistentVolumeClaimSpec struct { AccessModes []PersistentVolumeAccessMode Selector *metav1.LabelSelector Resources ResourceRequirements VolumeName string StorageClassName *string VolumeMode *PersistentVolumeMode DataSource *TypedLocalObjectReference } 

Bidang ini (dalam status versi alfa) memungkinkan Anda untuk mengisinya secara otomatis dengan data dari snapshot yang ada saat membuat volume baru.

Persyaratan Snapshot Kubernetes


Sebelum menggunakan snapshot volume di Kubernetes, Anda harus:

  • pastikan bahwa driver CSI yang mengimplementasikan snapshots dikerahkan dan berjalan di cluster;
  • aktifkan fungsi Volume Snapshotting Kubernetes melalui gerbang fitur baru (dinonaktifkan secara default untuk versi alpha):
    • atur tanda berikut untuk --feature-gates=VolumeSnapshotDataSource=true API Server: --feature-gates=VolumeSnapshotDataSource=true

Sebelum membuat snapshot, Anda juga harus menentukan driver CSI mana yang akan digunakan, yang dilakukan dengan membuat objek VolumeSnapshotClass dan menentukan driver CSI di bidang snapshotter . Pada contoh VolumeSnapshotClass bawah ini, driver ini adalah driver com.example.csi-driver . Setiap penyedia snapshot membutuhkan setidaknya satu objek VolumeSnapshotClass . Dimungkinkan juga untuk menentukan VolumeSnapshotClass default untuk setiap driver CSI - ini dilakukan dengan mengatur snapshot.storage.kubernetes.io/is-default-class: "true" anotasi snapshot.storage.kubernetes.io/is-default-class: "true" dalam definisi kelas:

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: default-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" snapshotter: com.example.csi-driver apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: csi-snapclass snapshotter: com.example.csi-driver parameters: fakeSnapshotOption: foo csiSnapshotterSecretName: csi-secret csiSnapshotterSecretNamespace: csi-namespace 

Semua parameter yang diperlukan harus ditetapkan sesuai dengan dokumentasi driver CSI. Pada contoh di atas, parameter fakeSnapshotOption: foo dan semua rahasia yang disebutkan akan diteruskan ke driver CSI selama pembuatan dan penghapusan snapshot. CSI external-snapshotter secara default menyimpan kunci parameter csiSnapshotterSecretNamespace dan csiSnapshotterSecretNamespace .

Terakhir, sebelum membuat snapshot, Anda harus membuat volume melalui driver CSI dan mengisinya dengan data yang ingin Anda lihat di sana (lihat publikasi ini untuk detail tentang cara menggunakan volume CSI).

Membuat snapshot baru di Kubernetes


Setelah objek VolumeSnapshotClass ditentukan dan merupakan volume yang ingin Anda hapus snapshot, Anda dapat melakukan operasi ini dengan membuat objek VolumeSnapshot .

Sumber untuk snapshot ditentukan oleh dua parameter:

  • kind - PersistentVolumeClaim ditunjukkan di sini;
  • name - name sebenarnya dari objek PVC.

Dipahami bahwa namespace volume tempat snapshot dibuat ditentukan oleh namespace objek VolumeSnapshot .

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: name: new-snapshot-demo namespace: demo-namespace spec: snapshotClassName: csi-snapclass source: name: mypvc kind: PersistentVolumeClaim 

Spesifikasi VolumeSnapshot dapat VolumeSnapshot VolumeSnapshotClass yang berisi informasi tentang driver CSI mana yang akan digunakan untuk membuat snapshot. Seperti dilaporkan sebelumnya, setelah membuat objek VolumeSnapshot fakeSnapshotOption: foo parameter fakeSnapshotOption: foo dan semua rahasia VolumeSnapshotClass disebutkan dilewatkan ke plugin CSI com.example.csi-driver di panggilan CreateSnapshot .

Menanggapi permintaan tersebut, pengandar CSI mengambil snapshot volume dan kemudian secara otomatis membuat objek VolumeSnapshotContent yang mewakili snapshot baru dan mengikat objek ini ke VolumeSnapshot , membuatnya siap digunakan. Jika driver CSI tidak dapat membuat snapshot dan mengembalikan kesalahan, kontroler snapshot melaporkan kesalahan ini dalam status objek VolumeSnapshot dan tidak melakukan upaya baru (perilaku ini berbeda dari pengontrol lain di Kubernetes - ini diterapkan agar tidak membuat snapshot pada waktu yang tidak terduga) .

Jika kelas snapshot tidak ditentukan, snapshot eksternal akan mencoba menemukan kelas default dan menggunakannya untuk snapshot yang dibuat. Dalam kasus ini, driver CSI yang ditunjuk oleh snapshotter di kelas default harus sesuai dengan driver CSI yang ditunjukkan oleh provisioner di kelas penyimpanan PVC.

Harap dicatat bahwa rilis alpha snapshots untuk Kubernetes tidak memberikan jaminan konsistensi. Untuk memastikan data lengkap dalam sebuah snapshot, perlu mempersiapkan aplikasi dengan benar (menghentikan aplikasi, membekukan sistem file, dll.) Sebelum menghapusnya.

Untuk VolumeSnapshot bahwa objek VolumeSnapshot dibuat dan dikaitkan dengan VolumeSnapshotContent , Anda dapat menggunakan kubectl describe volumesnapshot :

  • Ready harus true dalam Status , yang akan menunjukkan bahwa snapshot volume siap digunakan.
  • Bidang Creation Time menunjukkan kapan snapshot benar-benar diambil.
  • Bidang Restore Size adalah ukuran volume minimum untuk memulihkan foto.
  • Bidang Snapshot Content Name dalam spesifikasi menunjuk ke objek VolumeSnapshotContent dibuat untuk snapshot ini.

Impor snapshot yang ada ke Kubernetes


Snapshot yang ada dapat diimpor ke Kubernetes dengan secara manual membuat objek VolumeSnapshotContent yang akan mewakili snapshot ini. Karena VolumeSnapshotContent adalah objek API yang tidak terikat ke namespace, hanya administrator sistem yang memiliki hak untuk membuatnya.

Ketika objek VolumeSnapshotContent dibuat, pengguna dapat membuat objek lain - VolumeSnapshot - yang akan menunjuk ke sana. Pengontrol snapshot eksternal akan menandai snapshot sebagai siap setelah memeriksa keberadaan dan koneksi yang benar antara objek VolumeSnapshot dan VolumeSnapshotContent . Sebuah snapshot siap digunakan di Kubernetes ketika koneksi ini dibuat.

Objek VolumeSnapshotContent harus dibuat dengan bidang-bidang berikut yang mewakili snapshot yang sudah disediakan sebelumnya :

  • csiVolumeSnapshotSource - informasi yang mengidentifikasi snapshot:
    • snapshotHandle - nama / pengidentifikasi untuk snapshot. Bidang wajib;
    • driver - driver CSI yang digunakan untuk bekerja dengan volume ini. Bidang wajib. Harus cocok dengan nama snapshotter di controller (snapshot controller);
    • creationTime dan restoreSize - Untuk volume yang telah ditentukan sebelumnya, bidang ini opsional. Pengontrol snapshot eksternal akan secara otomatis memperbaruinya setelah membuat snapshot.
  • volumeSnapshotRef - penunjuk ke objek VolumeSnapshot objek ini (mis. VolumeSnapshotContent ) harus dilampirkan:
    • name and namespace - nama dan namespace dari objek VolumeSnapshot yang isinya terikat;
    • UID - bidang opsional (untuk volume yang disiapkan sebelumnya). Pengendali snapshot eksternal akan secara otomatis memperbarui bidang ini setelah mengikat. Jika pengguna menentukan bidang ini, Anda harus memastikan bahwa itu cocok dengan UID dari snapshot yang mengikat terjadi. Jika tidak ada korespondensi seperti itu, konten dianggap tidak relevan (objek yatim) dan karenanya controller akan menghapusnya dan snapshot terkait.
  • snapshotClassName adalah bidang opsional. Pengontrol snapshot eksternal akan secara otomatis memperbaruinya setelah mengikat.

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotContent metadata: name: static-snapshot-content spec: csiVolumeSnapshotSource: driver: com.example.csi-driver snapshotHandle: snapshotcontent-example-id volumeSnapshotRef: kind: VolumeSnapshot name: static-snapshot-demo namespace: demo-namespace 

Objek VolumeSnapshot harus dibuat agar pengguna dapat bekerja dengan snapshot. Di dalamnya:

  • snapshotClassName - nama kelas snapshot volume. Bidang opsional. Jika diatur, bidang snapshotter di kelas snapshot harus cocok dengan nama pengontrol snapshot. Jika tidak disetel, pengontrol akan mencari kelas snapshot default;
  • snapshotContentName - nama isi volume foto. Bidang wajib untuk volume yang disiapkan sebelumnya.

 apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: name: static-snapshot-demo namespace: demo-namespace spec: snapshotClassName: csi-snapclass snapshotContentName: static-snapshot-content 

Ketika objek-objek ini dibuat, pengontrol snapshot akan mengikatnya, setel bidang Ready (dalam Status ) ke True , yang menunjukkan bahwa snapshot siap digunakan.

Mempersiapkan volume baru dari snapshot di Kubernetes


Untuk membuat volume baru yang diisi sebelumnya dengan data dari objek snapshot, gunakan bidang dataSource baru di PersistentVolumeClaim . Ini memiliki tiga parameter:

  • name - nama objek VolumeSnapshot mewakili sumber snapshot;
  • kind - harus ditetapkan sebagai VolumeSnapshot ;
  • apiGroup - harus berupa snapshot.storage.k8s.io .

Diasumsikan bahwa namespace dari sumber - VolumeSnapshot - cocok dengan namespace dari PersistentVolumeClaim .

 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore Namespace: demo-namespace spec: storageClassName: csi-storageclass dataSource: name: new-snapshot-demo kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 1Gi 

Ketika objek PersistentVolumeClaim dibuat, ia akan memanggil penyediaan volume baru, pra-diisi dengan data dari snapshot yang ditentukan.

Bagaimana cara menambahkan dukungan snapshot ke driver CSI saya jika saya seorang pengembang penyimpanan?


Untuk memberikan dukungan untuk snapshot, kapabilitas pengontrol tambahan harus ditambahkan ke driver CSI: CREATE_DELETE_SNAPSHOT dan LIST_SNAPSHOTS , serta pengontrol RPC tambahan: CreateSnapshot , DeleteSnapshot , ListSnapshots . Lihat spesifikasi CSI untuk detailnya.

Meskipun Kubernetes memberikan pedoman paling dasar untuk pengemasan dan penggunaan Pengandar Volume CSI, ada mekanisme yang disarankan untuk menggunakan pengandar CSI yang dipaketkan secara sewenang-wenang di Kubernetes untuk menyederhanakan proses ini.

Sebagai bagian dari proses penyebaran yang disarankan, tim Kubernetes menyarankan untuk menggunakan beragam wadah sespan (yaitu, tambahan), termasuk wadah sespan dengan snapshot eksternal .

External-snapshotter yang disebutkan memonitor objek VolumeSnapshot dan VolumeSnapshotContent di Server API, menggunakan operasi CreateSnapshot dan DeleteSnapshot untuk titik akhir CSI. Wadah sespan dengan penyedia eksternal CSI juga telah diperbarui untuk mendukung pemulihan volume dari snapshot menggunakan bidang PVC dataSource baru.

Untuk mendukung kemampuan snapshot, produsen penyimpanan disarankan untuk menggunakan wadah sespan dengan snapshot eksternal sebagai tambahan dari penyedia eksternal, dan menempatkan driver CSI di StatefulSet , seperti yang ditunjukkan pada diagram di bawah ini:



Dalam contoh Penerapan ini, ada dua wadah sespan, penyedia eksternal dan snapshot eksternal, dan driver CSI dikerahkan dengan plugin hostpath CSI dalam pod StatefulSet. Hostpath CSI adalah plugin contoh yang tidak dimaksudkan untuk digunakan dalam produksi.

Apa batasan dari versi alpha?


Versi alpha dari implementasi snapshot di Kubernetes memiliki batasan berikut:

  • Kembalikan dari volume yang ada ke keadaan sebelumnya yang diwakili oleh foto tidak didukung (hanya penyediaan volume baru dari foto yang didukung).
  • Pemulihan di tempat tidak didukung untuk PersistentVolumeClaim dari snapshot: i.e. penyediaan volume baru dari karya snapshot, tetapi tidak memperbarui PersistentVolumeClaim ada sehingga mengarah ke volume baru dan PVC kembali ke keadaan sebelumnya (hanya menggunakan volume baru yang dibuat dari snapshot melalui PV / PVC baru didukung).
  • Jaminan untuk konsistensi snapshot tidak melampaui jaminan yang diberikan oleh sistem penyimpanan (misalnya, integritas saat dijatuhkan).

Apa selanjutnya


Tim Kubernetes berencana untuk membawa implementasi snapshots untuk CSI ke versi beta dalam rilis 1.13 atau 1.14, tergantung pada umpan balik yang diterima dan adaptasi dari teknologi.

Bagaimana cara mengetahui lebih lanjut?


Lihat dokumentasi snapshot tambahan di k8s.io/docs/concepts/storage/volume-snapshots dan kubernetes-csi.imtqy.com/docs .

PS dari penerjemah


Baca juga di blog kami:

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


All Articles