Skip to main content

介绍

架构

JuiceFS CSI 驱动遵循 CSI 规范,实现了容器编排系统与 JuiceFS 文件系统之间的接口。在 Kubernetes 下,JuiceFS 可以用持久卷(PersistentVolume)的形式提供给 Pod 使用。

JuiceFS CSI 驱动包含以下组件:JuiceFS CSI Controller(StatefulSet)以及 JuiceFS CSI Node Service(DaemonSet),你可以方便地用 kubectl 查看:

$ kubectl -n kube-system get pod -l app.kubernetes.io/name=juicefs-csi-driver
NAME READY STATUS RESTARTS AGE
juicefs-csi-controller-0 2/2 Running 0 141d
juicefs-csi-node-8rd96 3/3 Running 0 141d

CSI 默认采用容器挂载(Mount Pod)模式,也就是让 JuiceFS 客户端运行在独立的 Pod 中,其架构如下:

CSI-driver-architecture

采用独立 Mount Pod 来运行 JuiceFS 客户端,并由 CSI Node Service 来管理 Mount Pod 的生命周期。这样的架构提供如下好处:

  • 多个 Pod 共用 PV 时,不会新建 Mount Pod,而是对已有的 Mount Pod 做引用计数,计数归零时删除 Mount Pod。
  • CSI 驱动组件与客户端解耦,方便 CSI 驱动自身的升级。详见「升级」

在同一个节点上,一个 PVC 会对应一个 Mount Pod。而使用了相同 PV 的容器,则可以共享一个 Mount Pod。PVC、PV、Mount Pod 之间的关系如下图所示:

mount-pod-architecture

如果该模式不适用于你的场景,CSI 驱动还提供其他机制,详见「其他运行模式」

使用方式

你可以以「静态配置」「动态配置」的方式来使用 CSI 驱动。

静态配置

静态配置方式最为简单直接,会直接将整个文件系统的根目录作为 PV 挂载到容器里(当然,也可以指定子目录挂载)。这种方式需要 Kubernetes 管理员创建 PersistentVolume(PV)以及文件系统认证信息(以 Kubernetes Secret 形式保存),然后用户创建 PersistentVolumeClaim(PVC),在定义中绑定该 PV,最后在 Pod 定义中引用该 PVC。资源间关系如下图所示:

static-provisioning

一般在以下场景使用静态配置:

  • 你在 JuiceFS 中已经存储了大量数据,想要直接在 Kubernetes 容器中访问;
  • 对 CSI 驱动功能做简单验证;

动态配置

考虑到静态配置的管理比较复杂,需要手动创建 PV,所以有大量应用需要使用 CSI 驱动时,一般会以「动态配置」方式使用,管理员不再需要手动创建 PV,同时实现应用间的数据隔离。这种模式下,管理员会负责创建一个或多个 StorageClass,用户只需要创建 PVC,指定 StorageClass,并且在 Pod 中引用该 PVC,CSI 驱动就会按照 StorageClass 中配置好的参数,为你自动创建 PV,每一个 PV 对应着 JuiceFS 文件系统的一个子目录。

动态配置的资源间关系如下:

dynamic-provisioning

以容器挂载模式为例,从创建到使用的流程大致如下:

  • 用户创建 PVC,指定已经创建好的 StorageClass;
  • CSI Controller 负责在 JuiceFS 文件系统中做初始化,默认以 PV ID 为名字创建子目录,同时创建对应的 PV。该过程所需的配置,都在 StorageClass 中指定或引用;
  • Kubernetes (PV Controller 组件) 将上述用户创建的 PVC 与 CSI Controller 创建的 PV 进行绑定,此时 PVC 与 PV 的状态变为「Bound」;
  • 用户创建应用 Pod,声明使用先前创建的 PVC;
  • CSI Node Service 负责在应用 Pod 所在节点创建 Mount Pod;
  • Mount Pod 启动,执行 JuiceFS 客户端挂载,将挂载点暴露给宿主机,路径为 /var/lib/juicefs/volume/[pv-name]
  • CSI Node Service 等待 Mount Pod 启动成功后,将 PV 对应的 JuiceFS 子目录 bind 到容器内,路径为其声明的 VolumeMount 路径;
  • Kubelet 启动应用 Pod。

阅读以下文章深入了解 CSI 驱动的架构设计:

其他运行模式

CSI 驱动默认以容器挂载(Mount Pod)模式运行,但特定场景下该模式不一定适用,因此 CSI 驱动还提供以下运行模式。

Sidecar 模式

Mount Pod 需要由 CSI Node 创建,考虑到 CSI Node 是一个 DaemonSet 组件,如果你的 Kubernetes 集群不支持部署 DaemonSet(比如一些云服务商提供的 Serverless Kubernetes 服务),那么 CSI Node 将无法部署,也就无法正常使用 CSI 驱动。对于这种情况,可以选择使用 CSI 驱动的 Sidecar 模式,让 JuiceFS 客户端运行在 Sidecar 容器中。

以 Sidecar 模式安装 CSI 驱动,所部署的组件只有 CSI Controller,不再需要 CSI Node。对于需要使用 CSI 驱动的 Kubernetes 命名空间,CSI Controller 会监听容器变动,检查是否使用了 JuiceFS PVC,并根据情况为其注入 Sidecar 容器。

sidecar-architecture

创建和使用的流程大致如下:

  • CSI Controller 启动时,向 API Server 注册 Webhook;
  • 应用 Pod 指定使用 JuiceFS PVC;
  • API Server 在创建应用 Pod 前调用 CSI Controller 的 Webhook 接口;
  • CSI Controller 向应用 Pod 中注入 Sidecar 容器,容器中运行着 JuiceFS 客户端;
  • API Server 创建应用 Pod,Sidecar 容器启动后运行 JuiceFS 客户端执行挂载,应用容器启动后可直接访问文件系统。

使用 Sidecar 模式需要注意:

  • 运行环境需要支持 FUSE,也就是支持以特权容器(Privileged)运行;
  • 不同于 Mount Pod 的容器挂载方式,Sidecar 容器注入进了应用 Pod,因此将无法进行任何复用,大规模场景下,请尤其注意资源规划和分配;
  • Sidecar 容器和应用容器的挂载点共享是通过 hostPath 实现的,是一个有状态服务,如果 Sidecar 容器发生意外重启,应用容器中的挂载点不会自行恢复,需要整个 Pod 重新创建(相较下,Mount Pod 模式则支持挂载点自动恢复);
  • 不要直接从 Mount Pod 模式升级成 Sidecar 模式。已有的 Mount Pod 在 Sidecar 模式下将无法回收。并且一般而言,考虑到 Sidecar 不支持复用,我们不推荐从 Mount Pod 模式迁移为 Sidecar 模式;
  • 对于启用了 Sidecar 注入的命名空间,CSI Controller 会监听该命名空间下创建的所有容器,检查 PVC 的使用并查询获取相关信息。如果希望最大程度地减小开销,可以在该命名空间下,对不使用 JuiceFS PV 的应用 Pod 打上 disable.sidecar.juicefs.com/inject: true 标签,让 CSI Controller 忽略这些不相关的容器。

欲使用 Sidecar 模式,需要以 Sidecar 模式安装 CSI 驱动。安装完毕以后,继续阅读[「在 Serverless 环境中使用 JuiceFS CSI 驱动」]了解如何在各个云服务商的 Serverless 产品中使用 CSI 驱动。

进程挂载模式

相较于采用独立 Mount Pod 的容器挂载方式或 Sidecar 模式,CSI 驱动还提供无需独立 Pod 的进程挂载模式,在这种模式下,CSI Node Service 容器中将会负责运行一个或多个 JuiceFS 客户端,该节点上所有需要挂载的 JuiceFS PV,均在 CSI Node Service 容器中以进程模式执行挂载。

byprocess-architecture

可想而知,由于所有 JuiceFS 客户端均在 CSI Node Service 容器中运行,CSI Node Service 将需要更大的资源声明,推荐将其资源请求调大到至少 1 CPU 和 1GiB 内存,资源约束调大到至少 2 CPU 和 5GiB 内存,或者根据实际场景资源占用进行调整。

在 Kubernetes 中,容器挂载模式无疑是更加推荐的 CSI 驱动用法,但脱离 Kubernetes 的某些场景,则可能需要选用进程挂载模式,比如「在 Nomad 中使用 JuiceFS CSI 驱动」

在 v0.10 之前,JuiceFS CSI 驱动仅支持进程挂载模式。而 v0.10 及之后版本则默认为容器挂载模式。如果你需要升级到 v0.10,请参考「进程挂载模式下升级」

欲使用进程挂载模式,需要以进程挂载模式安装 CSI 驱动