Kubernetes PVC Unused Condition ile Atıl Volume Tespiti
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,
Unusedcondition’ıTrueolan 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.
SucceededveyaFailedfazındaki bir pod PVC’yi kullanımda göstermeye devam etmiyor, yanirestartPolicy: Neverile çalışan batch işleri tamamlandıktan sonra PVC’ninUnused=Trueolması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=Truedurumuna 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
- Kubernetes v1.37: Tracking When a PersistentVolumeClaim Was Last Used (Beta)
- PersistentVolumeClaim API referansı
- Persistent Volumes dokümantasyonu
- KEP-5541: PersistentVolumeClaim last used time
- kubernetes/kubernetes deposu
- SIG Storage ve #sig-storage Slack kanalı (davet için slack.k8s.io)
- jq komut satırı JSON işleyicisi
- Kubernetes v1.37 Memory QoS Beta: Ne Değişti?
- Kubernetes v1.37’de Rootless Mod Beta Aşamasına Geldi







Yorum gönder