ProHoster > blog > administrasi > Volume Singkat dengan Pelacakan Kapasitas Penyimpanan: BlankDir pada Steroid
Volume Singkat dengan Pelacakan Kapasitas Penyimpanan: BlankDir pada Steroid
Beberapa aplikasi juga perlu menyimpan data, tetapi mereka cukup nyaman dengan kenyataan bahwa data tidak akan disimpan setelah restart.
Misalnya, layanan caching dibatasi oleh RAM, namun juga dapat memindahkan data yang jarang digunakan ke penyimpanan yang lebih lambat dibandingkan RAM, dengan dampak yang kecil terhadap kinerja secara keseluruhan. Aplikasi lain perlu menyadari bahwa mungkin ada beberapa input read-only di file, seperti pengaturan atau kunci rahasia.
Kubernetes sudah memiliki beberapa tipe volume sementara, namun fungsinya terbatas pada apa yang diterapkan di K8.
Tdk kekal volume CSI mengizinkan Kubernetes untuk diperluas dengan driver CSI untuk memberikan dukungan pada volume lokal yang ringan. Dengan cara ini dimungkinkan untuk digunakan struktur sewenang-wenang: pengaturan, rahasia, data identifikasi, variabel, dan sebagainya. Driver CSI harus dimodifikasi untuk mendukung fitur Kubernetes ini, karena diasumsikan bahwa driver standar biasa tidak akan berfungsi - namun diasumsikan bahwa volume tersebut dapat digunakan pada node mana pun yang dipilih untuk pod.
Ini mungkin menjadi masalah untuk volume yang menggunakan sumber daya host dalam jumlah besar atau untuk penyimpanan yang hanya tersedia di beberapa host. Itu sebabnya Kubernetes 1.19 memperkenalkan dua fitur volume pengujian alfa baru yang secara konseptual mirip dengan volume BlankDir:
volume sementara untuk tujuan umum;
Pelacakan kapasitas penyimpanan CSI.
Keuntungan dari pendekatan baru:
penyimpanan bisa bersifat lokal atau terhubung melalui jaringan;
volume dapat memiliki ukuran tertentu yang tidak dapat dilampaui oleh aplikasi;
bekerja dengan driver CSI mana pun yang mendukung penyediaan volume persisten dan (untuk mendukung pelacakan kapasitas) mengimplementasikan panggilan tersebut GetCapacity;
volume mungkin memiliki beberapa data awal tergantung pada driver dan pengaturan;
semua operasi standar dengan volume (membuat snapshot, mengubah ukuran, dll.) didukung;
volume dapat digunakan dengan pengontrol aplikasi apa pun yang menerima spesifikasi modul atau volume;
Penjadwal Kubernetes memilih sendiri node yang sesuai, sehingga tidak perlu lagi menyediakan dan mengonfigurasi ekstensi penjadwal atau memodifikasi webhook.
Opsi aplikasi
Oleh karena itu, volume sementara tujuan umum cocok untuk kasus penggunaan berikut:
Memori persisten sebagai pengganti RAM untuk memcached
Rilis terbaru dari memcached dukungan tambahan menggunakan memori persisten (Intel Optane, dll., kira-kira Penerjemah) bukannya RAM biasa. Saat menyebarkan memcached melalui pengontrol aplikasi, Anda dapat menggunakan volume sementara tujuan umum untuk meminta agar volume dengan ukuran tertentu dialokasikan dari PMEM menggunakan driver CSI, misalnya PMEM-CSI.
Penyimpanan lokal LVM sebagai ruang kerja
Aplikasi yang bekerja dengan data yang lebih besar dari RAM mungkin memerlukan penyimpanan lokal dengan ukuran atau metrik kinerja yang tidak dapat disediakan oleh volume KosongDir biasa dari Kubernetes. Misalnya, untuk tujuan ini telah ditulis TopoLVM.
Akses hanya baca untuk volume data
Alokasi volume dapat mengakibatkan terciptanya volume penuh ketika:
Fitur utama volume sementara tujuan umum adalah sumber volume baru, EphemeralVolumeSource, berisi semua bidang untuk membuat permintaan volume (secara historis disebut permintaan volume persisten, PVC). Pengontrol baru masuk kube-controller-manager melihat pod yang membuat sumber volume tersebut, lalu membuat PVC untuk pod tersebut. Untuk driver CSI, permintaan ini terlihat sama dengan yang lain, jadi tidak diperlukan dukungan khusus di sini.
Selama PVC tersebut ada, mereka dapat digunakan seperti permintaan volume lainnya. Secara khusus, mereka dapat direferensikan sebagai sumber data saat menyalin volume atau membuat snapshot dari suatu volume. Objek PVC juga berisi keadaan volume saat ini.
Nama PVC yang dibuat secara otomatis sudah ditentukan sebelumnya: merupakan kombinasi nama pod dan nama volume, dipisahkan dengan tanda hubung. Nama yang telah ditentukan memudahkan interaksi dengan PVC karena Anda tidak perlu mencarinya jika mengetahui nama pod dan nama volume. Kelemahannya adalah nama tersebut mungkin sudah digunakan, yang terdeteksi oleh Kubernetes dan akibatnya pod diblokir untuk memulai.
Untuk memastikan bahwa volume dihapus bersama dengan pod, pengontrol membuat permintaan ke volume di bawah pemiliknya. Saat pod dihapus, mekanisme pengumpulan sampah standar akan berfungsi, yang menghapus permintaan dan volume.
Permintaan dicocokkan oleh driver penyimpanan melalui mekanisme normal kelas penyimpanan. Meskipun kelas dengan pengikatan langsung dan lambat (alias WaitForFirstConsumer) didukung, untuk volume sementara masuk akal untuk digunakan WaitForFirstConsumer, maka penjadwal dapat mempertimbangkan penggunaan node dan ketersediaan penyimpanan saat memilih node. Sebuah fitur baru muncul di sini.
Pelacakan Kapasitas Penyimpanan
Biasanya penjadwal tidak mengetahui di mana driver CSI akan membuat volume. Penjadwal juga tidak dapat menghubungi pengemudi secara langsung untuk meminta informasi ini. Oleh karena itu, penjadwal melakukan polling pada node hingga menemukan node yang volumenya dapat diakses (pengikatan terlambat) atau menyerahkan pilihan lokasi sepenuhnya kepada driver (pengikatan langsung).
Baru APICSIStorageCapacity, yang berada dalam tahap alfa, memungkinkan data yang diperlukan disimpan di etcd sehingga tersedia untuk penjadwal. Tidak seperti dukungan untuk volume sementara tujuan umum, saat Anda menerapkan driver, Anda harus mengaktifkan pelacakan kapasitas penyimpanan: external-provisioner harus mempublikasikan informasi kapasitas yang diterima dari pengemudi melalui normal GetCapacity.
Jika penjadwal perlu memilih node untuk pod dengan volume tidak terikat yang menggunakan pengikatan akhir, dan driver mengaktifkan fitur ini selama penerapan dengan menyetel tandanya CSIDriver.storageCapacity, maka node yang tidak memiliki kapasitas penyimpanan yang cukup akan dibuang secara otomatis. Ini berfungsi untuk volume sementara dan volume persisten tujuan umum, tetapi tidak untuk volume sementara CSI karena parameternya tidak dapat dibaca oleh Kubernetes.
Seperti biasa, volume yang langsung ditautkan dibuat sebelum pod dijadwalkan, dan penempatannya dipilih oleh driver penyimpanan, jadi saat mengonfigurasi external-provisioner Secara default, kelas penyimpanan dengan pengikatan langsung dilewati karena data ini tidak akan digunakan lagi.
Karena penjadwal kubernetes dipaksa untuk bekerja dengan informasi yang berpotensi kadaluarsa, tidak ada jaminan bahwa kapasitas akan tersedia setiap kali volume dibuat, namun kemungkinan volume dibuat tanpa percobaan ulang tetap meningkat.
NB Anda bisa mendapatkan informasi lebih rinci, serta βberlatih di tempat kucingβ dengan aman, dan jika terjadi situasi yang benar-benar tidak dapat dipahami, dapatkan bantuan dukungan teknis yang memenuhi syarat di kursus intensif - Basis Kubernetes akan diadakan pada tanggal 28-30 September, dan untuk spesialis yang lebih mahir Kubernet Mega 14-16 Oktober.
keamanan
Kapasitas Penyimpanan CSIS
Objek CSIStorageCapacity berada di namespace; saat meluncurkan setiap driver CSI di namespace masing-masing, disarankan untuk membatasi hak RBAC ke CSIStorageCapacity di ruang tersebut karena jelas dari mana data berasal. Kubernetes tidak memeriksa hal ini, dan biasanya driver ditempatkan di namespace yang sama, jadi pada akhirnya driver diharapkan berfungsi dan tidak mempublikasikan data yang salah (dan di sinilah kartu saya gagal, kira-kira. penerjemah berdasarkan lelucon berjanggut)
Volume Singkat Tujuan Umum
Jika pengguna memiliki hak untuk membuat sebuah pod (secara langsung atau tidak langsung), mereka juga akan dapat membuat volume sementara untuk tujuan umum meskipun mereka tidak memiliki hak untuk membuat permintaan pada volume tersebut. Hal ini karena pemeriksaan izin RBAC diterapkan pada pengontrol yang membuat PVC, bukan pada pengguna. Ini adalah perubahan utama yang perlu ditambahkan ke akun Anda, sebelum mengaktifkan fitur ini pada klaster di mana pengguna yang tidak dipercaya tidak memiliki hak untuk membuat volume.
Contoh
Memisahkan ranting PMEM-CSI berisi semua perubahan yang diperlukan untuk menjalankan cluster Kubernetes 1.19 di dalam mesin virtual QEMU dengan semua fitur dalam tahap alfa. Kode driver tidak berubah, hanya penerapannya saja yang berubah.
Pada mesin yang sesuai (Linux, pengguna biasa dapat menggunakannya Buruh pelabuhan, melihat di sini detailnya) perintah ini akan memunculkan cluster dan menginstal driver PMEM-CSI:
git clone --branch=kubernetes-1-19-blog-post https://github.com/intel/pmem-csi.git
cd pmem-csi
export TEST_KUBERNETES_VERSION=1.19 TEST_FEATURE_GATES=CSIStorageCapacity=true,GenericEphemeralVolume=true TEST_PMEM_REGISTRY=intel
make start && echo && test/setup-deployment.sh
Setelah semuanya berfungsi, output akan berisi petunjuk penggunaan:
The test cluster is ready. Log in with [...]/pmem-csi/_work/pmem-govm/ssh.0, run
kubectl once logged in. Alternatively, use kubectl directly with the
following env variable:
KUBECONFIG=[...]/pmem-csi/_work/pmem-govm/kube.config
secret/pmem-csi-registry-secrets created
secret/pmem-csi-node-secrets created
serviceaccount/pmem-csi-controller created
...
To try out the pmem-csi driver ephemeral volumes:
cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
[...]/pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -
Objek CSIStorageCapacity tidak dimaksudkan untuk dibaca oleh manusia, sehingga diperlukan beberapa pemrosesan. Filter template Golang akan menampilkan kelas penyimpanan, contoh ini akan menampilkan nama, topologi, dan kapasitas:
Mari kita coba membuat aplikasi demo dengan volume fana tujuan umum tunggal. Isi berkas pmem-app-ephemeral.yaml:
# This example Pod definition demonstrates
# how to use generic ephemeral inline volumes
# with a PMEM-CSI storage class.
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app-inline-volume
spec:
containers:
- name: my-frontend
image: intel/pmem-csi-driver-test:v0.7.14
command: [ "sleep", "100000" ]
volumeMounts:
- mountPath: "/data"
name: my-csi-volume
volumes:
- name: my-csi-volume
ephemeral:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
storageClassName: pmem-csi-sc-late-binding
Setelah dibuat, seperti yang ditunjukkan pada petunjuk di atas, sekarang kita memiliki pod dan PVC tambahan:
$ kubectl get pods/my-csi-app-inline-volume -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-csi-app-inline-volume 1/1 Running 0 6m58s 10.36.0.2 pmem-csi-pmem-govm-worker1 <none> <none>
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-csi-app-inline-volume-my-csi-volume Bound pvc-c11eb7ab-a4fa-46fe-b515-b366be908823 4Gi RWO pmem-csi-sc-late-binding 9m21s
Jika aplikasi lain membutuhkan lebih dari 26620Mi, penjadwal tidak akan memperhitungkannya pmem-csi-pmem-govm-worker1 dalam hal apapun.
Apa selanjutnya?
Kedua fitur tersebut masih dalam pengembangan. Beberapa aplikasi dibuka selama pengujian alfa. Tautan proposal perbaikan mendokumentasikan pekerjaan yang perlu dilakukan untuk berpindah ke tahap beta, serta alternatif mana yang telah dipertimbangkan dan ditolak: