Skip to content

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 Driver
  • deletionPolicy: 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: azurediskpvc
  • volumeSnapshotClassName:引用步驟一建立的 VolumeSnapshotClass
  • source.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.io
  • dataSource.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

相關概念

來源