公司动态
一文看懂Kubernetes CSI快照系统external-snapshotter:从VolumeSnapshot到架构全景的完整指南
一文看懂Kubernetes CSI快照系统external-snapshotter从VolumeSnapshot到架构全景的完整指南【免费下载链接】external-snapshotterSidecar container that watches Kubernetes Snapshot CRD objects and triggers CreateSnapshot/DeleteSnapshot against a CSI endpoint.项目地址: https://gitcode.com/gh_mirrors/ex/external-snapshotterKubernetes CSI 快照系统的核心组件external-snapshotter是运行在集群中的 Sidecar 容器负责监听 VolumeSnapshot 等 CRD 对象的变化并向 CSI 存储驱动发起 CreateSnapshot / DeleteSnapshot 调用。它让 PVC 备份、数据恢复、卷组快照等能力成为标准操作。本文将带你快速理解它的核心概念、架构组成与部署方式是初学者上手 CSI 快照的完整指南。 它解决什么问题Kubernetes 的存储由各式各样的 CSI 驱动提供云盘、对象存储、本地盘等但每种驱动做快照的方式完全不同。external-snapshotter 的作用就是抹平这些差异用户只需声明一个标准的VolumeSnapshot资源由快照控制器与 CSI 快照器 Sidecar 自动完成底层快照的创建、绑定、删除快照可以作为dataSource用来恢复新 PVC实现一键数据回滚自 Kubernetes 1.20 起Volume Snapshot 已 GA 并默认启用无法关闭——理解这套系统是 K8s 运维的基本功。 四个核心概念CRD 资源快照功能由几类 CRD 资源协同工作定义文件位于client/config/crd/目录资源类比作用VolumeSnapshot快照订单命名空间内对象用户真正创建的资源声明给哪个 PVC 打快照VolumeSnapshotClassStorageClass集群级指定使用哪个 CSI 驱动及deletionPolicy删除策略VolumeSnapshotContentPersistentVolume集群级真正保存底层快照句柄SnapshotHandle的对象对用户不可见VolumeGroupSnapshot卷组订单按标签选择器为一批 PVC 做一致性组快照1.27 alpha 起打个比方VolumeSnapshot是你的点单VolumeSnapshotClass是餐厅的规则VolumeSnapshotContent是后厨实际做出的菜。用户只关心前两者第三个由控制器自动维护。️ 架构全景三大组件整个系统由三部分组成各自独立部署1️⃣ Snapshot CRDs每个集群安装一次定义上述资源类型安装命令kubectl kustomize client/config/crd | kubectl create -f -CRD 与任何 CSI 驱动无关属于集群基础设施。2️⃣ snapshot-controller每个集群部署一次集群级控制器遵循 Informer WorkQueue 的控制器模式监听VolumeSnapshot和VolumeSnapshotContent的增删改事件。它的职责是根据VolumeSnapshot找到对应的VolumeSnapshotClass创建对应的VolumeSnapshotContent并建立双向绑定处理 Finalizer保证快照删除时的清理顺序核心逻辑在pkg/common-controller/snapshot_controller.go入口为cmd/snapshot-controller/main.go。它对所有 CSI 驱动生效一份部署服务全集群。3️⃣ csi-snapshotter Sidecar每个 CSI 驱动部署一份这才是external-snapshotter 的本体以 Sidecar 容器形式与 CSI 驱动跑在一起通过 Unix Socket默认/run/csi/socket与驱动通信。它只监听VolumeSnapshotContent事件过滤出属于自己驱动的对象然后调用 CSI 的CreateSnapshot/DeleteSnapshotRPC。关键源码位于pkg/sidecar-controller/snapshot_controller.go入口为cmd/csi-snapshotter/main.go。 一次快照创建的完整流程用户创建VolumeSnapshot见 examples 示例 对应文件examples/kubernetes/snapshot-v1.yamlsnapshot-controller 读取其指定的VolumeSnapshotClass创建VolumeSnapshotContent两个对象完成绑定互相指向csi-snapshotter Sidecar 捕获新 Content向 CSI 驱动发起CreateSnapshot驱动返回 SnapshotHandle写入VolumeSnapshotContent.status控制器把状态同步回VolumeSnapshot.statusReadyToUse: true快照可用删除流程则反向进行删除VolumeSnapshot→ 控制器解绑 → Sidecar 调用DeleteSnapshot→ 按deletionPolicyDelete或Retain决定底层快照是否一并删除。 如何从快照恢复数据只需创建 PVC 时引用快照作为dataSource示例见examples/kubernetes/restore.yamlapiVersion: v1 kind: PersistentVolumeClaim metadata: name: hpvc-restore spec: storageClassName: csi-hostpath-sc dataSource: name: new-snapshot-demo-v1 kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io resources: requests: storage: 1GiPVC 绑定后驱动会自动从快照初始化新卷——整个过程无需人工干预。 进阶卷组快照Volume Group Snapshot对于 PostgreSQL 这类主从数据库多个 PVC 的数据必须同时一致才有意义。VolumeGroupSnapshot通过标签选择器圈定一批 PVC让驱动一次性做一致性组快照示例见examples/kubernetes/groupsnapshot-v1beta1.yamlapiVersion: groupsnapshot.storage.k8s.io/v1beta1 kind: VolumeGroupSnapshot spec: source: selector: matchLabels: app.kubernetes.io/name: postgresql volumeGroupSnapshotClassName: csi-hostpath-groupsnapclass该功能默认关闭需要给 controller 和 sidecar 都加上--feature-gatesCSIVolumeGroupSnapshottrue才能启用。⚙️ 快速部署与关键参数部署 YAML 都在deploy/kubernetes/目录下生产环境建议把 namespace 改为kube-system# 快照控制器每集群一次 kubectl -n kube-system kustomize deploy/kubernetes/snapshot-controller | kubectl create -f - # CSI 快照器跟随 CSI 驱动部署 kubectl kustomize deploy/kubernetes/csi-snapshotter | kubectl create -f -新手最应该记住的几个启动参数参数属于作用--leader-election两者多副本高可用推荐开启--csi-addressSidecarCSI Socket 路径默认/run/csi/socket--worker-threads两者并发工作线程数默认 10--retry-interval-start / -max两者失败重试采用指数退避默认 1s 起步、最长 5 分钟--http-endpoint两者暴露/metrics供 Prometheus 监控️ 源码目录速览目录内容client/config/crd/快照相关 CRD 的 YAML 定义含 CEL 校验规则client/apis/VolumeSnapshot / VolumeGroupSnapshot 的 Go 类型定义pkg/common-controller/snapshot-controller 主逻辑pkg/sidecar-controller/csi-snapshotter Sidecar 主逻辑pkg/webhook/v1beta1 ↔ v1beta2 卷组快照的转换 Webhookpkg/utils/通用工具与状态转换函数examples/kubernetes/可直接套用的 YAML 示例⚠️ 版本兼容与升级注意事项最低要求 Kubernetes 1.20 CSI Spec v1.0推荐 CSI v1.5.0快照 API 已从 v1beta1 演进到 v14.1 起存储版本切换为 v1升级前请先清理遗留的非法 v1beta1 对象升级到 v1 前建议先安装校验 Webhook否则可能无法删除非法快照对象卷组快照目前使用 v1beta2 API需安装对应 CRD 总结external-snapshotter 用三个各司其职的组件把给 PVC 打快照变成了声明式的一条命令CRD定义快照资源模型装一次snapshot-controller负责编排与绑定装一次csi-snapshotter Sidecar负责调用 CSI 驱动每个驱动一份掌握VolumeSnapshot → VolumeSnapshotContent → CSI CreateSnapshot这条主线你就能读懂绝大多数快照故障日志。下次需要备份或回滚生产数据时这套 Kubernetes CSI 快照系统就是你最可靠的工具。【免费下载链接】external-snapshotterSidecar container that watches Kubernetes Snapshot CRD objects and triggers CreateSnapshot/DeleteSnapshot against a CSI endpoint.项目地址: https://gitcode.com/gh_mirrors/ex/external-snapshotter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考