跳到主要内容

Curvine CSI 架构详解

curvine-csi 基于fuse实现,在csi-node中通过fuse挂载的方式和curvine集群建立关联。

架构

如果仅需要使用csi,可以略过本章, 直接参考K8S CSI驱动 这一章节。

curvine-csi的主要服务包含两个

组件职责
CSI Node处理 CSI gRPC 调用,负责卷的挂载等
CSI Controller创建/删除/监控 PV
Standalone PODstandalone 模式下独立负责fuse进程管理

挂载方式

大多csi的挂载管理是直接在csi-node中实现,通过将远程存储挂载到hosts上,并最终bind mount到pod容器中。 curvine-csi基于fuse实现,当csi组件重启之后,fuse进程会中断,为了避免csi drvier的升级或者重启等场景导致fuse终端,curvine-csi 支持standalone和 embedded 两种挂载模式。

  • StandAlone: 将 FUSE进程从 csi-node pod 中解耦,放入独立的Pod 运行
  • Embedded: FUSE进程在csi-node plugin的pod中进行挂历

Standalone

默认模式。Helm 安装时使用以下参数:

helm install curvine-csi ./curvine-csi \
--set mountMode=standalone

资源配置

通过 Helm values 配置 Standalone Pod 的资源限制:

helm install curvine-csi ./curvine-csi \
--set node.mountMode=standalone \
--set node.standalone.resources.requests.cpu=500m \
--set node.standalone.resources.requests.memory=512Mi \
--set node.standalone.resources.limits.cpu=2 \
--set node.standalone.resources.limits.memory=2Gi

或使用 values 文件:

node:
mountMode: standalone
standalone:
image: "" # 留空使用CSI镜像
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "2"
memory: "2Gi"

默认配置:

  • CPU: requests 500m, limits 2
  • Memory: requests 512Mi, limits 2Gi

架构示意图:

Embedded

Helm 安装时使用以下参数:

helm install curvine-csi ./curvine-csi \
--set mountMode=embedded \
--set node.resources.requests.memory=2Gi \
--set node.resources.requests.cpu=1000m \
--set node.resources.limits.memory=4Gi \
--set node.resources.limits.cpu=2000m

架构示意图:

注意

Embedded模式下,如果curvine-csi重启或者升级等,fuse进程会中断,会导致POD无法正常使用Curvine,请谨慎根据您的场景选择使用。

FUSE生命周期管理

概述

Curvine CSI 采用FUSE进程复用机制,通过 ClusterID 作为唯一标识,实现多个 PV 共享同一个 FUSE 进程(Standalone Pod)。这种设计显著提升了资源利用率和系统性能。

核心概念

ClusterID 生成规则

ClusterID 是 FUSE 进程复用的核心标识,由 master-addrs 的 SHA256 哈希前 8 位生成:

// 示例:master-addrs 生成 ClusterID
masterAddrs := "10.0.0.1:8995,10.0.0.2:8995,10.0.0.3:8995"
clusterID := SHA256(masterAddrs)[:8] // 例如:0893a5f6

关键特性

  • 相同的 master-addrs → 相同的 ClusterID → 共享 Standalone Pod
  • 不同的 master-addrs → 不同的 ClusterID → 独立 Standalone Pod
  • 支持多集群:同一节点可运行多个 Standalone Pod,访问不同 Curvine 集群

Standalone Pod 命名

curvine-standalone-{clusterID}-{randomSuffix}
# 示例:curvine-standalone-0893a5f6-aefd8804

FUSE 进程复用机制

复用场景示例

说明

  • PV-1、PV-2、PV-3 使用相同的 master-addrs,共享 Standalone-0893a5f6
  • PV-4 使用不同的 master-addrs,使用独立的 Standalone-1a2b3c4d
  • Standalone-0893a5f6 的引用计数为 3(三个 PV 共享)
  • Standalone-1a2b3c4d 的引用计数为 1

自动清理机制

  • 触发条件:RefCount 降至 0(无任何 PV 引用)
  • 优雅关闭:30 秒优雅期,确保 FUSE 正确卸载
  • preStop Hook:5 秒等待,让进行中的 I/O 完成
  • 状态持久化:引用计数保存在 ConfigMap,节点重启后恢复

RBAC 权限要求

Standalone 模式需要以下权限:

资源权限用途
podscreate, delete, get, list, watch管理 Standalone Pod
configmapscreate, delete, get, list, update, watch状态持久化
persistentvolumesget, list, watchPV Watch 兜底清理
eventscreate, patch事件记录和调试