#作者:閆乾苓
文章目錄
- 一、問題背景
- 二、實際行為
- 三、源碼分析
- 四、分析與推論
- 五、期望行為與建議優化
- 六、結論
一、問題背景
在生產環境中,為避免因誤操作導致的永久數據丟失,Ceph RBD 提供了 Trash 功能,允許將鏡像“軟刪除”至回收站,再手動恢復或延遲清理。
Kubernetes 集群中通過 Ceph-CSI 插件動態創建 RBD PVC 時,預期在刪除 PVC 后,后端 RBD 鏡像應移動到 Trash 而非直接刪除。為此,系統設置了如下配置:
ceph config set client.rbd rbd_move_to_trash_on_remove true
并確認所有相關 Ceph 客戶端配置已生效:
ceph config dump | grep rbd_move_to_trash_on_remove
client.csi-rbd-node basic rbd_move_to_trash_on_remove true
client.csi-rbd-provisioner basic rbd_move_to_trash_on_remove true
client.rbd basic rbd_move_to_trash_on_remove true
二、實際行為
經多次測試與日志分析發現,即便 rbd_move_to_trash_on_remove=true 已生效,在執行 PVC 刪除操作后:
- 對應的 RBD 鏡像會短暫進入 Trash;
- 隨即被立即永久刪除;
- 最終在 Ceph 后端無法找到該鏡像,無任何 Trash 留存記錄。
該行為顯著違背了 Trash 設計初衷,可能對數據安全構成嚴重隱患。
三、源碼分析
CSI RBD 插件刪除流程路徑(基于 ceph-csi v3.9.x+):
文件:internal/rbd/rbd_util.go
調用棧概覽:
DeleteImage()
└── deleteImage()├── rbdImage.Trash(0) // 行號約為 699,將鏡像移動到 trash└── trashRemoveImage(...) // 行號約為 710,立即從 trash 中刪除
關鍵代碼片段解析:
// 1. 將鏡像移動到 Trash
err = rbdImage.Trash(0) // 調用 librbd C API: rbd_trash_move
if err != nil {return err
}// 2. 立即清理 Trash 中的鏡像
err = trashRemoveImage(...)
即,CSI 插件顯式繞過了配置項 rbd_move_to_trash_on_remove 所定義的軟刪除行為,而是先主動調用 rbd_trash_move(),再調用 rbd_trash_remove() 徹底刪除鏡像。
這種行為導致:
- 用戶即使啟用了 Trash 機制,也無法避免 PVC 刪除后數據永久丟失;
- rbd rm 未被調用,但實現效果等同于 rbd rm。
四、分析與推論
- 為何不直接調用 rbd rm?
可能出于以下設計意圖:
?保證鏡像結構一致性(先 trash 再刪邏輯清晰);
?利于插入延遲刪除(如后續引入保留時間);
?與 Ceph API 接口保持兼容性。 - 為何默認行為是立即刪除 Trash 中鏡像?
源代碼中并未根據配置 rbd_move_to_trash_on_remove 判斷是否保留 Trash 中的鏡像,這導致 Trash 機制在 CSI 插件中形同虛設。
五、期望行為與建議優化
- 理想行為
當設置 rbd_move_to_trash_on_remove=true 時:
- Ceph-CSI 刪除鏡像應遵循客戶端配置;
- 鏡像應進入 Trash 并保留,供后續手動恢復或延遲清理;
- 用戶可通過 rbd trash list 查詢已刪除鏡像。
- 推薦優化方向
- Ceph-CSI 插件層
在 deleteImage() 中增加配置判斷邏輯,按需 skip trashRemoveImage() 調用:
if rbd_move_to_trash_on_remove_enabled {// Only move to trash, do not removereturn nil
}
- 文檔更新
明確說明當前 CSI 插件會直接刪除鏡像,不受 rbd_move_to_trash_on_remove 控制。 - 提供 CSI 參數控制
增加如 retainDeletedRBDImages: true 的 StorageClass 參數,使用戶可控制 Trash 保留行為。
六、結論
Ceph CSI 插件當前刪除 RBD 鏡像的實現方式存在與用戶預期不符的問題:
- 明顯忽略了 Ceph 客戶端配置 rbd_move_to_trash_on_remove;
- 盡管鏡像短暫進入 Trash,仍立即被永久刪除;
- 可能造成誤刪數據無法恢復,存在嚴重數據安全隱患。