Kubernetes Depolama: PV, PVC ve StorageClass Detaylı Anlatım

Kalıcı depolama yönetimi ve dinamik provizyonlama mekanizmaları.

Giriş: Konteynerlerde Kalıcı Depolama İhtiyacı

Kubernetes Pod'ları ve içindeki konteynerler varsayılan olarak geçicidir (ephemeral). Bir Pod yeniden başlatıldığında, taşındığında veya silindiğinde, içinde oluşturulan tüm veriler kaybolur. Ancak, veritabanları, dosya sunucuları veya kullanıcı tarafından yüklenen içerik gibi durum bilgisi olan (stateful) uygulamalar için verilerin kalıcı olması hayati öneme sahiptir.

Kubernetes, bu kalıcı depolama ihtiyacını soyutlamak ve yönetmek için üç temel API objesi sunar: **PersistentVolume (PV)**, **PersistentVolumeClaim (PVC)** ve **StorageClass**. Bu objeler, uygulamaların altta yatan depolama teknolojisinin detaylarını bilmeden depolama talep etmesini ve kullanmasını sağlar, böylece depolama yönetimi Pod yaşam döngüsünden ayrılmış olur.

Temel Depolama Akışı: Pod'dan PV'ye

📦
Uygulama Pod'u
📜
PersistentVolumeClaim (PVC)
💾
PersistentVolume (PV)
💿
Altta Yatan Depolama

Pod, PVC aracılığıyla depolama talep eder, PVC bir PV'ye bağlanır ve PV altta yatan fiziksel depolamayı temsil eder.

1. PersistentVolume (PV)

**PersistentVolume (PV)**, Kubernetes kümesi tarafından sağlanan ve yönetilen, bir küme kaynağı olarak kalıcı depolamanın soyut bir temsilidir. Bir PV, bir küme yöneticisi tarafından manuel olarak (statik provizyonlama) veya bir `StorageClass` aracılığıyla dinamik olarak (dinamik provizyonlama) oluşturulabilir. PV'ler, ağ depolama sistemleri (örneğin NFS, iSCSI, Ceph, AWS EBS, Google Persistent Disk, Azure Disk) gibi altta yatan depolama detaylarını içerir ve bu depolamanın Pod'ların yaşam döngüsünden bağımsız olarak var olmasını sağlar.

Neden ve Ne İşe Yarar?

  • **Kalıcılık:** Pod'lar silindiğinde veya yeniden planlandığında verilerin kaybolmamasını sağlar.
  • **Depolama Soyutlaması:** Geliştiricilerin, altta yatan depolama altyapısının (NFS, cloud disk vb.) karmaşık detaylarını bilmelerine gerek kalmadan depolama talep etmesini sağlar.
  • **Yönetim Ayrımı:** Küme yöneticileri (PV'leri sağlar) ve uygulama geliştiricileri (PVC'leri tüketir) arasında sorumluluk ayrımı yapar.

Özellikleri:

  • **Kapasite:** Depolama boyutu (örneğin 10Gi).
  • **Erişim Modları (`accessModes`):** Depolamanın Pod'lar tarafından nasıl erişilebileceğini tanımlar (örneğin: `ReadWriteOnce` - tek bir düğümden okunabilir/yazılabilir; `ReadOnlyMany` - birden çok düğümden okunabilir; `ReadWriteMany` - birden çok düğümden okunabilir/yazılabilir).
  • **Depolama Sınıfı (`storageClassName`):** PV'nin hangi `StorageClass` ile ilişkili olduğunu belirtir, dinamik provizyonlama için kullanılır.
  • **Geri Dönüşüm Politikası (`reclaimPolicy`):** Bir PV'ye bağlı PVC silindiğinde PV'nin ne olacağını belirler (`Retain` - manuel silme; `Delete` - otomatik silme; `Recycle` - veriyi silip yeniden kullanıma hazırlama - çoğu modern sistemde desteklenmez).

Örnek YAML (Statik Provizyonlama):


apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-nfs-pv
spec:
  capacity:
    storage: 10Gi # 10 Gigabayt depolama alanı
  accessModes:
    - ReadWriteMany # Birden fazla düğümden okunabilir/yazılabilir
  persistentVolumeReclaimPolicy: Retain # PVC silindiğinde PV'yi koru
  storageClassName: manual # Bu PV'nin ait olduğu StorageClass'ı belirt
  nfs: # NFS depolama türü örneği
    path: /mnt/nfs/data
    server: nfs-server.example.com
                

PersistentVolume (PV)

💾
PersistentVolume: my-nfs-pv

Kapasite: 10Gi, Erişim: RWM

💿
Fiziksel NFS Depolama (/mnt/nfs/data)

PV, kümedeki mevcut bir depolama birimini temsil eder.

2. PersistentVolumeClaim (PVC)

**PersistentVolumeClaim (PVC)**, bir kullanıcının veya uygulamanın bir `PersistentVolume (PV)` için yaptığı depolama isteğidir. Bir Pod, doğrudan bir PV'ye bağlanmak yerine bir PVC'ye bağlanır. Bu, geliştiricilerin ihtiyaç duydukları depolama özelliklerini (boyut, erişim modu) tanımlamasını sağlar, ancak altta yatan depolama teknolojisinin detaylarıyla ilgilenmelerini gerektirmez. Kubernetes, PVC'nin özelliklerine uygun bir PV bulmaya veya dinamik olarak oluşturmaya çalışır.

Neden ve Ne İşe Yarar?

  • **Kullanıcı Soyutlaması:** Geliştiricilerin depolama sağlayıcısından bağımsız olarak depolama talep etmesini sağlar.
  • **Bağlama (Binding):** Bir PVC oluşturulduğunda, Kubernetes kontrol düzlemi, bu talebe uyan uygun bir PV bulur ve ona bağlar.
  • **Uygulama Kullanımı:** Pod'lar, `volumeMounts` altında bir PVC'yi referans alarak depolamayı kullanır.

Özellikleri:

  • **Erişim Modları (`accessModes`):** Talep edilen erişim modları (PV ile eşleşmelidir).
  • **Kaynaklar (`resources.requests.storage`):** Talep edilen depolama alanı.
  • **Depolama Sınıfı (`storageClassName`):** Hangi `StorageClass`'tan depolama talep edildiğini belirtir. Bu, dinamik provizyonlama için kritik öneme sahiptir.

Örnek YAML:


apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-app-data-pvc
spec:
  accessModes:
    - ReadWriteOnce # Tek bir düğümden okunabilir/yazılabilir
  resources:
    requests:
      storage: 5Gi # 5 Gigabayt depolama alanı isteği
  storageClassName: standard # Dinamik olarak provision edilecek StorageClass
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: your-app-image:latest
        volumeMounts:
        - name: app-persistent-storage
          mountPath: "/data" # Konteyner içinde verinin bağlanacağı yol
      volumes:
      - name: app-persistent-storage
        persistentVolumeClaim:
          claimName: my-app-data-pvc # Yukarıda tanımlanan PVC'ye referans
                

PersistentVolumeClaim (PVC)

📜
PersistentVolumeClaim: my-app-data-pvc

İstek: 5Gi, Erişim: RWO

↓ Bağlama Talebi
💾
PersistentVolume

Karşılanan PV

PVC, bir Pod'un depolama ihtiyacını bildirmesini sağlar.

3. StorageClass

**StorageClass**, Kubernetes'te dinamik depolama provizyonlamasını (provisioning) sağlayan bir API objesidir. Küme yöneticilerinin, farklı depolama türlerini ve özelliklerini tanımlamasına olanak tanır. Bir PVC bir `StorageClass`'ı referans aldığında, Kubernetes bu sınıfın tanımladığı özelliklere (örneğin performans seviyesi, yedeklilik, depolama sağlayıcısı) göre otomatik olarak bir PV oluşturur ve PVC'ye bağlar. Bu, depolama yönetimini büyük ölçüde basitleştirir ve otomatize eder.

Neden ve Ne İşe Yarar?

  • **Dinamik Provizyonlama:** PV'leri manuel olarak oluşturma ihtiyacını ortadan kaldırır. Bir PVC oluşturulduğunda, uygun `StorageClass` kullanılarak otomatik olarak bir PV oluşturulur.
  • **Depolama Katmanları:** Farklı depolama sınıfları tanımlayarak (örneğin "standart", "premium", "SSD-backed") uygulamaların farklı performans veya maliyet gereksinimlerine göre depolama talep etmesini sağlar.
  • **Yönetici ve Geliştirici Ayrımı:** Yöneticiler depolama sınıflarını tanımlar, geliştiriciler ise bu sınıfları adlarıyla talep eder, böylece altyapı detaylarından soyutlanırlar.

Özellikleri:

  • **Sağlayıcı (`provisioner`):** Hangi depolama sağlayıcısının (örneğin `kubernetes.io/aws-ebs`, `kubernetes.io/gce-pd`, `ceph.com/cephfs`) bu sınıf için depolama provizyonlayacağını belirtir.
  • **Parametreler (`parameters`):** Sağlayıcıya özgü yapılandırma parametreleri (örneğin disk tipi, IOPS).
  • **Geri Dönüşüm Politikası (`reclaimPolicy`):** Bu sınıf tarafından oluşturulan PV'ler için varsayılan geri dönüşüm politikası (`Delete` veya `Retain`).
  • **Erişim Modları (`volumeBindingMode`):** PV'nin ne zaman bağlanacağını kontrol eder (`Immediate` veya `WaitForFirstConsumer`).

Örnek YAML:


apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd # StorageClass'ın adı
provisioner: kubernetes.io/aws-ebs # AWS EBS sağlayıcısını kullan
parameters: # Sağlayıcıya özgü parametreler
  type: gp2 # Genel amaçlı SSD
  fsType: ext4 # Dosya sistemi tipi
reclaimPolicy: Delete # PVC silindiğinde PV'yi otomatik sil
volumeBindingMode: Immediate # PVC oluşturulur oluşturulmaz PV bağla
                

StorageClass ve Dinamik Provizyonlama

📊
StorageClass: fast-ssd

Provizyonlayıcı: AWS EBS, Tip: gp2

↓ Dinamik Provizyonlama İsteği
📜
PersistentVolumeClaim (PVC)

StorageClass: fast-ssd

↓ PV Oluşturma
💾
Yeni PersistentVolume (PV)

Otomatik Oluşturuldu

💿
Yeni AWS EBS Cilt

StorageClass, PVC isteği üzerine otomatik olarak PV oluşturur.

PV, PVC ve StorageClass Birlikte Nasıl Çalışır? (Dinamik Provizyonlama)

Modern Kubernetes kümelerinde depolama, genellikle dinamik provizyonlama kullanılarak yönetilir. Bu süreç, bir geliştiricinin yalnızca depolama ihtiyacını (PVC aracılığıyla) belirtmesi ve Kubernetes'in altta yatan altyapıda otomatik olarak depolama alanı (PV aracılığıyla) oluşturup bunu uygulamaya bağlaması anlamına gelir.

Dinamik Provizyonlama Akışı:

  1. **PVC Oluşturulur:** Bir geliştirici, ihtiyacı olan depolama miktarını ve `storageClassName` alanında tercih edilen `StorageClass`'ı belirterek bir PVC oluşturur.
  2. **PV Controller devreye girer:** Kubernetes'teki PV Controller, yeni oluşturulan PVC'yi izler.
  3. **Depolama Provizyonlayıcısı tetiklenir:** PVC'de belirtilen `StorageClass`'a karşılık gelen depolama provizyonlayıcısı (örneğin AWS EBS provizyonlayıcısı), bu PVC için depolama alanı oluşturmak üzere tetiklenir.
  4. **PV Oluşturulur:** Provizyonlayıcı, altta yatan depolama sisteminde (örneğin AWS EBS'te yeni bir cilt) gerekli depolama alanını oluşturur. Daha sonra bu depolama alanını temsil eden bir PV objesi oluşturulur.
  5. **PVC, PV'ye Bağlanır:** Yeni oluşturulan PV, özelliklerine (boyut, erişim modu, `storageClassName`) göre uygun PVC ile eşleşir ve ona bağlanır.
  6. **Pod, PVC'yi Kullanır:** Geliştirici, uygulamanın Pod'unda bu PVC'yi bir birim olarak referans alır. Pod, zamanlandığında, Kubernetes bu birimi düğümdeki uygun bağlantı noktasına bağlar ve konteynerler depolamayı kullanmaya başlayabilir.
  7. **Temizleme (Opsiyonel):** PVC silindiğinde, `StorageClass`'taki `reclaimPolicy`'ye bağlı olarak, ilgili PV de otomatik olarak silinebilir ve altta yatan fiziksel depolama alanı serbest bırakılır.

Dinamik Provizyonlama Akışı

📦
Uygulama Pod'u
① Depolama İsteği
📜
PersistentVolumeClaim

(StorageClass: premium)

② PV Oluşturma Talebi
📊
StorageClass (premium)
③ Depolama Provizyonlama
💾
PersistentVolume (Yeni)
④ Bağlama ve Kullanım
💿
Cloud Disk / NFS / Ceph

PVC, StorageClass aracılığıyla dinamik olarak bir PV'nin provision edilmesini tetikler ve Pod bunu kullanır.

PV, PVC ve StorageClass Karşılaştırması

Bu üç Kubernetes objesi, kalıcı depolama yönetiminde farklı roller üstlenir ve birbirlerini tamamlarlar.

Özellik PersistentVolume (PV) PersistentVolumeClaim (PVC) StorageClass
**Tanım** Küme tarafından sağlanan somut bir depolama birimi. Bir kullanıcının depolama birimi için yaptığı talep. Dinamik provizyonlama için depolama özelliklerinin ve davranışlarının tanımı.
**Rol** Depolama sağlayıcısından sağlanan gerçek depolamayı temsil eder. Küme kaynağıdır. Uygulama Pod'ları tarafından depolama istemek için kullanılır. Namespace kaynaklıdır. Depolama katmanlarını tanımlar ve PVC talepleri üzerine PV'leri dinamik olarak oluşturur. Küme kaynağıdır.
**Yöneten** Küme Yöneticisi (statik provizyonlama) veya Kubernetes Kontrol Düzlemi (dinamik provizyonlama). Uygulama Geliştiricisi / Kullanıcı. Küme Yöneticisi.
**Yaşam Döngüsü** Pod'lardan bağımsızdır. PVC silinse bile `reclaimPolicy`'ye göre kalabilir. Pod'lar tarafından tüketilir. Pod'a bağlıdır ve Pod'dan ayrı olarak silinebilir. Küme var olduğu sürece var olur, dinamik provizyonlama davranışını tanımlar.
**Örnek Kullanım** NFS paylaşımını, AWS EBS diskini, GCP Persistent Disk'i tanımlar. "5Gi'lik standart depolama alanı istiyorum" veya "premium SSD istiyorum" talebi. "standart" (HDD), "fast-ssd" (SSD), "backup" (düşük maliyetli) gibi sınıfları tanımlar.

Sonuç

Kubernetes'te kalıcı depolama yönetimi, `PersistentVolume (PV)`, `PersistentVolumeClaim (PVC)` ve `StorageClass` objelerinin uyumlu çalışmasıyla sağlanır. Bu soyutlamalar, geliştiricilerin altta yatan karmaşık depolama altyapısı detaylarından bağımsız olarak depolama talep etmelerine olanak tanırken, yöneticilere depolama kaynaklarını merkezi ve verimli bir şekilde sağlama ve yönetme gücü verir. Özellikle `StorageClass` ile dinamik provizyonlama, Kubernetes'in bulut tabanlı ortamlardaki gücünü artırarak depolama yönetimini büyük ölçüde otomatikleştirir ve operasyonel yükü azaltır. Bu kavramları anlamak ve doğru bir şekilde yapılandırmak, durum bilgisi olan Kubernetes uygulamalarını güvenilir ve ölçeklenebilir bir şekilde dağıtmak için temel bir adımdır.