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
相关推荐
无言听风雨丶9 小时前
Kubernetes 控制平面深度剖析:从 kubectl apply 到 etcd 写入的全链路
平面·kubernetes·etcd
openFuyao10 小时前
openFuyao x 复旦大学软件工程实验室 Panel 回顾:Agentic时代,集群调度技术体系将如何演进?
kubernetes·openfuyao
螺蛳粉 螺蛳粉11 小时前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
知已难寻12 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
相思难忘成疾14 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
PellyKoo14 小时前
【docker】cifs卷改smb密码后容器起不来的解决方法
运维·docker·容器
n1121214 小时前
Ollama 接 Open WebUI 中文界面:我踩的 4 个坑
云原生·eureka·ollama·本地大模型·open webui·私有部署·中文界面
阿里云云原生14 小时前
用户说 App“下不了单”:用 Session Replay 看清流程卡在哪一步
云原生
weirong15 小时前
给 K8s 加一个自动值班员:分级故障自愈引擎
kubernetes
云和数据.ChenGuang15 小时前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes