Appearance
Kubernetes VolumeSnapshot 磁碟快照
對 PersistentVolumeClaim 建立時間點快照,並在需要時從快照還原為新 PVC 的三步驟 SOP。
概述
VolumeSnapshot 是 Kubernetes 的儲存快照 API(snapshot.storage.k8s.io/v1),允許在不停止服務的情況下對 PVC 建立時間點快照(point-in-time snapshot),並在需要時從快照還原為新的 PVC。這對資料備份、災難復原、測試環境複製等場景非常實用。
VolumeSnapshot 需要底層儲存驅動(CSI Driver)支援快照功能。在 Azure 上,僅 Disk 類型的儲存(Azure Disk CSI Driver,containerstorage.csi.azure.com)支援 VolumeSnapshot;Azure File 不支援。在自建叢集上,Ceph、OpenEBS 等 CSI Driver 也各有其支援狀況。
整個流程分為三步:建立 VolumeSnapshotClass → 對 PVC 建立快照 → 從快照還原新 PVC。
核心內容
步驟一:建立 VolumeSnapshotClass
VolumeSnapshotClass 定義「用哪個 CSI Driver 建立快照」以及快照的刪除策略,類似 StorageClass 的角色:
yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-acstor-vsc
driver: containerstorage.csi.azure.com
deletionPolicy: Delete
parameters:
incremental: "true" # Azure Public Cloud 預設 "true";Azure Stack Cloud 預設 "false"driver:指定 Azure Container Storage CSI DriverdeletionPolicy: Delete:刪除 VolumeSnapshot 時一併刪除底層快照資源incremental: "true":使用增量快照,只儲存上次快照後的變更部分(Azure Public Cloud 預設值)
VolumeSnapshotClass 通常由叢集管理員建立一次,後續所有快照都可共用。
步驟二:建立 VolumeSnapshot
對指定 PVC 建立快照:
yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: azuredisk-volume-snapshot
spec:
volumeSnapshotClassName: csi-acstor-vsc
source:
persistentVolumeClaimName: azurediskpvcvolumeSnapshotClassName:引用步驟一建立的 VolumeSnapshotClasssource.persistentVolumeClaimName:指定要快照的 PVC 名稱
套用後,CSI Driver 會開始建立快照。可以透過以下指令確認快照是否就緒:
bash
kubectl get volumesnapshot
# READYTOUSE 欄位為 true 即表示快照完成步驟三:從快照還原 PVC
建立一個以快照為資料來源的新 PVC。通常需要先刪除或停用原本掛載舊 PVC 的 Pod,再套用以下 YAML:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-azuredisk-snapshot-restored
spec:
accessModes:
- ReadWriteOnce
storageClassName: acstor-azuredisk
resources:
requests:
storage: 100Gi
dataSource:
name: azuredisk-volume-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.iodataSource.name:指向步驟二建立的 VolumeSnapshot 名稱dataSource.kind: VolumeSnapshot:告知 K8s 這是從快照還原storage: 100Gi:新 PVC 的大小,必須 ≥ 原 PVC 大小
還原完成後,將服務重新掛載此新 PVC 並重啟即可。
關鍵要點
- Azure 上僅 Disk 類型 CSI Driver 支援 VolumeSnapshot;Azure File 不支援
incremental: "true"可節省快照儲存空間,是 Azure Public Cloud 的預設值- 快照建立後需等
READYTOUSE: true才能用於還原 - 從快照還原的新 PVC 大小必須 ≥ 原 PVC 大小
- 刪除 VolumeSnapshot 前需確認不再需要還原,
deletionPolicy: Delete會一併清除底層快照
實際應用
資料庫備份前快照: 在 MariaDB 或 PostgreSQL 做 schema 變更或資料遷移前,先對資料目錄 PVC 建立快照,變更失敗時可快速還原,比等待資料庫層級的備份還原更快。
複製測試環境: 從生產環境 PVC 建立快照,再從快照還原出新 PVC 供測試環境掛載,複製一份生產資料到測試叢集用於驗證。
部署設定參考
以下為實際使用的完整設定,供日後查詢與複製使用。
完整設定檔 / YAML
VolumeSnapshotClass(一次性建立):
yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-acstor-vsc
driver: containerstorage.csi.azure.com
deletionPolicy: Delete
parameters:
incremental: "true"建立快照:
yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: azuredisk-volume-snapshot
spec:
volumeSnapshotClassName: csi-acstor-vsc
source:
persistentVolumeClaimName: azurediskpvc從快照還原 PVC:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-azuredisk-snapshot-restored
spec:
accessModes:
- ReadWriteOnce
storageClassName: acstor-azuredisk
resources:
requests:
storage: 100Gi
dataSource:
name: azuredisk-volume-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io操作指令
bash
# 查看快照狀態(確認 READYTOUSE = true)
kubectl get volumesnapshot
# 查看快照詳細資訊
kubectl describe volumesnapshot azuredisk-volume-snapshot
# 刪除快照
kubectl delete volumesnapshot azuredisk-volume-snapshot相關概念
- Kubernetes 維運技巧速查 — 其他 PVC 相關技巧(fsGroup、emptyDir 等)
- MariaDB 遷移(Bitnami Galera → 官方 StatefulSet) — 資料庫遷移中 VolumeSnapshot 的應用
- Kubernetes RBAC 帳號管理 — 叢集儲存資源的存取控制