ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

external-snapshotter进阶玩法:本地卷的节点级分布式快照(Distributed Snapshotting)部署实战

external-snapshotter进阶玩法:本地卷的节点级分布式快照(Distributed Snapshotting)部署实战 external-snapshotter进阶玩法本地卷的节点级分布式快照Distributed Snapshotting部署实战【免费下载链接】external-snapshotterSidecar container that watches Kubernetes Snapshot CRD objects and triggers CreateSnapshot/DeleteSnapshot against a CSI endpoint.项目地址: https://gitcode.com/gh_mirrors/ex/external-snapshotterexternal-snapshotter 是 Kubernetes CSI 生态中负责卷快照的 Sidecar 控制器而分布式快照Distributed Snapshotting是它专为本地卷设计的节点级快照模式每个节点上的 csi-snapshotter 只管理本节点的本地卷快照彻底解决单点控制器无法触达节点本地磁盘的难题。本文将带你完成本地卷分布式快照的完整部署实战并顺带解锁 VolumeGroupSnapshot 组快照进阶玩法。一、为什么本地卷需要节点级分布式快照普通的 VolumeSnapshot 工作方式是集群里部署一个snapshot-controllerCSI 驱动的 sidecar 监听 VolumeSnapshotContent 对象再调用 CSI 的 CreateSnapshot/DeleteSnapshot 接口。这对网络存储如 NFS、Ceph、云盘没问题因为控制器随时可以访问存储后端。但本地卷Local Volume、hostpath 驱动等的快照数据就在节点自己的磁盘上。如果 sidecar 只部署在某个节点上它根本无法为其他节点上的本地卷做快照。分布式快照的思路很直接把 csi-snapshotter随 CSI 驱动一起部署到每个节点类似 DaemonSet每个副本只处理打上了自己节点标记的 VolumeSnapshotContent 对象。这样快照操作天然分布在各节点本地完成无需跨节点网络性能更好、故障域也更小。二、分布式快照的工作原理 核心实现在 csi-snapshotter 的启动逻辑中。当指定--node-deployment时sidecar 会用NODE_NAME环境变量作为标签选择器只 watch 属于本节点的快照对象见 cmd/csi-snapshotter/main.go每个节点的 sidecar 只处理VolumeSnapshotContentManagedByLabel 本节点名的对象其他节点的快照对象对它不可见互不干扰快照实际落在哪个节点的本地磁盘就由哪个节点的 sidecar 完成。另外有一个硬性约束--node-deployment与 leader election 互斥。因为每个节点都要活跃地处理自己本地的快照如果开启选主非 leader 副本就会闲置本地卷反而没人管了校验逻辑见 cmd/csi-snapshotter/main.go。三、一键部署步骤开启分布式快照的 3 个关键配置 ⚡步骤 1安装快照 CRD每集群一次先安装 Snapshot 相关 CRD含组快照 CRD参考仓库内 client/config/crd/ 目录下的 YAML仓库自带的示例部署文件可直接体验 hostpath 本地卷场景deploy/kubernetes/csi-snapshotter/setup-csi-snapshotter.yaml步骤 2snapshot-controller 开启分布式模式在 snapshot-controller 的启动参数中加上--enable-distributed-snapshottingtrue该参数定义于 cmd/snapshot-controller/main.go。它的作用是告诉控制器sidecar 会跑在每个节点上节点本地卷的快照由节点自己处理。步骤 3csi-snapshotter 以 DaemonSet 形式部署到每个节点这是最关键的一步。与普通的 Deployment 不同现在需要使用DaemonSet调度保证每个节点一个副本且与本地 CSI 驱动同 Pod 或同节点运行启动参数加--node-deploymenttrue和--leader-electionfalse注入NODE_NAME环境变量取值为spec.nodeName缺失时 sidecar 会直接启动失败。关键的容器片段大致如下args: - --csi-address$(ADDRESS) - --node-deploymenttrue - --leader-electionfalse env: - name: ADDRESS value: /csi/csi.sock - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName完成后提交一个 VolumeSnapshot就能观察到对应节点上的 sidecar 完成本地快照创建。四、关键配置速查表 组件参数 / 环境变量默认值作用snapshot-controller--enable-distributed-snapshottingfalse开启节点级分布式快照模式csi-snapshotter--node-deploymentfalsesidecar 只处理本节点本地卷的快照csi-snapshotterNODE_NAMEenv必填标识 sidecar 所在的节点名csi-snapshotter--leader-election按需开启--node-deployment后必须为 falsecsi-snapshotter--csi-address/run/csi/socket本节点 CSI 驱动的 socket 路径 记忆口诀控制器开一个开关sidecar 换 DaemonSet 两个参数。五、进阶玩法叠加 VolumeGroupSnapshot 做组快照 如果你用的是多卷业务比如 PostgreSQL 的数据卷 WAL 卷单个快照可能不一致。external-snapshotter 还支持VolumeGroupSnapshot一次性对一组 PVC 做一致性组快照要求 CSI 驱动版本支持 CSI v1.10.0且驱动实现 GroupSnapshot 接口。启用需要满足三个条件集群已安装 v1beta2 的 VolumeGroupSnapshot CRD已包含在步骤 1 的 CRD 中snapshot-controller 加参数--feature-gatesCSIVolumeGroupSnapshottruecsi-snapshotter 同样加--feature-gatesCSIVolumeGroupSnapshottrue。然后按标签一次性圈住一组 PVC提交组快照即可完整示例见 examples/kubernetes/groupsnapshot-v1beta1.yamlapiVersion: groupsnapshot.storage.k8s.io/v1beta1 kind: VolumeGroupSnapshot metadata: name: new-groupsnapshot-demo spec: source: selector: matchLabels: app.kubernetes.io/name: postgresql volumeGroupSnapshotClassName: csi-hostpath-groupsnapclass仓库在 pkg/group_snapshotter/ 与 pkg/sidecar-controller/groupsnapshot_helper.go 中实现了组快照的创建、状态同步与删除流程需要深入了解源码逻辑的同学可以从这里入手。六、常见坑与排查清单 ⚠️sidecar 启动即退出日志提示 NODE_NAME 未设置检查 Pod env 是否用fieldRef: spec.nodeName注入了节点名。设置了--node-deployment却启动失败检查是否误开了--leader-electiontrue两者互斥。快照一直卡在 Pending确认 VolumeSnapshotClass 里的driver名称与该节点 CSI 驱动名完全一致sidecar 会按驱动名过滤事件见 pkg/sidecar-controller/snapshot_controller.go。组快照不生效确认三个条件都满足——CRD 已装、控制器和 sidecar 都开了CSIVolumeGroupSnapshot特性门且驱动本身支持 GroupSnapshot。升级/回滚分布式模式下调整参数后需要滚动重启所有节点上的 sidecar 才会生效。七、小结 ✅external-snapshotter 的分布式快照用每节点一个 sidecar 节点标签过滤的轻量设计把本地卷的快照能力下沉到节点本地是本地存储场景下做备份恢复、数据克隆的关键拼图。配合 VolumeGroupSnapshot还能把多卷一致性备份玩出花。按本文的 3 步配置 速查表几分钟就能在集群里跑通本地卷的节点级分布式快照。【免费下载链接】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),仅供参考
返回列表