Portal/Notes πŸ“
Cka

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 Minikube
  • accessModes mendefinisikan 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>                          13s

Persistent 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: manual

Setelah 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>                 2s

Seperti 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 PVC

Dalam 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          62s

Service 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: 5432

Ini 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   6s

Menguji 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 -> 5432

Hubungkan ke server postgres menggunakan psql.

psql -h localhost -U admin

Buat 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 TABLE

Masukkan 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


Edit on GitHub

Last updated on

Persistent Volume & Claim | Faisal Affan