StorageClass

Dokumen ini mendeskripsikan konsep StorageClass yang ada pada Kubernetes. Sebelum lanjut membaca, sangat dianjurkan untuk memiliki pengetahuan terhadap volumes dan peristent volume terlebih dahulu.

Pengenalan

Sebuah StorageClass menyediakan cara bagi administrator untuk mendeskripsikan "kelas" dari penyimpanan yang mereka sediakan. Kelas yang berbeda bisa saja memiliki perbedaan dari segi kualitas servis yang disediakan, pemulihan (backup) kebijakan, atau kebijakan lain yang ditentukan oleh administrator klaster. Kubernetes sendiri tidak dipengaruhi oleh kelas apakah yang digunakan pada mekanisme penyimpanan yang digunakan. Mekanisme ini seringkali disebut sebagai "profiles" pada sistem penyimpanan yang lain.

Sumber daya StorageClass

Setiap StorageClass (kelas penyimpanan) memiliki field-field mendasar seperti provisioner, parameters, dan reclaimPolicy, yang digunakan ketika PersistentVolume yang dimiliki oleh kelas tersebut perlu disediakan (di-provision).

Nama yang digunakan oleh suatu StorageClass sifatnya penting, karena ini merupakan cara yang digunakan oleh pengguna untuk meminta penyimpanan dengan kelas tertentu. Administrator dapat menentukan nama dan parameter lain dari suatu kelas ketika membuat suatu objek StorageClass, dan objek yang sudah dibuat tidak dapat diubah lagi definisinya.

Administrator dapat memberikan spesifikasi StorageClass default bagi PVC yang tidak membutuhkan kelas tertentu untuk dapat melakukan mekanisme bind: kamu dapat membaca bagian PersistentVolumeClaim untuk penjelasan lebih lanjut.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
mountOptions:
  - debug
volumeBindingMode: Immediate

Provisioner

Setiap kelas penyimpanan (storage class) memiliki sebuah provisioner yang menentukan plugin manakah yang digunakan ketika sebuah PV disediakan (di-provision). Field ini haruslah didefinisikan.

Plugin Volume Provisioner Internal Contoh Konfigurasi
AWSElasticBlockStore AWS EBS
AzureFile Azure File
AzureDisk Azure Disk
CephFS - -
Cinder OpenStack Cinder
FC - -
Flexvolume - -
Flocker -
GCEPersistentDisk GCE PD
Glusterfs Glusterfs
iSCSI - -
Quobyte Quobyte
NFS - -
RBD Ceph RBD
VsphereVolume vSphere
PortworxVolume Portworx Volume
ScaleIO ScaleIO
StorageOS StorageOS
Local - Local

Kamu tidak dibatasi untuk hanya menggunakan provisioner internal yang disediakan pada list yang tersedia (yang memiliki nama dengan prefix "kubernetes.io" dan didistribusikan bersamaan dengan Kubernetes). Kamu juga dapat menjalankan dan mendefinisikan provisioner eksternal yang merupakan program independen selama program tersebut menerapkan spesifikasi yang didefinisikan oleh Kubernetes. Penulis dari provisioner eksternal Kubernetes memiliki kuasa penuh akan tempat dimana kode sumber yang mereka tulis, bagaimana mekanisme penyediaan (provisioning) dilakukan, serta bagaimana hal tersebut dapat dijalankan, serta plugin volume apakah yang digunakan (termasuk Flex), dkk. Repositori kubernetes-incubator/external-storage menyimpan library yang dibutukan untuk menulis provisioner eksternal yang mengimplementasi spesifikasi serta beberapa provisioner eksternal yang dipelihara oleh komunitas.

Sebagai contoh, NFS tidak menyediakan provisioner internal, tetapi sebuah provisioner eksternal dapat digunakan. Beberapa provisioner eksternal dapat ditemukan di bawah repositori kubernetes-incubator/external-storage. Di sana juga terdapat beberapa kasus dimana vendor penyimpanan 3rd party menyediakan provisioner eksternal yang mereka sediakan sendiri.

Perolehan Kembali untuk Kebijakan (Reclaim Policy)

Persistent Volumes yang secara dinamis dibuat oleh sebuah kelas penyimpanan akan memiliki reclaim policy yang didefinisikan di dalam field reclaimPolicy dari kelas tersebut, yang nilainya dapat diisi dengan Delete atau Retain. Jika tidak terdapat reclaimPolicy yang dispesifikasikan ketika sebuah objek StorageClass dibuat, maka nilai default bagi kelas tersebut adalah Delete.

PersistentVolume yang dibuat secara manual dan diatur dengan menggunakan kelas penyimpanan akan menggunakan reclaim policy apapun yang diberikan pada saat objek tersebut dibuat.

Pilihan Mount

PersistentVolume yang secara dinamis dibuat oleh sebuah kelas penyimpanan akan memiliki pilihan mount yang dapat dispesifikasikan pada field mountOptions dari kelas tersebut.

Jika sebuah plugin volume tidak mendukung pilihan mount yang dispesifikasikan, mekanisme penyediaan (provision) akan digagalkan. Pilihan mount yang akan divalidasi pada kelas penyimpanan maupun PV, maka mount tersebut akan gagal apabila salah satu dari keduanya bersifat invalid.

Mode Volume Binding

Field volumeBindingMode mengontrol kapan mekanisme binding volume dan provisioning dinamis harus dilakukan.

Secara default, ketika mode Immediate yang mengindikasikan terjadinya volume binding dan provisioning dinamis terjadi ketika PersistentVolumeClaim dibuat. Untuk backend penyimpanan yang dibatasi oleh topologi tertentu dan tidak dapat diakses secara global dari semua Node yang ada di klaster, PersistentVolume akan di-bound atau di-provision tanpa perlu memenuhi persyaratan scheduling dari Pod. Hal ini dapat menyebabkan adanya Pod yang tidak mendapatkan mekanisme scheduling.

Seorang administrator klaster dapat mengatasi hal tersebut dengan cara memberikan spesifikasi mode WaitForFirstConsumer yang akan memperlambat mekanisme provisioning dan binding dari sebuah PersistentVolume hingga sebuah Pod yang menggunakan PersistentVolumeClaim dibuat. PersistentVolume akan dipilih atau di-provisioning sesuai dengan topologi yang dispesifikasikan oleh limitasi yang diberikan oleh mekanisme scheduling Pod. Hal ini termasuk, tetapi tidak hanya terbatas pada, persyaratan sumber daya, node selector, afinitas dan anti-afinitas Pod, serta taint dan toleration.

Beberapa plugin di bawah ini mendukung WaitForFirstConsumer dengan provisioning dinamis:

Beberapa plugin di bawah ini mendukung WaitForFirstConsumer dengan binding PersistentVolume yang terlebih dahulu dibuat:

  • Semua hal di atas
  • Lokal

FEATURE STATE: Kubernetes 1.14 [beta]
Volume-volume CSI juga didukung dengan adanya provisioning dinamis serta PV yang telah terlebih dahulu dibuat, meskipun demikian, akan lebih baik apabila kamu melihat dokumentasi untuk driver spesifik CSI untuk melihat topologi key yang didukung beserta contoh penggunaannya. Feature gate CSINodeInfo haruslah diaktifkan.

Topologi yang Diizinkan

Ketika sebuah operator klaster memberikan spesifikasi WaitForFirstConsumer pada mode binding volume, mekanisme pembatasan (restriksi) provisioning tidak lagi dibutuhkan pada sebagian besar kasus. Meskipun begitu, apabila hal tersebut masih dibutuhkan, field allowedTopologies dapat dispesifikasikan.

Contoh ini memberikan demonstrasi bagaimana cara membatasi topologi dari volume yang di-provision pada suatu zona spesifik serta harus digunakan sebagai pengganti parameter zone dam zones untuk plugin yang akan digunakan.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
    values:
    - us-central-1a
    - us-central-1b

Parameter-Parameter

Kelas-kelas penyimpanan memiliki parameter yang mendeskripsikan volume yang dimiliki oleh kelas penyimpanan tersebut. Parameter yang berbeda bisa saja diterima bergantung pada provisioner. Sebagai contohnya, nilai io1, untuk parameter type, dan parameter iopsPerGB spesifik terhadap EBS. Ketika sebuah parameter diabaikan, beberapa nilai default akan digunakan sebagai gantinya.

AWS EBS

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "10"
  fsType: ext4
  • type: io1, gp2, sc1, st1. Lihat dokumentasi AWS untuk detail lebih lanjut. Nilai default: gp2.
  • zone (deprecated): zona AWS. Jika tidak terdapat nilai zone atau zones yang dispesifikasikan, volume secara generik dijadwalkan dengan menggunakan penjadwalan round-robin-ed pada semua zona aktif yang ada pada klaster Kubernetes yang memiliki node.
  • zones (deprecated): Nilai terpisahkan koma yang merupakan barisan zona pada AWS. Jika tidak terdapat nilai zone atau zones yang dispesifikasikan, volume secara generik dijadwalkan dengan menggunakan penjadwalan round-robin-ed pada semua zona aktif yang ada pada klaster Kubernetes yang memiliki node.
  • iopsPerGB: hanya untuk volume io1. Operasi per detik per GiB. Volume plugin AWS mengalikan nilai ini dengan ukuran volume yang dibutuhkan untuk menghitung IOPS dari volume (nilai maksimum yang didukung adalah 20,000 IOPS baca dokumentasi AWS. Nilai masukan yang diharapkan merupakan string, misalnya "10", bukan 10.
  • fsType: fsType yang didukung oleh Kubernetes. Nilai default-nya adalah: "ext4".
  • encrypted: menyatakan dimana volume EBS harus dienkripsi atau tidak. Nilai yang valid adalah "true" atau "false" (dalam string bukan boolean i.e. "true", bukan true).
  • kmsKeyId: opsional. Merupakan nama dari Amazon Resource Name dari key yang digunakan untuk melakukan enkripsi volume. Jika nilai ini tidak disediakan tetapi nilai dari field encrypted adalah true, sebuah key akan dibuat oleh AWS. Perhatikan dokumentasi AWS untuk mengetahui nilai yang valid bagi ARN.

PD GCE

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: none
  • type: pd-standard atau pd-ssd. Nilai default: pd-standard
  • zone (deprecated): zona GCE. Jika tidak terdapat nilai zone atau zones yang dispesifikasikan, volume secara generik dijadwalkan dengan menggunakan penjadwalan round-robin-ed pada semua zona aktif yang ada pada klaster Kubernetes yang memiliki node.
  • zones (deprecated): Nilai terpisahkan koma yang merupakan barisan zona. Jika tidak terdapat nilai zone atau zones yang dispesifikasikan, volume secara generik dijadwalkan dengan menggunakan penjadwalan round-robin-ed pada semua zona aktif yang ada pada klaster Kubernetes yang memiliki node.
  • replication-type: none atau regional-pd. Nilai default: none.

Jika replication-type diubah menjadi none, sebuah PD reguler (zonal) akan di-provisioning.

Jika replication-type diubah menjadi regional-pd, sebuah Persistent Disk Regional (PD Regional) akan di-provisioning. Pada kasus ini, pengguna harus menggunakan zones dan bukan zone untuk menspesifikasikan zona replikasi yang diinginkan. Jika terdapat tepat dua zona yang dispesifikasikan, PD Regional akan di-provisioning pada zona replikasi yang diinginkan. Jika terdapat lebih dari 2 zona yang dispesifikasikan, Kubernetes akan memilih secara acak zona dari zona-zona yang dispesifikasikan. Jika parameter zones tidak diinisialisasi, Kubernetes akan memilih secara acak dari zona yang diatur oleh klaster Kubernetes.

Glusterfs

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://127.0.0.1:8081"
  clusterid: "630372ccdc720a92c681fb928f27b53f"
  restauthenabled: "true"
  restuser: "admin"
  secretNamespace: "default"
  secretName: "heketi-secret"
  gidMin: "40000"
  gidMax: "50000"
  volumetype: "replicate:3"
  • resturl: Servis REST Gluster/URL servis Heketi yang digunakan untuk melakukan provisioning volume gluster sesuai dengan kebutuhan. Format secara umum haruslah dalam bentuk IPaddress:Port dan hal ini merupakan parameter wajib untuk provisioner dinamis GlusterFS. Jika servis Heketi diekspos sebagai servis yang dapat melakukan routing pada pengaturan openshift/kubernetes, ini dapat memiliki format yang sesuai dengan http://heketi-storage-project.cloudapps.mystorage.com dimana fqdn yang ada merupakan URL servis Heketi yang dapat di-resolve.

  • restauthenabled : Servis REST Gluster menyediakan nilai boolean yang dapat digunakan untuk mengajukan authentication untuk server REST yang ada. Jika nilai yang disediakan adalah "true", dengan kondisi dimana restuser dan restuserkey atau secretNamespace + secretName harus diisi. Opsi ini sudah_deprecated_, mekanisme otentikasi akan diizinkan apabila salah satu dari _field_ restuser, restuserkey, secretName atau secretNamespace diterapkan.

  • restuser : Pengguna servis REST Gluster/Heketi yang memiliki akses untuk membuat volume di dalam Trusted Pool Gluster.

  • restuserkey : Password pengguna servis REST Gluster/Heketi yang digunakan untuk mekanisme otentikasi server REST. Parameter ini deprecated dan digantikan dengan parameter secretNamespace + secretName.

  • secretNamespace, secretName : Identifikasi instans Secret yang mengandung password pengguna yang digunakan untuk berkomunikasi dengan servis REST Gluster. Parameter ini dianggap opsional, password kosong dapat digunakan ketika nilai dari secretNamespace dan secretName tidak dispesifikasikan. Secret yang disediakan haruslah memiliki tipe "kubernetes.io/glusterfs", yang dapat dibuat dengan menggunakan mekanisme dibawah ini:

    kubectl create secret generic heketi-secret \
      --type="kubernetes.io/glusterfs" --from-literal=key='opensesame' \
      --namespace=default
    

    Contoh Secret dapat ditemukan pada berkas berikut glusterfs-provisioning-secret.yaml.

  • clusterid: 630372ccdc720a92c681fb928f27b53f merupakan ID dari klaster yang akan digunakan oleh Heketi ketikan melakukan provisioning volume. ID ini juga dapat berupa serangkaian list, misalnya: "8452344e2becec931ece4e33c4674e4e,42982310de6c63381718ccfa6d8cf397". Parameter ini merupakan parameter opsional.

  • gidMin, gidMax : Nilai minimum dan maksimum dari GID untuk kelas penyimpanan (storage class). Sebuah nilai unik dari GID di dalam range ( gidMin-gidMax ) ini akan digunakan untuk melakukan provisioning volume secara dinamis. Nilai ini bersifat opsional. Jika tidak dispesifikasikan, volume akan secara default di-provisioning dalam range 2000-2147483647 yang merupakan nilai default dari gidMin dan gidMax.

  • volumetype : Tipe volume beserta paremeter-nya dapat diatur dengan menggunakan nilai opsional berikut. Jika tipe dari volume tidak dispesifikasikan, maka provisioner akan memutuskan tipe volume apakah yang akan digunakan.

    Sebagai contoh:

    • Volume replika: volumetype: replicate:3 dimana '3' merupakan jumlah replika.

    • Persebaran (Disperse)/EC volume: volumetype: disperse:4:2 dimana'4' merupakan data dan '2' merupakan jumlah redundansi.

    • Distribusi volume: volumetype: none

    Untuk tipe volume apa saja yang tersedia dan berbagai opsi administrasi yang ada, kamu dapat membaca Petunjuk Administrasi.

    Untuk informasi lebih lanjut, kamu dapat membaca Bagaimana Cara Mengatur Heketi.

    Ketika PersistentVolume di-provisioning secara dinamis, plugin Gluster secara otomatis akan membuat endpoint serta sebuah servis headless dengan nama gluster-dynamic-<claimname>. Endpoint dinamis dan servis secara otomatis akan dihapus ketika PVC dihapus.

OpenStack Cinder

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gold
provisioner: kubernetes.io/cinder
parameters:
  availability: nova
  • availability: Zona Availability. Jika tidak dispesifikasikan, secara umum volume akan diatur dengan menggunakan algoritma round-robin pada semua zona aktif dimana klaster Kubernetes memiliki sebuah node.

vSphere

  1. Buatlah sebuah StorageClass dengan menggunakan sebuah format disk yang dispesifikasikan oleh pengguna.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: fast
    provisioner: kubernetes.io/vsphere-volume
    parameters:
      diskformat: zeroedthick
    

    diskformat: thin, zeroedthick dan eagerzeroedthick. Nilai default: "thin".

  2. Buatlah sebuah StorageClass dengan menggunakan sebuah format disk pada datastore yang dispesifikasikan oleh pengguna.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: fast
    provisioner: kubernetes.io/vsphere-volume
    parameters:
        diskformat: zeroedthick
        datastore: VSANDatastore
    

    datastore: Pengguna juga dapat menspesifikasikan datastore pada StorageClass. Volume akan dibuat pada datastore yang dispesifikasikan pada kelas penyimpanan, dalam hal ini adalah VSANDatastore. Field ini bersifat opsional. Jika datastore tidak dispesifikasikan, maka volume akan dibuat dengan menggunakan datastore yang dispesifikasikan pada berkas konfigurasi vSphere yang digunakan untuk menginisialisasi penyedia layanan cloud vSphere.

  3. Manajemen Kebijakan Penyimpanan di dalam Kubernetes

    • Menggunakan kebijakan (policy) yang ada pada vCenter

      Salah satu dari fitur paling penting yang ada pada vSphere untuk manajemen penyimpanan adalah manajemen bebasis policy. Storage Policy Based Management (SPBM) adalah framework yang menyediakan sebuah control plane terpadu pada data service yang meluas dan solusi penyimpanannya yang tersedia. SPBM memungkinkan administrator vSphere menghadapi permasalahan yang mungkin muncul seperti capacity planning, membedakan level servis, dan melakukan manajemen headroom capacity.

      Policy SPBM dapat dispesifikasikan pada StorageClass menggunakan parameter storagePolicyName.

    • Dukungan policy SAN virtual di dalam Kubernetes

      Administrator Vsphere Infrastructure (VI) akan memiliki kemampuan untuk menspesifikasikan Virtual SAN Storage Capabilities khusus selama masa provisioning volume secara dinamis. Persyaratan kapabilitas penyimpanan diubah menjadi sebuah policy Virtual SAN yang nantinya akan dimasukkan ke dalam lapisan Virtual SAN ketika sebuah persitent volume (penyimpanan virtual) dibuat. Penyimpanan virtual kemudian akan didistribusikan pada semua datastore Virtual SAN untuk memenuhi kebutuhan ini.

      Kamu dapat melihat Policy Penyimpanan Berdasarkan Manajemen untuk Provisioning Dinamis Volume untuk detil lebih lanjut mengenai penggunaan policy penyimpanan untuk manajemen persistent volume.

Terdapat beberapa contoh vSphere yang dapat kamu gunakan untuk mencoba manajemen persistent volume di dalam Kubernetes untuk vSpehere.

RBD Ceph

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/rbd
parameters:
  monitors: 10.16.153.105:6789
  adminId: kube
  adminSecretName: ceph-secret
  adminSecretNamespace: kube-system
  pool: kube
  userId: kube
  userSecretName: ceph-secret-user
  userSecretNamespace: default
  fsType: ext4
  imageFormat: "2"
  imageFeatures: "layering"
  • monitors: Monitor Ceph, merupakan nilai yang dipisahkan oleh koma (csv). Parameter ini dibutuhkan.

  • adminId: ID klien Ceph yang dapat digunakan untuk membuat images di dalam pool. Nilai default-nya adalah "admin".

  • adminSecretName: Nama Secret untuk adminId. Parameter ini dibutuhkan. Secret yang dibutuhkan haruslah memiliki tipe "kubernetes.io/rbd".

  • adminSecretNamespace: Namespace untuk adminSecretName. Nilai default-nya adalah "default".

  • pool: Pool Ceph RBD. Nilai default-nya adalah "rbd".

  • userId: Klien ID Ceph yang digunakan untuk melakukan pemetaan image RBD. Nilai default-nya sama dengan adminId.

  • userSecretName: Nama Secret Ceph untuk userId yang digunakan untuk memetakan image RBD. Secret ini harus berada pada namespace yang sama dengan PVC. Parameter ini dibutuhkan. Secret yang disediakan haruslah memiliki tipe "kubernetes.io/rbd", dibuat dengan cara:

    kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \
      --from-literal=key='QVFEQ1pMdFhPUnQrSmhBQUFYaERWNHJsZ3BsMmNjcDR6RFZST0E9PQ==' \
      --namespace=kube-system
    
  • userSecretNamespace: Namespace untuk userSecretName.

  • fsType: fsType yang didukung oleh kubernetes. Nilai default-nya adalah: "ext4".

  • imageFormat: Format image Ceph RBD, nilai yang mungkin adalah "1" atau "2". Nilai default-nya adalah "2".

  • imageFeatures: Parameter ini bersifat opsional dan hanya dapat digunakan jika kamu mengganti nilai dari imageFormat ke "2". Saat ini fitur yang didukung hanyalah layering. Nilai default-nya adalah "", dan tidak ada fitur yang diaktifkan.

Quobyte

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: slow
provisioner: kubernetes.io/quobyte
parameters:
    quobyteAPIServer: "http://138.68.74.142:7860"
    registry: "138.68.74.142:7861"
    adminSecretName: "quobyte-admin-secret"
    adminSecretNamespace: "kube-system"
    user: "root"
    group: "root"
    quobyteConfig: "BASE"
    quobyteTenant: "DEFAULT"
  • quobyteAPIServer: API Server dari Quobyte dalam format "http(s)://api-server:7860"

  • registry: Registri Quobyte yang digunakan untuk melakukan mount volume. Kamu dapat menspesifikasikan registri yang kamu inginkan dengan format pasangan <host>:<port> atau jika kamu ingin mendefinisikan beberapa registri sekaligus kamu dapat menempatkan koma diantara setiap pasangan <host>:<port> yang ada, misalnya <host1>:<port>,<host2>:<port>,<host3>:<port>. Host dapat berupa alamat IP atau DNS.

  • adminSecretNamespace: Namespace adminSecretName. Nilai default-nya adalah "default".

  • adminSecretName: Secret yang mengandung informasi mengenai pengguna Quobyte dan password yang digunakan untuk melakukan otentikasi API server. Secret yang digunakan haruslah memiliki tipe "kubernetes.io/quobyte", yang dibuat dengan mekanisme berikut:

    kubectl create secret generic quobyte-admin-secret \
      --type="kubernetes.io/quobyte" --from-literal=key='opensesame' \
      --namespace=kube-system
    
  • user: Melakukan pemetaan terhadap semua akses yang dimiliki pengguna. Nilai default-nya adalah "root".

  • group: Melakukan pemetaan terhadap semua group. Nilai default-nya adalah "nfsnobody".

  • quobyteConfig: Menggunakan konfigurasi spesifik untuk membuat volume. Kamu dapat membuat sebuah file konfigurasi atau melakukan modifikasi terhadap konfigurasi yang sudah ada dengan menggunakan tatap muka Web atau CLI quobyte. Nilai default-nya adalah "BASE".

  • quobyteTenant: Menggunakan ID tenant yang dispesifikasikan untuk membuat/menghapus volume. Tenant Quobyte haruslah sudah berada di dalam Quobyte. Nilai default-nya adalah "DEFAULT".

Azure Disk

Kelas Penyimpanan Disk Azure yang Tidak Dikelola

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/azure-disk
parameters:
  skuName: Standard_LRS
  location: eastus
  storageAccount: azure_storage_account_name
  • skuName: Akun penyimpanan Azure yang ada pada tingkatan Sku. Nilai default-nya adalah kosong.
  • location: Lokasi akun penyimpanan Azure. Nilai default-nya adalah kosong.
  • storageAccount: Nama akun penyimpanan Azure. Jika sebuan akun penyimpanan disediakan, akun tersebut haruslah berada pada grup sumber daya yang ada dengan klaster, dan location akan diabaikan. Jika sebuah akun penyimpanan tidak disediakan, sebuah akun penyimpanan baru akan dibuat pada grup sumber daya yang ada dengan klaster.

Kelas Penyimpanan Disk Azure yang Baru (mulai versi v1.7.2)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/azure-disk
parameters:
  storageaccounttype: Standard_LRS
  kind: managed
  • storageaccounttype: Akun penyimpanan Azure yang ada pada tingkatan Sku. Nilai default-nya adalah kosong.
  • kind: Nilai yang mungkin adalah shared, dedicated, dan managed (default). Ketika kind yang digunakan adalah shared, semua disk yang tidak di-manage akan dibuat pada beberapa akun penyimpanan yang ada pada grup sumber daya yang sama dengan klaster. Ketika kind yang digunakan adalah dedicated, sebuah akun penyimpanan baru akan dibuat pada grup sumber daya yang ada dengan klaster. Ketika kind yang digunakan adalah managed, semua disk yang dikelola akan dibuat pada grup sumber daya yang ada dengan klaster.
  • VM premium dapat di-attach baik pada Standard_LRS dan Premium_LRS disks, sementara Standard VM hanya dapat di-attach pada disk Standard_LRS.
  • VM yang dikelola hanya dapat meng-attach disk yang dikelola dan VM yang tidak dikelola hanya dapat meng-attach disk yang tidak dikelola.

Berkas Azure

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile
provisioner: kubernetes.io/azure-file
parameters:
  skuName: Standard_LRS
  location: eastus
  storageAccount: azure_storage_account_name
  • skuName: Akun penyimpanan Azure yang ada pada tingkatan Sku. Nilai default-nya adalah kosong.
  • location: Lokasi akun penyimpanan Azure. Nilai default-nya adalah kosong.
  • storageAccount: Nama akun penyimpanan Azure. Nilai default-nya adalah kosong. Jika sebuah penyimpanan tidak memiliki sebuah akun yang disediakan, semua akun penyimpanan yang diasosiasikan dengan grup sumber daya yang ada dan kemudian melakukan pencarian terhadap akun yang sesuai dengan skuName dan location. Jika sebuah akun penyimpanan disediakan, akun tersebut haruslah berada di dalam grup sumber daya yang sama dengan klaster, serta skuName dan location akan diabaikan.

Selama provision, sebuah secret dibuat untuk menyimpan credentials. Jika klaster menggunakan konsep RBAC dan Roles Controller, menambahkan kapabilitas create untuk sumber daya secret bagi clusterrole system:controller:persistent-volume-binder.

Volume Portworx

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: portworx-io-priority-high
provisioner: kubernetes.io/portworx-volume
parameters:
  repl: "1"
  snap_interval:   "70"
  io_priority:  "high"

  • fs: filesystem yang akan digunakan: none/xfs/ext4 (nilai default-nya: ext4).
  • block_size: ukuran block dalam Kbytes (nilai default-nya: 32).
  • repl: jumlah replika synchronous yang dapat disediakan dalam bentuk faktor replikasi 1..3 (nilai default-nya: 1) Nilai yang diharapkan dalam bentuk String "1" dan bukan 1.
  • io_priority: menentukan apakah volume yang dibuat akan dari penyimpanan dengan kualitas tinggi atau rendah dengan urutan prioritas high/medium/low (nilai default-nya: low).
  • snap_interval: interval waktu dalam menit yang digunakan untuk melakukan trigger snapshots. Snapshots dibuat secara inkremen berdasarkan perbedaan yang ada dengan snapshot yang dibuat sebelumnya, nilai perbedaan 0 akan menonaktifkan pembuatan snapshot (nilai default-nya: 0). Sebuah string merupakan nilai yang diharapkan "70" dan bukan 70.
  • aggregation_level: menspesifikasikan jumlah chunks dimana volume akan didistribusikan, 0 mengindikasikan volume yang non-aggregate (nilai default-nya: 0). Sebuah string merupakan nilai yang diharapkan "0" dan bukan 0.
  • ephemeral: menentukan apakah volume harus dihapus setelah di-unmount atau harus tetap ada. Penggunaan emptyDir dapat diubah menjadi true dan penggunaan persistent volumes untuk basisdata seperti Cassandra harus diubah menjadi false, true/false (nilai default-nya: false). Sebuah string merupakan nilai yang diharapkan "true" dan bukan true.

ScaleIO

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/scaleio
parameters:
  gateway: https://192.168.99.200:443/api
  system: scaleio
  protectionDomain: pd0
  storagePool: sp1
  storageMode: ThinProvisioned
  secretRef: sio-secret
  readOnly: false
  fsType: xfs
  • provisioner: atribut yang nilainya merupakan kubernetes.io/scaleio
  • gateway: alamat gateway ScaleIO (wajib)
  • system: nama sistem ScaleIO (wajib)
  • protectionDomain: nama domain proteksi ScaleIO (wajib)
  • storagePool: nama pool volume penyimpanan (wajib)
  • storageMode: mode provisioning penyimpanan: ThinProvisioned (default) atau ThickProvisioned
  • secretRef: penunjuk pada objek Secret yang dikonfigurasi (wajib)
  • readOnly: menentukan mode akses terhadap volume yang di-mount (nilai default-nya: false)
  • fsType: filesystem yang digunakan untuk volume (nilai default-nya: ext4)

Plugin volume ScaleIO Kubernetes membutuhkan objek Secret yang suda dikonfigurasi sebelumnya. Secret ini harus dibuat dengan tipe kubernetes.io/scaleio dan menggunakan namespace yang sama dengan PVC yang dirujuk, seperti ditunjukkan pada contoh yang ada:

kubectl create secret generic sio-secret --type="kubernetes.io/scaleio" \
--from-literal=username=sioadmin --from-literal=password=d2NABDNjMA== \
--namespace=default

StorageOS

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/storageos
parameters:
  pool: default
  description: Kubernetes volume
  fsType: ext4
  adminSecretNamespace: default
  adminSecretName: storageos-secret
  • pool: Nama kapasitas distribusi StorageOS yang digunakan untuk melakukan provisioning volume. Pool default akan digunakan apabila nilainya tidak dispesifikasikan.
  • description: Deskripsi untuk melakukan assignment volume yang baru dibuat secara dinamis. Semua deskripsi volume akan bernilai sama untuk kelas penyimpanan yang sama, meskipun begitu kelas penyimpanan yang berbeda dapat digunakan untuk membuat deskripsi yang berbeda untuk penggunaan yang berbeda. Nilai default-nya adalah Kubernetes volume.
  • fsType: Tipe filesystem default yang digunakan. Perhatikan bahwa aturan yang didefinisikan oleh pengguna di dalam StirageOS dapat meng-override nilai ini. Nilai default-nya adalah ext4.
  • adminSecretNamespace: Namespace dimana konfigurasi secret API berada. Hal ini bersifat wajib apabila adminSecretName diaktifkan.
  • adminSecretName: Nama secret yang digunakan untuk memperoleh credentials StorageOS API. Jika tidak dispesifikasikan, nilaidefault akan digunakan.

Plugin volume dapat menggunakan objek Secret untuk menspesifikasikan endpoint dan kredensial yang digunakan untuk mengakses API StorageOS. Hal ini hanya akan dibutuhkan apabila terdapat perubahan pada nilai default. Secret ini harus dibuat dengan tipe kubernetes.io/storageos, seperti ditunjukkan pada contoh yang ada:

kubectl create secret generic storageos-secret \
--type="kubernetes.io/storageos" \
--from-literal=apiAddress=tcp://localhost:5705 \
--from-literal=apiUsername=storageos \
--from-literal=apiPassword=storageos \
--namespace=default

Secret yang digunakan untuk melakukan provisioning volume secara dinamis dapat dibuat di namespace apapun dan dirujuk dengan menggunakan parameter adminSecretNamespace. Secret yang digunakan oleh volume yang sedang di-provisioning harus dibuat pada namespace yang sama dengan PVC yang merujuk secret tersebut.

Lokal

FEATURE STATE: Kubernetes v1.14 [stable]
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

Volume lokal tidak mendukung adanya provisioning secara dinamis, meskipun begitu sebuah StorageClass akan tetap dibuat untuk mencegah terjadinya bind volume sampai scheduling pod dilakukan. Hal ini dispesifikasikan oleh mode binding volume WaitForFirstConsumer.

Memperlambat binding volume mengizinkan scheduler untuk memastikan batasan scheduling semua pod ketika memilih PersistentVolume untuk sebuah PersistentVolumeClaim.

Last modified April 27, 2022 at 12:39 PM PST: [id] Update external provisioner specification reference (7f57114949)