平台與維運 2026 年 9 月 22 日

2026-09-22 — v1.37:PVC 加入 Unused 條件揪出閒置儲存卷

primary=https://kubernetes.io/blog/2026/09/21/kubernetes-v1-37-pvc-last-used-time/

v1.37:PVC 加入 Unused 條件揪出閒置儲存卷

Kubernetes Blog · 2026-09-21

PVC 保護控制器現在會替每一顆 PersistentVolumeClaim 的 status 加上一個 Unused condition,讓維運者不用再自己比對 Pod 與 PVC 的關聯,就能直接看出一顆儲存卷是不是沒人在用。這項功能在 v1.37 從 Alpha 進入 Beta,並且改成預設啟用。

背景

大型叢集裡,使用者建立 PVC 後只刪掉 Pod、卻沒回頭清掉儲存卷,是很常見的操作習慣,Kubernetes 本身也刻意不在 Pod 消失時自動砍掉 PVC,以避免誤刪資料。問題是,這些留下來的 PVC 會不聲不響地占用容量、持續墊高雲端費用。在這個功能出現之前,判斷一顆 PV 是否閒置很容易,但要判斷一顆 PVC 是否還有人用,得自己跨資源比對 Pod、PV、PVC 三者,還得盯著一段可能很長的時間窗,最後往往得靠自建監控腳本,才能回答「這顆儲存卷到底還有沒有人在用」這種看似簡單的問題。

核心改動

Kubernetes v1.36 先以 Alpha 形式導入 PersistentVolumeClaimUnusedSinceTime 這個 feature gate,當時得手動開啟;v1.37 把它推進 Beta,改成預設啟用,並補齊了完整的端對端測試覆蓋。啟用後,PVC 保護控制器會在每顆 PVC 的 status 裡維護 Unused 這個 condition:只要沒有任何非終止狀態的 Pod 引用它,condition 就標成 Unused=True,reason 為 NoPodsUsingPVC;只要還有一個 running 或 pending 的 Pod 在用,就是 Unused=False,reason 為 PodUsingPVC

已經跑完(狀態為 SucceededFailed)的 Pod 不算數,所以 restartPolicy: Never 的批次工作結束後,PVC 依然會被標成閒置;反過來,就算 Pod 因排程限制卡在 Pending,只要有掛載意圖,condition 仍會維持 Unused=False。多個 Pod 共用同一顆 PVC 時,要等到最後一個非終止 Pod 消失,condition 才會翻回 Unused=True

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

因為 Unused 跟其他標準 condition 一樣帶有 lastTransitionTime 欄位,狀態從 False 翻回 True 的那一刻就會被記下來,這正是「追蹤最後使用時間」的關鍵:不需要額外欄位,看 lastTransitionTime 就能算出一顆 PVC 已經閒置多久。

影響範圍

這對所有要清理孤兒 PVC、控管儲存成本的叢集維運團隊都直接有用:叢集升級到 v1.37 之後,PersistentVolumeClaimUnusedSinceTime 已經預設開啟,不用再手動加 feature gate,唯一要做的是去查現有 PVC 的 status.conditions 裡有沒有出現 Unused。要盤點全叢集閒置超過 30 天的 PVC,可以直接用 kubectl 搭配 jq 撈出所有 Unused=TruelastTransitionTime 超過門檻的物件,不用再自己寫跨資源比對的腳本。

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)
    )
'

這個機制目前仍是 Beta,社群會依回饋規劃在未來版本推向 GA,設計細節記錄在 KEP-5541 裡。維運團隊現在可以把「找出沒人用的 PVC」直接寫進既有的清理流程或告警規則,不必再維護額外的跨資源比對工具,也能降低因為漏刪而持續被雲端供應商收費的風險。

原始來源:Kubernetes Blog - Kubernetes v1.37: Tracking When a PersistentVolumeClaim Was Last Used (Beta)


End of article
0
Would love your thoughts, please comment.x
()
x