k8s之Snapshots 详解

发布于:2025-07-16 ⋅ 阅读:(23) ⋅ 点赞:(0)

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:获取快照信息
  • 必备组件

    1. CSI Driver:如AWS EBS CSI Driver、Ceph CSI等
    2. 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. 启用卷快照功能

  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
    
  2. 部署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
    
  3. 配置支持快照的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. 创建快照示例

  1. 定义VolumeSnapshotClass

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: ebs-snapshot-class
    driver: ebs.csi.aws.com
    deletionPolicy: Retain  # 保留后端快照
    
  2. 创建VolumeSnapshot

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: my-ebs-snapshot
    spec:
      volumeSnapshotClassName: ebs-snapshot-class
      source:
        persistentVolumeClaimName: my-ebs-pvc
    
  3. 验证快照状态

    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

网站公告

今日签到

点亮在社区的每一天
去签到