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: