k8s之Snapshots 详解

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

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

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. 启用卷快照功能

  1. 安装Snapshot CRDs

    bash 复制代码
    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

    bash 复制代码
    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为例):

    bash 复制代码
    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

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

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

    bash 复制代码
    kubectl 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
相关推荐
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS2 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun2 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)2 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang2 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿2 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl2 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、2 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove2 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21