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
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)
Kapasite: 10Gi, Erişim: RWM
↓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)
İstek: 5Gi, Erişim: RWO
↓ Bağlama TalebiKarşı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
Provizyonlayıcı: AWS EBS, Tip: gp2
StorageClass: fast-ssd
Otomatik Oluşturuldu
↓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ışı:
- **PVC Oluşturulur:** Bir geliştirici, ihtiyacı olan depolama miktarını ve `storageClassName` alanında tercih edilen `StorageClass`'ı belirterek bir PVC oluşturur.
- **PV Controller devreye girer:** Kubernetes'teki PV Controller, yeni oluşturulan PVC'yi izler.
- **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.
- **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.
- **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.
- **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.
- **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ışı
(StorageClass: premium)
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.