Halaman ini memberikan ringkasan tentang volume persisten dan klaim di Kubernetes, serta penggunaannya dengan Google Kubernetes Engine (GKE). Halaman ini berfokus pada penyimpanan yang didukung oleh persistent disk Compute Engine.
PersistentVolumes
Resource PersistentVolume
digunakan untuk mengelola penyimpanan yang tahan lama di cluster. Di
GKE, PersistentVolume
biasanya didukung oleh persistent
disk. Anda juga dapat menggunakan solusi penyimpanan lain seperti NFS.
Filestore adalah solusi NFS di
Google Cloud. Untuk mempelajari cara menyiapkan instance
Filestore sebagai solusi NFS PV untuk cluster GKE, lihat
Mengakses instance Filestore dengan driver CSI Filestore
di dokumentasi Filestore.
Opsi penyimpanan lainnya adalah Cloud Volume Service. Produk ini adalah layanan penyimpanan data berbasis cloud yang terkelola sepenuhnya, yang memberikan kemampuan pengelolaan data lanjutan dan performa yang sangat skalabel.
Siklus proses PersistentVolume
dikelola oleh Kubernetes. PersistentVolume
dapat disediakan secara dinamis; Anda tidak perlu membuat dan menghapus penyimpanan cadangan secara manual.
Resource PersistentVolume
adalah resource cluster yang ada secara independen dari
Pod.
Ini berarti bahwa disk dan data
yang ditampilkan oleh PersistentVolume
terus ada saat cluster berubah dan
saat Pod dihapus dan dibuat ulang. Resource PersistentVolume
dapat
disediakan secara dinamis melalui PersistentVolumeClaims
, atau dapat
dibuat secara eksplisit oleh administrator cluster.
Untuk mempelajari resource PersistentVolume
lebih lanjut, lihat
dokumentasi Persistent Volume Kubernetes
dan referensi Persistent Volumes API.
PersistentVolumeClaims
PersistentVolumeClaim
adalah permintaan untuk dan klaim atas resource
PersistentVolume
. Objek PersistentVolumeClaim
meminta ukuran, mode akses,
dan StorageClass
khusus untuk PersistentVolume
. Jika PersistentVolume
yang memenuhi permintaan
ada atau dapat disediakan, PersistentVolumeClaim
akan terikat dengan
PersistentVolume
tersebut.
Pod menggunakan klaim sebagai volume. Cluster memeriksa klaim untuk menemukan volume yang terikat dan memasang volume tersebut untuk Pod.
Portabilitas adalah keuntungan lain dari penggunaan PersistentVolumes
dan
PersistentVolumeClaims
. Anda dapat dengan mudah menggunakan
spesifikasi Pod
yang sama di berbagai cluster dan lingkungan karena PersistentVolume
adalah
antarmuka ke penyimpanan pendukung yang sebenarnya.
StorageClasses
Implementasi volume seperti
Driver Antarmuka Penyimpanan Container (CSI) persistent disk Compute Engine
dikonfigurasi melalui
resource
StorageClass
.
GKE membuat StorageClass
default untuk Anda jika menggunakan
jenis persistent disk seimbang (ext4). StorageClass
default digunakan saat
PersistentVolumeClaim
tidak menentukan StorageClassName
. Anda dapat mengganti
StorageClass
default yang disediakan dengan milik Anda sendiri. Untuk mendapatkan petunjuk, lihat
Mengubah StorageClass default.
Anda dapat membuat resource StorageClass
Anda sendiri untuk menjelaskan berbagai kelas
penyimpanan. Misalnya, kelas mungkin dipetakan ke level kualitas layanan, atau ke
kebijakan pencadangan. Konsep ini terkadang disebut "profil" di sistem penyimpanan
lainnya.
Jika menggunakan
cluster dengan node pool Windows,
Anda harus membuat StorageClass
dan menentukan StorageClassName
di
PersistentVolumeClaim
karena fstype default (ext4) tidak didukung dengan
Windows. Jika menggunakan persistent disk Compute Engine, Anda harus menggunakan NTFS
sebagai jenis penyimpanan file.
Saat menentukan StorageClass
, Anda harus mencantumkan penyedia.
Di GKE, sebaiknya Anda menggunakan salah satu penyedia berikut:
Menyediakan PersistentVolume secara dinamis
Biasanya, Anda tidak perlu mengonfigurasi objek PersistentVolume
secara langsung
atau membuat persistent disk Compute Engine. Sebagai gantinya, Anda dapat membuat
PersistentVolumeClaim
dan Kubernetes secara otomatis menyediakan persistent disk
untuk Anda.
Manifes berikut menjelaskan permintaan untuk disk dengan penyimpanan 30 gibibyte (GiB)
yang mode aksesnya memungkinkannya dipasang sebagai baca-tulis oleh satu
node. Tindakan ini juga membuat Pod yang menggunakan PersistentVolumeClaim
sebagai
volume.
# pvc-pod-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
storageClassName: standard-rwo
---
kind: Pod
apiVersion: v1
metadata:
name: pod-demo
spec:
volumes:
- name: pvc-demo-vol
persistentVolumeClaim:
claimName: pvc-demo
containers:
- name: pod-demo
image: nginx
resources:
limits:
cpu: 10m
memory: 80Mi
requests:
cpu: 10m
memory: 80Mi
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pvc-demo-vol
Saat Anda membuat objek PersistentVolumeClaim
ini dengan kubectl apply -f
pvc-pod-demo.yaml
, Kubernetes akan secara dinamis membuat objek PersistentVolume
yang sesuai.
Karena kelas penyimpanan standard-rwo
menggunakan mode binding volume WaitForFirstConsumer
,
PersistentVolume
tidak akan dibuat hingga Pod dijadwalkan untuk menggunakan volume.
Contoh berikut menunjukkan PersistentVolume
yang dibuat.
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/provisioned-by: pd.csi.storage.gke.io
finalizers:
- kubernetes.io/pv-protection
- external-attacher/pd-csi-storage-gke-io
name: pvc-c9a44c07-cffa-4cd8-b92b-15bac9a9b984
uid: d52af557-edf5-4f96-8e89-42a3008209e6
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 30Gi
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: pvc-demo
namespace: default
uid: c9a44c07-cffa-4cd8-b92b-15bac9a9b984
csi:
driver: pd.csi.storage.gke.io
csi.storage.k8s.io/fstype: ext4
volumeAttributes:
storage.kubernetes.io/csiProvisionerIdentity: 1660085000920-8081-pd.csi.storage.gke.io
volumeHandle: projects/xxx/zones/us-central1-c/disks/pvc-c9a44c07-cffa-4cd8-b92b-15bac9a9b984
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: topology.gke.io/zone
operator: In
values:
- us-central1-c
persistentVolumeReclaimPolicy: Delete
storageClassName: standard-rwo
volumeMode: Filesystem
status:
phase: Bound
Dengan asumsi bahwa Anda belum mengganti kelas penyimpanan standard-rwo
,
PersistentVolume
ini didukung oleh persistent disk Compute Engine
yang baru dan kosong.
Menghapus penyimpanan persisten
Secara default, menghapus PersistentVolumeClaim untuk volume yang disediakan secara dinamis seperti persistent disk Compute Engine akan menghapus objek PersistentVolume dan disk pendukung yang sebenarnya. Perilaku ini dikontrol oleh kebijakan pemulihan
di StorageClass dan PersistentVolume, yang dapat disetel ke default
Delete
, atau Retain
. Untuk mempelajari lebih lanjut, lihat dokumentasi Kubernetes tentang Klaim Ulang.
Mengelola penyimpanan persisten selama penghapusan cluster
Saat cluster GKE dihapus, GKE akan mempertahankan resource PersistentVolume
dengan kebijakan klaim kembali Delete
atau Retain
.
Untuk menghapus resource PersistentVolume
saat menghapus cluster, Anda dapat
menghapus namespace resource PersistentVolumeClaim
secara manual, yang
akan memicu penghapusan objek PersistentVolume
dengan kebijakan Delete
.
Atau, Anda dapat menghapus resource PersistentVolumeClaim
satu per satu.
Namun, GKE tidak menunggu sebelum aktivitas penghapusan ini selesai sebelum memulai menghapus cluster. Jadi, jika Anda menghapus namespace,
segera hapus cluster tersebut, resource PersistentVolume
dengan kebijakan Delete
mungkin tidak akan dihapus.
Setelah penghapusan cluster, Anda dapat melihat resource PersistentVolume
yang tersisa di Konsol Google Cloud.
Untuk melihat resource yang tidak digunakan, seperti resource PersistentVolume
yang tidak digunakan, Anda
dapat melihat rekomendasi untuk resource
yang tidak ada aktivitas.
Mode akses
Resource PersistentVolume
mendukung
mode akses berikut:
- ReadWriteOnce: Volume dapat dipasang sebagai baca-tulis oleh satu node.
- ReadOnlyMany: Volume dapat dipasang hanya-baca oleh banyak node.
- ReadWriteMany: Volume dapat dipasang sebagai baca-tulis oleh banyak node.
Resource
PersistentVolume
yang didukung oleh persistent disk Compute Engine tidak mendukung mode akses ini.
Menggunakan persistent disk Compute Engine sebagai ReadOnlyMany
ReadWriteOnce adalah kasus penggunaan paling umum untuk persistent disk dan berfungsi sebagai mode akses default untuk sebagian besar aplikasi. Persistent disk Compute Engine juga mendukung mode ReadOnlyMany sehingga banyak aplikasi atau banyak replika aplikasi yang sama dapat menggunakan disk yang sama secara bersamaan. Contoh kasus penggunaan menampilkan konten statis di beberapa replika.
Untuk mendapatkan petunjuk lihat Menggunakan persistent disk dengan beberapa pembaca.
Menggunakan persistent disk yang sudah ada sebagai PersistentVolumes
Resource PersistentVolume
yang disediakan secara dinamis kosong saat
dibuat. Jika Anda sudah memiliki persistent disk Compute Engine yang diisi dengan
data, Anda dapat memperkenalkannya ke cluster dengan membuat resource PersistentVolume
yang sesuai
secara manual. Persistent disk harus berada di zona yang sama
dengan node cluster.
Lihat contoh cara membuat Persistent Volume yang didukung oleh persistent disk yang sudah ada.
Deployment vs. StatefulSet
Anda dapat menggunakan template PersistentVolumeClaim
atau VolumeClaim
di pengontrol level yang lebih tinggi
seperti
Deployment
atau StatefulSets.
Deployment dirancang untuk
aplikasi stateless
sehingga semua replika Deployment memiliki PersistentVolumeClaim
yang sama. Karena
Pod replika yang dibuat identik satu sama lain, hanya volume dengan mode
ReadWriteMany yang dapat berfungsi di setelan ini.
Bahkan Deployment dengan satu replika yang menggunakan volume ReadWriteOnce tidak direkomendasikan. Hal ini karena strategi Deployment default membuat Pod kedua sebelum menghilangkan Pod pertama pada pembuatan ulang. Deployment dapat gagal dalam deadlock karena Pod kedua tidak dapat dimulai karena volume ReadWriteOnce sudah digunakan, dan Pod pertama tidak akan dihapus karena Pod kedua belum dimulai. Sebagai gantinya, gunakan StatefulSet dengan volume ReadWriteOnce.
StatefulSets adalah metode yang direkomendasikan untuk men-deploy aplikasi stateful yang memerlukan volume unik per replika. Dengan menggunakan StatefulSets dengan template PersistentVolumeClaim, Anda dapat memiliki aplikasi yang dapat meningkatkan skala secara otomatis dengan PersistentVolumesClaims unik yang terkait dengan setiap Pod replika.
Persistent disk menurut region
Persistent disk regional adalah resource multi-zona yang mereplikasi data antara dua zona di region yang sama, dan dapat digunakan seperti halnya persistent disk zona. Jika terjadi pemadaman zona atau jika node cluster di satu zona menjadi tidak dapat dijadwalkan, Kubernetes dapat mengalihkan workload menggunakan volume ke zona lainnya. Anda dapat menggunakan persistent disk regional untuk membuat solusi yang sangat tersedia untuk workload stateful di GKE. Anda harus memastikan bahwa zona utama dan failover sudah dikonfigurasi dengan kapasitas resource yang cukup untuk menjalankan workload.
Persistent disk SSD regional adalah opsi untuk aplikasi seperti database yang memerlukan ketersediaan tinggi dan performa tinggi. Untuk mengetahui detail selengkapnya, lihat Memblokir perbandingan performa penyimpanan.
Seperti persistent disk zona, persistent disk regional dapat disediakan secara dinamis sesuai kebutuhan atau disediakan secara manual terlebih dahulu oleh administrator cluster. Untuk mempelajari cara menambahkan persistent disk regional, lihat Menyediakan persistent disk regional.
Zona di persistent disk
Persistent disk zona adalah resource zona dan persistent disk regional merupakan resource multi-zona. Saat Anda menambahkan penyimpanan persisten ke cluster Anda, kecuali jika zona ditentukan, GKE menetapkan disk ke satu zona. GKE memilih zona secara acak. Setelah persistent disk disediakan, setiap Pod yang merujuk ke disk akan dijadwalkan ke zona yang sama dengan disk.
Mode binding volume WaitForFirstConsumer
Jika Anda menyediakan persistent disk secara dinamis di cluster, sebaiknya
setel mode binding volume
WaitForFirstConsumer
pada StorageClass. Setelan ini menginstruksikan Kubernetes untuk menyediakan persistent
disk di zona yang sama dengan yang dijadwalkan untuk Pod. Hal ini mengikuti batasan penjadwalan
Pod seperti
anti-afinitas
dan pemilih node. Anti-afinitas di zona memungkinkan Pod StatefulSet tersebar
di seluruh zona bersama disk yang sesuai.
Berikut adalah contoh StorageClass
untuk menyediakan persistent disk zona
yang menetapkan WaitForFirstConsumer
:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: slow
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-balanced
csi.storage.k8s.io/fstype: ext4
volumeBindingMode: WaitForFirstConsumer
Untuk contoh penggunaan persistent disk regional, lihat Menyediakan persistent disk regional.
Langkah selanjutnya
- Pelajari StatefulSets, metode yang direkomendasikan untuk men-deploy aplikasi stateful.
- Pelajari cara men-deploy aplikasi stateful menggunakan StatefulSet.
- Pelajari cara menggunakan persistent disk dalam cluster.
- Pelajari cara membuat disk yang dapat dibaca dari beberapa node.
- Pelajari cara membuat persistent disk yang didukung oleh SSD.
- Pelajari cara menyediakan persistent disk regional.