2026世界杯_2004年世界杯 - 1606811.com

首页 > 击剑世界杯 > k8s之Snapshots 详解

k8s之Snapshots 详解

Kubernetes Volume Snapshots 详解

在Kubernetes中,Volume Snapshots(卷快照) 是一项关键的存储功能,用于创建持久卷(PV)的时间点副本。这一特性通过CSI(容器存储接口) 实现,并引入了一组新的API资源来管理快照生命周期。本文将详细讲解Kubernetes中的Volume Snapshots相关概念、工作原理及使用方法。

一、核心概念与API资源

1. 卷快照相关资源

Kubernetes通过以下CRD(自定义资源定义)管理卷快照:

① VolumeSnapshotClass

类似于StorageClass,定义了创建快照的存储后端配置和删除策略。

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)。

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的关系。

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. 从快照恢复卷流程

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

spec:

dataSource:

name: my-snapshot

kind: VolumeSnapshot

apiGroup: snapshot.storage.k8s.io

2. 测试与开发

克隆生产数据:基于生产环境的卷快照创建测试环境版本回滚:应用升级失败时恢复到之前的状态

3. 数据迁移

跨集群迁移:将快照复制到目标集群并恢复存储类型转换:例如从AWS EBS迁移到GCE PD

四、配置与使用示例

1. 启用卷快照功能

安装Snapshot CRDs:

kubectl 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:

kubectl 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为例):

helm 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:

apiVersion: snapshot.storage.k8s.io/v1

kind: VolumeSnapshotClass

metadata:

name: ebs-snapshot-class

driver: ebs.csi.aws.com

deletionPolicy: Retain # 保留后端快照

创建VolumeSnapshot:

apiVersion: snapshot.storage.k8s.io/v1

kind: VolumeSnapshot

metadata:

name: my-ebs-snapshot

spec:

volumeSnapshotClassName: ebs-snapshot-class

source:

persistentVolumeClaimName: my-ebs-pvc

验证快照状态:

kubectl get volumesnapshot my-ebs-snapshot

kubectl get volumesnapshotcontent

3. 从快照恢复PVC

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




历史大悬案!康熙皇帝的“生母”佟佳氏死因究竟是为何?
2018世界杯巴西vs瑞士