Volume dan Persistent Storage di Kubernetes
Kubernetes menyediakan cara untuk mengelola penyimpanan data agar aplikasi tetap dapat mempertahankan data meskipun Pod berhenti atau dipindahkan. Ini penting untuk aplikasi yang membutuhkan penyimpanan data jangka panjang, seperti database atau aplikasi lain yang berhubungan dengan data persistensi.
1. Memahami Volume di Kubernetes
Volume dalam Kubernetes memberikan cara bagi container dalam Pod untuk menyimpan data. Tidak seperti penyimpanan data di container biasa yang bersifat ephemeral (hilang ketika container dihentikan), Kubernetes Volume memungkinkan data tetap ada selama Pod aktif.
Ada beberapa jenis Volume di Kubernetes, antara lain:
1. emptyDir: Volume sederhana yang digunakan oleh container dalam satu Pod. Data hanya bertahan selama Pod berjalan. Jika Pod dihapus, data juga hilang.
Use Case: Digunakan untuk berbagi data sementara antar container dalam Pod yang sama.
apiVersion: v1
kind: Pod
metadata:
name: emptydir-pod
spec:
containers:
- name: my-container
image: busybox
command: ['sh', '-c', 'while true; do echo hello > /mnt/data/hello.txt; sleep 5; done']
volumeMounts:
- name: my-volume
mountPath: /mnt/data
volumes:
- name: my-volume
emptyDir: {}
2. hostPath: Volume yang menghubungkan direktori di host (Node) ke container di dalam Pod.
Use Case: Digunakan untuk akses langsung ke file system Node. Namun, ini memiliki risiko keamanan jika digunakan secara luas.
volumes:
- name: host-volume
hostPath:
path: /data
3. configMap dan secret: Volume khusus untuk menyimpan konfigurasi dan data sensitif, seperti password dan token.
4. Persistent Volume (PV): Volume yang menyediakan penyimpanan yang tidak tergantung pada lifecycle Pod atau Node, memungkinkan data bertahan di luar lifecycle Pod.
2. PersistentVolume (PV) dan PersistentVolumeClaim (PVC)
Untuk penyimpanan jangka panjang yang persisten, Kubernetes menggunakan dua objek utama: PersistentVolume (PV) dan PersistentVolumeClaim (PVC).
PersistentVolume (PV)
PersistentVolume adalah abstraksi dari penyimpanan fisik yang disediakan oleh administrator cluster. PV bisa berasal dari berbagai sumber penyimpanan seperti Network File System (NFS), Amazon EBS, Google Cloud Persistent Disks, atau penyimpanan lokal dari Node.
- PV dikelola secara terpisah dari Pod dan cluster.
- PV dapat berupa penyimpanan dinamis (dibuat sesuai kebutuhan) atau statis (dibuat sebelumnya oleh administrator).
Contoh PersistentVolume:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /mnt/data
server: 192.168.0.100
- capacity: Menentukan jumlah penyimpanan yang tersedia (misalnya, 10GiB).
- accessModes: Menentukan bagaimana volume dapat diakses:
ReadWriteOnce
: Volume hanya bisa dibaca dan ditulis oleh satu Node.ReadOnlyMany
: Volume bisa dibaca oleh beberapa Pod sekaligus.ReadWriteMany
: Volume bisa dibaca dan ditulis oleh beberapa Pod sekaligus.
- persistentVolumeReclaimPolicy: Kebijakan tentang apa yang harus dilakukan setelah PVC tidak lagi digunakan:
Retain
: Menahan volume, memungkinkan data tetap ada.Recycle
: Menghapus data pada volume.Delete
: Menghapus PV saat PVC dihapus.
PersistentVolumeClaim (PVC)
PersistentVolumeClaim (PVC) adalah permintaan yang dibuat oleh pengguna untuk meminta penyimpanan dari PV. PVC mengklaim sejumlah kapasitas penyimpanan dengan mode akses tertentu. Setelah diklaim, PVC terhubung ke Pod untuk menyediakan penyimpanan.
Contoh PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
- accessModes: Mode akses PVC sama seperti di PV (
ReadWriteOnce, ReadOnlyMany, ReadWriteMany
). - resources: Kapasitas penyimpanan yang diminta, dalam contoh ini 5GiB.
Setelah PVC dibuat, Kubernetes akan mencari PV yang cocok (dengan kapasitas dan accessMode yang sesuai). Jika PV tersedia, maka PV akan di-bind ke PVC.
Integrasi PV dan PVC dalam Pod
Untuk menghubungkan PV dan PVC ke Pod, Anda perlu menggunakan volume dalam spec Pod dan menyertakan volumeMounts untuk container.
Contoh YAML untuk Pod yang Menggunakan PVC:
apiVersion: v1
kind: Pod
metadata:
name: pvc-pod
spec:
containers:
- name: my-container
image: busybox
command: ['sh', '-c', 'echo "hello from Kubernetes" > /mnt/storage/hello.txt; sleep 3600']
volumeMounts:
- mountPath: /mnt/storage
name: my-persistent-volume
volumes:
- name: my-persistent-volume
persistentVolumeClaim:
claimName: pvc-example
- volumeMounts: Menunjukkan lokasi dalam container di mana volume di-mount (dalam contoh ini
/mnt/storage
). - volumes: Menghubungkan Pod ke PVC yang diklaim (dalam contoh ini,
pvc-example
).
3. Menyimpan Data Aplikasi Menggunakan PVC
Menggunakan PVC memungkinkan Anda untuk memastikan bahwa data aplikasi Anda disimpan secara persisten, bahkan jika Pod yang menjalankan aplikasi dihentikan atau dipindahkan ke Node lain. Berikut langkah-langkahnya:
Langkah-Langkah Menyimpan Data Aplikasi dengan PVC:
Buat PersistentVolume (PV): Buat PV terlebih dahulu yang menyediakan penyimpanan dari sumber eksternal (misalnya, NFS, cloud storage, atau disk lokal).
Contoh PV menggunakan NFS:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
path: /mnt/data
server: 192.168.1.100
Buat PersistentVolumeClaim (PVC): Buat PVC yang meminta penyimpanan dari PV.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Gunakan PVC dalam Pod: Buat Pod yang mengakses PVC untuk menyimpan data persisten.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-app
image: busybox
command: ['sh', '-c', 'echo "Kubernetes Persistent Storage" > /mnt/data/persist.txt; sleep 3600']
volumeMounts:
- name: my-storage
mountPath: /mnt/data
volumes:
- name: my-storage
persistentVolumeClaim:
claimName: pvc-nfs
- Penjelasan:
- Pod akan menyimpan file di
/mnt/data/persist.txt
, yang disimpan secara persisten di lokasi NFS yang dihubungkan melalui PVC.
- Pod akan menyimpan file di
- Verifikasi:
- Setelah Pod berjalan, Anda dapat memverifikasi bahwa data tersimpan secara persisten dengan memeriksa direktori NFS atau cloud storage Anda.
Manfaat Menggunakan PVC dalam Aplikasi:
- Data Persistensi: Data yang disimpan oleh aplikasi tidak hilang ketika Pod berhenti atau di-restart.
- Skalabilitas: Ketika aplikasi Anda berkembang, PVC dapat digunakan bersama dengan StatefulSets untuk mengelola penyimpanan yang persisten.
- Abstraksi Sumber Penyimpanan: PVC mengabstraksi penyimpanan fisik, memungkinkan aplikasi tidak perlu peduli dengan bagaimana penyimpanan diimplementasikan (NFS, EBS, GCP PD, dsb).
PersistentVolume Reclaim Policy
Kebijakan reclaim pada PV menentukan apa yang terjadi dengan volume ketika PVC yang mengklaimnya dihapus. Terdapat tiga opsi yang tersedia, yaitu:
- Retain: Volume tetap ada meskipun PVC dihapus. Data tetap dipertahankan.
- Recycle: Volume akan diformat ulang (mirip dengan penghapusan file di Recycle Bin).
- Delete: Volume akan dihapus dari storage backend saat PVC dihapus.