kubernetes pv and pvc ☁️
Neden Lazım?
Kubernetes’te pod’lar geçicidir. Yani bir pod silinirse, içindeki veriler de silinir.Ancak bazı uygulamalar kalıcı depolama ister. İşte burada devreye PVve PVC girer. Oluşturduğumuz pv ve pvcler cluster dışında durur aslında buna her node erişebilir ve tek node erişsin vs gibi seçeneklerde mevcut hepsini anlatacağım 🙂
PersistentVolume (PV) Nedir?
PV, cluster yöneticisi tarafından önceden tanımlanmış bir kalıcı disk alanıdır.NFS, iSCSI, hostPath, cloud disk (EBS vs.) gibi altyapılardan gelir.
PersistentVolumeClaim (PVC) Nedir?
PVC, kullanıcının “bana şu kadar depolama lazım” diyerek yaptığı bir istektir.PVC, uygun PV bulursa otomatik olarak eşleşir.
PV: Cluster genelinde tanımlı disk alanı, fiziksel kaynak.
• PVC: Pod’un disk isteği, PV’ye bağlanmak için oluşturulur çünkü pod doğrudan PV ile konuşmaz.
🔁 Yani önce PV tanımlarsın, sonra PVC ile bu alanı talep edersin.!!’ ÖNEMLİ
NFS disk tanımlasını docker üzerinde yapcağaız
$ docker volume create nfsvol
$ docker network create --driver=bridge --subnet=10.255.255.0/24 --ip-range=10.255.255.0/24 --gateway=10.255.255.10 nfsnet
$ docker run -dit --privileged --restart unless-stopped -e SHARED_DIRECTORY=/data -v nfsvol:/data --network nfsnet -p 2049:2049 --name nfssrv ozgurozturknet/nfs:latest
📝 Bu container, /data dizinini NFS üzerinden dışarıya sunuyor. IP adresi ise 10.255.255.10.
📦 Kubernetes PersistentVolume ile Bağlantı
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysqlpv
labels:
app: mysql
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /
server: 10.255.255.10
✅ Açıklama:
• nfs.path: / → NFS sunucusunda paylaşıma açılmış dizin (/data NFS içinde / olarak görünür).
• nfs.server: 10.255.255.10 → Docker’daki NFS container’ın IP’si.
- Bu sayede Kubernetes, o IP’ye bağlanıp o dizini kullanabilir.
🧩 PersistentVolumeClaim ve Pod Örneği
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysqlclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 5Gi
storageClassName: ""
selector:
matchLabels:
app: mysql
Pod Örneği ise oluşturağcaınız pod’un spec içersinde pvc bilgilerini eklemeniz gerekiyor
volumes:
- name: mysqlvolume
persistentVolumeClaim:
claimName: mysqlclaim
Modlarını ve policy yazıp bırakıyorum 🙂
• ReadWriteOnce: Tek pod okur/yazar ✅
• ReadOnlyMany: Birden çok pod sadece okur ✅
• ReadWriteMany: Birden çok pod okur/yazar ✅
• persistentVolumeReclaimPolicy: PV silindiğinde ne olacağını belirler → Retain (elde tut), Recycle (içeriği sil), Delete(tamamen sil)