Persistent Volume & Claim
Versi Bahasa Indonesia. Baca dalam Bahasa Inggris
Persistent Volume (PV) adalah resource penyimpanan yang sebenarnya, sedangkan Persistent Volume Claim (PVC) adalah permintaan penyimpanan oleh Pod.
Persistent Volume
Persistent Volume (PV) di Kubernetes adalah resource penyimpanan yang ada secara independen dari Pod, memungkinkan data tetap ada bahkan jika Pod dihapus atau dijadwalkan ulang.
Salah satu kasus penggunaan yang membutuhkan persistent volume adalah ketika kita ingin menerapkan database. Kita ingin data tetap ada bahkan ketika pod yang menjalankan server postgres mati atau ditingkatkan.
Mari kita buat file baru postgres-pv.yaml. Dalam file ini kita akan menempatkan definisi persistent volume untuk digunakan database kita.
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
spec:
capacity:
storage: 1Gi # 1GB Storage
accessModes:
- ReadWriteOnce # Only one node can mount it at a time
persistentVolumeReclaimPolicy: Retain # Keep data even if PVC is deleted
storageClassName: manual
hostPath:
path: "/mnt/data/postgresql" # Local storage for MinikubeaccessModesmendefinisikan bagaimana volume dapat diakses:- ReadWriteOnce: Dapat dipasang sebagai read-write oleh satu node.
- ReadOnlyMany: Dapat dipasang sebagai read-only oleh beberapa node.
- ReadWriteMany: Dapat dipasang sebagai read-write oleh beberapa node.
persistentVolumeReclaimPolicy: menentukan apa yang terjadi ketika PVC dihapus:- Retain: Menyimpan data bahkan jika PVC dihapus.
- Delete: Menghapus PV dan datanya.
- Recycle: Melakukan pembersihan dasar PV (
rm -rf /thevolume/*).
Menerapkan dan Memvalidasi
Mari kita terapkan definisi persistent volume dan validasi menggunakan get pv atau describe pv.
β kubectl apply -f postgres-pv.yaml
persistentvolume/postgres-pv createdβ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY
postgres-pv 1Gi RWO Retain
STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
Available manual <unset> 13sPersistent Volume Claim
PersistentVolumeClaim (PVC) adalah permintaan penyimpanan oleh pengguna. Ini mirip dengan Pod. Pod mengonsumsi resource node dan PVC mengonsumsi resource PV. Pod dapat meminta tingkat resource tertentu (CPU dan Memory). Claim dapat meminta ukuran tertentu dan mode akses.
Buat file baru postgres-pvc.yaml dan masukkan definisi PVC kita di sana.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: manualSetelah kita membuat PVC, Kubernetes mencari PV yang memenuhi persyaratan claim. PV dan PVC harus memiliki hal-hal berikut agar dapat terikat:
- Mode akses yang sama (
ReadWriteOnce). - Storage class yang sama (
manual). - Ukuran penyimpanan yang diminta PVC harus kurang dari atau sama dengan PV. Jika tidak, status PVC akan stuck di pending sampai penyimpanan PV ditingkatkan.
Menerapkan dan Memvalidasi
Mari kita terapkan dan validasi menggunakan perintah get pvc atau describe pvc.
β kubectl apply -f postgres-pvc.yaml
persistentvolumeclaim/postgres-pvc createdβ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES
postgres-pvc Bound postgres-pv 1Gi RWO
STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
manual <unset> 2sSeperti yang kita lihat dari output get pvc di atas, status PVC kita berhasil terikat (Bound).
Deployment Postgres
Langkah selanjutnya adalah membuat definisi spesifikasi deployment untuk server postgres kita yang menggunakan PVC yang didefinisikan sebelumnya. Buat file baru postgres-deployment.yaml dan masukkan definisi server postgres kita di sana.
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:17
ports:
- containerPort: 5432
env:
- name: POSTGRES_USER
value: "admin"
- name: POSTGRES_PASSWORD
value: "password"
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data # PostgreSQL data directory
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvc # Connects to PVCDalam definisi ini, kita mengekspos POSTGRES_USER dan POSTGRES_PASSWORD dalam teks biasa. Ini tidak disarankan dan jangan lakukan ini dalam produksi. Kita akan belajar cara memanfaatkan Kubernetes secret untuk ini nanti.
Menerapkan dan Memvalidasi
β kubectl apply -f postgres-deployment.yaml
deployment.apps/postgres createdβ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-5f969684c4-kssfd 1/1 Running 0 62sService Postgres
Setelah membuat deployment, kita perlu membuat service untuk mengeksposnya sehingga dapat diakses oleh aplikasi kita. Buat file baru postgres-service.yaml dan masukkan definisi service postgres di sana.
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
selector:
app: postgres
ports:
- protocol: TCP
port: 5432
targetPort: 5432Ini akan mengekspos service postgres pada port 5432.
Menerapkan dan Memvalidasi
β kubectl apply -f postgres-service.yaml
service/postgres createdβ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23d
postgres ClusterIP 10.99.16.100 <none> 5432/TCP 6sMenguji Persistensi Data
Untuk mengakses database postgres yang baru kita terapkan dan melakukan beberapa pengujian, kita dapat melakukan port forward.
β kubectl port-forward services/postgres 5432:5432
Forwarding from 127.0.0.1:5432 -> 5432
Forwarding from [::1]:5432 -> 5432Hubungkan ke server postgres menggunakan psql.
psql -h localhost -U adminBuat database baru mydb atau nama apa pun yang Anda inginkan, hubungkan ke dalamnya, dan buat tabel sederhana message.
admin=# CREATE DATABASE mydb;
CREATE DATABASE
admin=# \c mydb
You are now connected to database "mydb" as user "admin".
mydb=#
CREATE TABLE message
(
id SERIAL PRIMARY KEY,
content TEXT DEFAULT ''
);
CREATE TABLEMasukkan baris ke dalam tabel dan pilih.
mydb=# INSERT INTO message (content) VALUES ('Hello!');
INSERT 0 1
mydb=# SELECT * FROM message;
id | content
----+---------
1 | Hello!
(1 row)Mari kita restart pod menggunakan kubectl rollout restart deployment postgres. Setelah pod baru berjalan, port forward kita akan berhenti, jadi kita perlu memulai port forward lagi. Kemudian hubungkan menggunakan psql dan pilih tabel. Data yang ada akan tetap ada bahkan setelah pod lama dihapus dan pod baru dibuat.
admin=# \c mydb
You are now connected to database "mydb" as user "admin".
mydb=# SELECT * FROM message;
id | content
----+---------
1 | Hello!
(1 row)Referensi
- https://kubernetes.io/docs/concepts/storage/persistent-volumes/
- https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
- https://github.com/docker-library/docs/blob/master/postgres/README.md
Last updated on