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:

Volume ini dapat dipasang dalam mode read-only.

Bagaimana itu bekerja

Volume Singkat Tujuan Umum

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 API CSIStorageCapacity, 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:

$ kubectl get 
        -o go-template='{{range .items}}{{if eq .storageClassName "pmem-csi-sc-late-binding"}}{{.metadata.name}} {{.nodeTopology.matchLabels}} {{.capacity}}
{{end}}{{end}}' 
        csistoragecapacities
csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 30716Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

Sebuah objek tunggal memiliki konten berikut:

$ kubectl describe csistoragecapacities/csisc-6cw8j
Name:         csisc-sqdnt
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  storage.k8s.io/v1alpha1
Capacity:     30716Mi
Kind:         CSIStorageCapacity
Metadata:
  Creation Timestamp:  2020-08-11T15:41:03Z
  Generate Name:       csisc-
  Managed Fields:
    ...
  Owner References:
    API Version:     apps/v1
    Controller:      true
    Kind:            StatefulSet
    Name:            pmem-csi-controller
    UID:             590237f9-1eb4-4208-b37b-5f7eab4597d1
  Resource Version:  2994
  Self Link:         /apis/storage.k8s.io/v1alpha1/namespaces/default/csistoragecapacities/csisc-sqdnt
  UID:               da36215b-3b9d-404a-a4c7-3f1c3502ab13
Node Topology:
  Match Labels:
    pmem-csi.intel.com/node:  pmem-csi-pmem-govm-worker1
Storage Class Name:           pmem-csi-sc-late-binding
Events:                       <none>

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

Pemilik PVC - di bawah:

$ kubectl get -o yaml pvc/my-csi-app-inline-volume-my-csi-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: pmem-csi.intel.com
    volume.kubernetes.io/selected-node: pmem-csi-pmem-govm-worker1
  creationTimestamp: "2020-08-11T15:44:57Z"
  finalizers:
  - kubernetes.io/pvc-protection
  managedFields:
    ...
  name: my-csi-app-inline-volume-my-csi-volume
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: Pod
    name: my-csi-app-inline-volume
    uid: 75c925bf-ca8e-441a-ac67-f190b7a2265f
...

Diharapkan informasi terupdate untuk pmem-csi-pmem-govm-worker1:

csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 26620Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

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:

Sumber: www.habr.com

Tambah komentar