Kubernetes Volume Snapshots 详解
在Kubernetes中,Volume Snapshots(卷快照) 是一项关键的存储功能,用于创建持久卷(PV)的时间点副本。这一特性通过CSI(容器存储接口) 实现,并引入了一组新的API资源来管理快照生命周期。本文将详细讲解Kubernetes中的Volume Snapshots相关概念、工作原理及使用方法。
一、核心概念与API资源
1. 卷快照相关资源
Kubernetes通过以下CRD(自定义资源定义)管理卷快照:
① VolumeSnapshotClass
类似于StorageClass
,定义了创建快照的存储后端配置 和删除策略。
yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-snapshot-class
driver: ebs.csi.aws.com # CSI驱动名称
deletionPolicy: Delete # 当Snapshot删除时,后端快照也删除
parameters:
# 特定于驱动的参数(如备份位置、加密等)
② VolumeSnapshot
用户创建的快照请求,指向一个现有的PVC(PersistentVolumeClaim)。
yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-pvc-snapshot
spec:
volumeSnapshotClassName: csi-snapshot-class
source:
persistentVolumeClaimName: my-pvc # 要快照的PVC名称
③ VolumeSnapshotContent
由系统自动创建的实际快照内容,类似于PV与PVC的关系。
yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: snapcontent-xyz
spec:
volumeSnapshotClassName: csi-snapshot-class
volumeSnapshotRef:
name: my-pvc-snapshot # 关联的VolumeSnapshot
namespace: default
source:
snapshotHandle: aws://us-west-2/snap-12345 # 存储后端的快照ID
status:
readyToUse: true
restoreSize: 10Gi
2. CSI 与卷快照
-
CSI(容器存储接口):是Kubernetes与存储系统的标准接口,支持快照功能的CSI驱动需实现以下接口:
CreateSnapshot
:创建卷快照DeleteSnapshot
:删除卷快照ListSnapshots
:列出快照DescribeSnapshot
:获取快照信息
-
必备组件:
- CSI Driver:如AWS EBS CSI Driver、Ceph CSI等
- external-snapshotter :Kubernetes官方提供的Sidecar组件,监听
VolumeSnapshot
资源并调用CSI驱动的快照接口
二、卷快照工作流程
1. 创建快照流程
sequenceDiagram
participant 用户
participant API Server
participant VolumeSnapshotController
participant CSI external-snapshotter
participant CSI Driver
participant 存储后端
用户->>API Server: 创建VolumeSnapshot资源
API Server->>VolumeSnapshotController: 触发控制器
VolumeSnapshotController->>CSI external-snapshotter: 调用CreateSnapshot
CSI external-snapshotter->>CSI Driver: gRPC请求CreateSnapshot
CSI Driver->>存储后端: 创建实际快照
存储后端-->>CSI Driver: 返回快照ID
CSI Driver-->>CSI external-snapshotter: 返回成功
CSI external-snapshotter->>API Server: 创建VolumeSnapshotContent
API Server->>VolumeSnapshot: 更新状态为Ready
2. 从快照恢复卷流程
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restored-pvc
spec:
storageClassName: ebs-sc
dataSource: # 从快照恢复
name: my-pvc-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
三、关键功能与应用场景
1. 备份与恢复
- 自动化备份:结合CronJob定期创建VolumeSnapshot
- 灾难恢复 :通过
dataSource
字段从快照恢复PVC
yaml
spec:
dataSource:
name: my-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
2. 测试与开发
- 克隆生产数据:基于生产环境的卷快照创建测试环境
- 版本回滚:应用升级失败时恢复到之前的状态
3. 数据迁移
- 跨集群迁移:将快照复制到目标集群并恢复
- 存储类型转换:例如从AWS EBS迁移到GCE PD
四、配置与使用示例
1. 启用卷快照功能
-
安装Snapshot CRDs:
bashkubectl apply -f https://github.com/kubernetes-csi/external-snapshotter/raw/v6.2.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml kubectl apply -f https://github.com/kubernetes-csi/external-snapshotter/raw/v6.2.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml kubectl apply -f https://github.com/kubernetes-csi/external-snapshotter/raw/v6.2.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
-
部署external-snapshotter:
bashkubectl apply -f https://github.com/kubernetes-csi/external-snapshotter/raw/v6.2.1/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml kubectl apply -f https://github.com/kubernetes-csi/external-snapshotter/raw/v6.2.1/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
-
配置支持快照的CSI驱动(以AWS EBS为例):
bashhelm install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \ --namespace kube-system \ --set enableVolumeScheduling=true \ --set enableVolumeResizing=true \ --set enableVolumeSnapshot=true
2. 创建快照示例
-
定义VolumeSnapshotClass:
yamlapiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: ebs-snapshot-class driver: ebs.csi.aws.com deletionPolicy: Retain # 保留后端快照
-
创建VolumeSnapshot:
yamlapiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-ebs-snapshot spec: volumeSnapshotClassName: ebs-snapshot-class source: persistentVolumeClaimName: my-ebs-pvc
-
验证快照状态:
bashkubectl get volumesnapshot my-ebs-snapshot kubectl get volumesnapshotcontent
3. 从快照恢复PVC
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restored-pvc
spec:
storageClassName: ebs-sc
dataSource:
name: my-ebs-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi