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
  1. Penjelasan:
    • Pod akan menyimpan file di /mnt/data/persist.txt, yang disimpan secara persisten di lokasi NFS yang dihubungkan melalui PVC.
  2. 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.