Kubernetes Volume Snapshots
KubernetesのVolume Snapshot機能は、PersistentVolume (PV) の特定時点の状態を保存するための標準的な方法を提供します。これにより、データベースのバックアップや開発環境へのデータ複製などが容易になります。
概要
Volume Snapshotは、ストレージシステム上のボリュームのコピーを作成する機能です。Kubernetes v1.20でGA(一般利用可能)となりました。CSI (Container Storage Interface) ドライバーがスナップショット機能をサポートしている場合に使用できます。Azure Disk や Azure Files などのAzureストレージサービスもCSIドライバーを通じてこの機能をサポートしています。
主なユースケース
-
バックアップとリストア:
- データベースやアプリケーションのデータを定期的に保護します。
- 障害発生時やデータ破損時に、特定のスナップショットからボリュームを復元できます。
-
データの複製(クローニング):
- 本番環境のデータを開発・テスト環境にコピーして、トラブルシューティングや新機能のテストを行います。
- 大規模なデータセットの分析用に複製を作成します。
-
アプリケーションの移行:
- あるクラスタから別のクラスタへデータを移動する際の中間ステップとして利用できます(ただし、スナップショット自体の移動には追加の手順やツールが必要な場合があります)。
アーキテクチャと主要リソース
Volume Snapshot機能は、以下の3つの主要なAPIリソースで構成されています。
1. VolumeSnapshotClass
StorageClassと同様に、スナップショットを作成するためのパラメータやドライバーを指定するクラスタレベルのリソースです。管理者が定義します。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-azuredisk-vsc
driver: disk.csi.azure.com
deletionPolicy: Delete
parameters:
incremental: "true" # Azure Disk固有のパラメータ例
2. VolumeSnapshot
ユーザーがスナップショットの作成を要求するために作成するNamespacedリソースです。どのPersistentVolumeClaim (PVC) のスナップショットを取得するかを指定します。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-snapshot
namespace: default
spec:
volumeSnapshotClassName: csi-azuredisk-vsc
source:
persistentVolumeClaimName: my-pvc
3. VolumeSnapshotContent
実際のストレージシステム上のスナップショットを表すクラスタレベルのリソースです。PVとPVCの関係と同様に、VolumeSnapshotとVolumeSnapshotContentはバインドされます。通常は動的にプロビジョニングされます。
実装例:スナップショットからのリストア
スナップショットから新しいPVCを作成(リストア)するには、PVCの定義で dataSource フィールドを使用します。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pvc
namespace: default
spec:
storageClassName: managed-csi
dataSource:
name: my-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
ベストプラクティス
-
アプリケーションの静止点確保 (Quiescing):
- ファイルシステムレベルのスナップショットは「クラッシュ整合性」しか保証しない場合があります。データベースなどでは、スナップショット取得前にメモリ上のデータをディスクにフラッシュし、書き込みを一時停止(フリーズ)することで「アプリケーション整合性」を確保することが推奨されます。
- Hooksやツール(例: Velero)を使用して、スナップショット前後の処理を自動化しましょう。
-
DeletionPolicyの適切な設定:
VolumeSnapshotClassのdeletionPolicyをDeleteにすると、Kubernetes上のVolumeSnapshotオブジェクト削除時にストレージ上のスナップショットも削除されます。- 重要なバックアップの場合は
Retainを検討し、誤削除を防ぐ運用を設計します。
-
定期的なバックアップ運用:
- 手動での作成だけでなく、CronJobやバックアップツール(Velero, Kasten K10など)を導入して、定期的なスナップショット取得と世代管理を自動化します。
-
リージョン/ゾーン冗長性の考慮:
- Azure Diskのスナップショットは、作成元のディスクと同じリージョンに保存されます。災害対策(DR)を考慮する場合、スナップショットを別のリージョンにコピーする仕組み(Azure Backupなど)との併用を検討してください。
注意点
- CSIドライバーの要件: 使用しているKubernetesクラスタとストレージのCSIドライバーがVolume Snapshot機能をサポートしている必要があります。
- 容量とコスト: スナップショットはストレージ容量を消費します。特に差分スナップショットでない場合や、変更頻度が高い場合はコストに注意が必要です。不要になったスナップショットは定期的に削除しましょう。