Kubernetes PVC Unused Condition ile Atıl Volume Tespiti

Kubernetes v1.37 ile PVC’lerde Unused condition’ı otomatik olarak ekleniyor ve pod referansı yoksa PVC status’unda doğrudan True görünüyor. Böylece atıl (orphaned) volume’lar ek izleme/script olmadan tespit edilebiliyor.

Kubernetes v1.37 ile PersistentVolumeClaimUnusedSinceTime özellik kapısı (feature gate) Beta aşamasına geçti ve varsayılan olarak açık geliyor. Artık PersistentVolumeClaim (PVC) koruma denetleyicisi her PVC’ye Unused adında bir condition ekliyor. “Bu volume’u gerçekten kullanan bir pod var mı?” sorusunun yanıtı da ek bir izleme hattı ya da özel script gerekmeden doğrudan PVC’nin status alanında duruyor.

Neden PVC kullanımını izlemek gerekiyor?

Pod silindiğinde Kubernetes ona bağlı PVC’yi otomatik olarak silmez. Kasıtlı bir davranış bu, amacı veri kaybını önlemek. Ama büyük ölçekli kümelerde kullanıcılar PVC oluşturup ilgili pod’ları sildikçe geride sahipsiz kalmış (orphaned) PVC’ler birikiyor, bu volume’lar sessiz sedasız depolama kapasitesi tüketmeye ve bulut maliyetlerini artırmaya devam ediyor.

Kubernetes v1.37 öncesinde kullanılmayan bir PersistentVolume’u tespit etmek görece kolaydı, zor olan bir PVC’nin hala kullanımda olup olmadığını anlamaktı. Bunun için pod’ları, PersistentVolume’ları ve PVC’leri geniş bir zaman aralığında çapraz karşılaştırmak gerekiyordu. Yöneticiler basit görünen bu soruyu yanıtlamak için çoğu zaman özel izleme boru hatları veya script’ler kuruyordu.

Kaynakta iki tipik kullanım senaryosu öne çıkıyor:

  • Depolama yöneticisi, hiçbir pod tarafından kullanılmayan PVC’leri görüp sahipsiz volume’ları güvenle tespit ediyor ve silme planına alıyor.
  • DevOps mühendisi, Unused condition’ı True olan PVC’leri listeleyip geliştirme ortamlarında temizliği otomatikleştiriyor.

Unused condition nasıl çalışıyor?

PVC koruma denetleyicisi pod’ları zaten izliyordu; “storage object in use protection” mekanizması bunun için var. Aynı denetleyici artık PVC üzerindeki Unused condition’ını da yönetiyor. Durum mantığı şöyle:

Senaryo Condition durumu Reason
PVC’ye referans veren terminal olmayan pod yok Unused=True NoPodsUsingPVC
En az bir çalışan veya beklemedeki pod PVC’ye referans veriyor Unused=False PodUsingPVC

Davranışın ayrıntılarında dikkat edilecek birkaç nokta var:

  • Sonlanmış pod’lar sayılmıyor. Succeeded veya Failed fazındaki bir pod PVC’yi kullanımda göstermeye devam etmiyor, yani restartPolicy: Never ile çalışan batch işleri tamamlandıktan sonra PVC’nin Unused=True olmasını engellemiyor.
  • Pending pod’lar sayılıyor. Karşılanması imkansız bir node selector yüzünden zamanlanamayan bir pod bile PVC’yi kullanıyor kabul ediliyor, volume’u kullanma niyeti yeterli.
  • Aynı PVC’ye birden çok pod referans veriyorsa condition, sonlanmamış son pod kaldırılana veya sonlanana kadar Unused=True durumuna geçmiyor.

lastTransitionTime ile boşta kalma süresini ölçmek

Diğer Kubernetes condition’ları gibi Unused da standart lastTransitionTime alanını taşıyor. Condition False‘tan True‘ya geçtiğinde bu alan, PVC’nin tam olarak ne zaman atıl hale geldiğini kaydediyor. “Bu PVC ne kadar süredir kullanılmıyor?” sorusunu böylece ek bir veri kaynağına başvurmadan yanıtlayabiliyorsunuz.

Alpha’dan Beta’ya ne değişti?

Özellik Kubernetes v1.36’da Alpha olarak tanıtılmıştı, PersistentVolumeClaimUnusedSinceTime feature gate’ini açıkça etkinleştirmek gerekiyordu. v1.37’deki Beta aşamasında feature gate varsayılan olarak açık geliyor, özellik de tam uçtan uca test kapsamına sahip.

Kullanım: adım adım doğrulama

Özellik v1.37’de varsayılan etkin olduğundan Unused condition’ı PVC’lerde kendiliğinden görünüyor. Önce bir PVC oluşturun:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

Kısa bir süre sonra PVC condition’larını inceleyin:

kubectl get pvc my-data -o jsonpath='{.status.conditions[*]}' | jq.

Çıktıda durumu True, reason değeri NoPodsUsingPVC olan bir Unused condition görmelisiniz:

{
"lastProbeTime": null,
"lastTransitionTime": "2026-09-14T12:03:11Z",
"message": "No pods are currently referencing this PVC",
"reason": "NoPodsUsingPVC",
"status": "True",
"type": "Unused"
}

Ardından bu PVC’yi kullanan bir pod oluşturun:

apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: my-data

Condition’ı tekrar kontrol ettiğinizde Unused=False görmelisiniz:

kubectl get pvc my-data -o jsonpath='{.status.conditions[?(@.type=="Unused")].status}'

Çıktı: False

Pod’u silin, condition’ın yeniden Unused=True durumuna dönmesini bekleyin:

kubectl delete pod my-app
kubectl get pvc my-data -o jsonpath='{.status.conditions[?(@.type=="Unused")]}'

Condition yeniden NoPodsUsingPVC reason’ı ile Unused=True göstermeli.

Küme genelinde atıl PVC’leri bulmak

30 günden uzun süredir kullanılmayan tüm PVC’leri listelemek için aşağıdaki komutu kullanabilirsiniz. Komut, JSON işleme için jq aracına dayanıyor:

kubectl get pvc -A -o json | jq -r '
.items[]
| select(.status.conditions[]? | select(.type=="Unused" and.status=="True"))
| select(
(.status.conditions[] | select(.type=="Unused") |.lastTransitionTime) as $t
| (now - ($t | fromdateiso8601)) > (30 * 86400)
)
| "\(.metadata.namespace)/\(.metadata.name) unused since \(.status.conditions[] | select(.type=="Unused") |.lastTransitionTime)"
'

Sırada ne var?

Kubernetes projesi, geri bildirim ve benimsenme oranına bağlı olarak özelliği ileriki bir sürümde Genel Kullanıma (GA) taşımayı hedefliyor. Geri bildirimlerinizi kubernetes/kubernetes deposunda issue açarak iletebilirsiniz, tasarım ayrıntıları için de KEP-5541 belgesi referans alınabilir.

Özelliğin tasarım ve uygulamasına katkı veren isimler (alfabetik sırayla): Arvind Parekh (ArvindParekh), Hemant Kumar (gnufied), Jan Šafránek (jsafrane), Kevin Hannon (kannon92), Roman Bednář (RomanBednar). Katkı vermek isteyenler SIG Storage üzerinden topluluğa katılabilir, geri bildirim için genel Slack kanalı da kullanılabiliyor.

Kaynaklar ve İleri Okuma

Bu yazı yapay zeka (büyük dil modelleri) ile hazırlanmış, insan editör tarafından incelenmiştir. İçerik üretim sürecimiz.
Aşkın KILIÇ

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için YouTube ve GitHub hesaplarımı takip edin.

Haftalık Bülten

Her pazar özenle seçilmiş teknoloji yazıları doğrudan e-postanıza gelsin.

2 Yorum

  1. Sonunda bu iş için ayrı script yazmaktan kurtuluyoruz. Cluster’da kimin kullandığı belli olmayan PVC’leri temizlemek hep dertti, özellikle storage maliyeti artınca. v1.37’ye geçince ilk deneyeceğim şeylerden biri bu olacak.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

✉

Haftalık Bülten

Azure, DevOps ve Yapay Zeka dünyasındaki en güncel içerikleri her hafta doğrudan e-postanıza alın.

Spam yok. İstediğiniz zaman iptal edebilirsiniz.
📱
Uygulamayı Yükle Ana ekrana ekle, çevrimdışı oku
Kategoriler
Ara
Paylaş
WhatsApp
İçindekiler
← SQL Server datetime2 ve dateti...
Foundry Hosted Agents’ta... →
📩

Gitmeden önce!

Her pazar özenle seçilmiş teknoloji yazıları ve AI haberleri doğrudan e-postanıza gelsin. Ücretsiz, spam yok.

🔒 Bilgileriniz güvende. İstediğiniz zaman ayrılabilirsiniz.

📬 Haftalık bülten: Teknoloji + AI haberleri
Beni Takip Et Yeni Azure / AI / DevOps yazılarını GitHub ve RSS üzerinden takip edin.