JuiceFS 是一款面向云环境设计的高性能共享文件系统,提供完备的 POSIX 兼容性,可将海量低价的云存储作为本地磁盘使用,亦可同时被多台主机同时挂载读写。
随着云原生的普及,越来越多的用户都会将自己的应用迁移到 Kubernetes 容器平台中。在 Kubernetes 容器平台中,存储是支撑用户应用的基石。为了更好地服务云原生应用,JuiceFS 开发了 CSI 插件驱动,方便云原生环境中的应用通过 Persistent Volume 来使用 JuiceFS。
目前,大多数用户会在 Kubernetes 中使用 JuiceFS 的静态或动态 PV 挂载。
遇到的挑战:CSI Driver 无法平滑升级
然而,CSI 对用户态文件系统来说,存在设计上难以逾越的挑战,很难在 Kubernetes 中管理用户态的进程。CSI 提供的接口只涉及了挂载及卸载等,而用户态文件系统需要在挂载文件的同时,启动一个用户态的 daemon 进程,用来和内核模块 FUSE 通信。
JuiceFS CSI Driver 在挂载文件时,直接在容器内启动 daemon 进程,即将 daemon 进程的生命周期与 CSI Driver 关联。这就造成了 CSI Driver 容器无法平滑升级,一旦容器停止服务,业务应用的挂载点将随之受到影响。
而目前的升级方法是,将所有使用 JuiceFS Volume 的应用重启或直接删除 pod 等待重建。这对于云上应用来说,在一定程度上影响了其可靠性,因此我们需要探索出一种更平滑的升级策略。
CSI Driver 架构升级
目前业界还没有能够很好地解决该问题的方法。比较流行的解决方法是直接将 daemon 进程挂载在宿主机中,挂在宿主机的 1 号进程下,由 init 进程来管理其生命周期。然而这脱离了 Kubernetes 的管控,且可观测性较差,比如当应用使用 volume 被 hang 住时,用户无法直接在 Kubernetes 集群中观测到进程情况,需要登陆到宿主机查看。
本次 JuiceFS CSI Driver 采用了全新的方式来解决这个问题,架构图如下:
将 JuiceFS 客户端与 CSI Driver 分离,JuiceFS 客户端单独运行于 mount pod 中,CSI Driver node 通过 watch ApiServer
的方式管理其生命周期。
当多个 pod 共用 PV 时,不会新建 mount pod,而是在 mount pod 中记录使用的目标挂载路径。当使用该 PV 的 pod 被删除时,node service 会在 umount 前判断当前 mount pod 的使用者是否为最后一个,如果是最后一个,则将 mount pod 删除;如果不是最后一个,则删除其对应的 reference。
架构升级带来的收益
首先,将 JuiceFS 客户端单独运行于 pod 内,这更好地适应了 Kubernetes 生态,保证其在 Kubernetes 的管控内。
其次,和以往单独的进程相比,用户可以直接在集群中观察到 pod,可观测性强。
并且,每个业务应用的客户端相互隔离,隔离性更强;同时针对单个业务应用,用户也可以设置客户端的资源配额,更好地保证优先级更高的应用对应的客户端分配到的资源配额更足。
上手使用
新版 CSI Driver 的使用方式与 v0.9.0 一致,具体可以查看:
文档:https://github.com/juicedata/juicefs-csi-driver#example-links
唯一有变化的是用户可以在 StorageClass
或 PersistentVolume
中申明自己的应用的 JuiceFS 客户端的资源配额,详情见:
文档:https://github.com/juicedata/juicefs-csi-driver/blob/master/examples/static-provisioning-mount-resources/README.md
本次架构升级后,未来 JuiceFS CSI Driver 版本升级将不会再影响已在使用 JuiceFS 的应用。但从 v0.9.0 向 v0.10.0 版本升级时,需要先将业务应用停掉,我们提供了相对平稳的升级方法,详情见:
升级文档:https://github.com/juicedata/juicefs-csi-driver/blob/master/docs/upgrade-csi-driver.md
写在最后
本次发布的 JuiceFS CSI Driver 成功解决了用户态文件系统普遍存在的 CSI Driver 难以平滑升级的问题,进一步降低了运维工作对应用的影响。而对于用户态文件系统来说,容器环境的 daemon 进程如何保证其高可用性依然是个很大的挑战。
JuiceFS 正在持续研讨相关问题,探索更多可能的解决方案,欢迎访问 JuiceFS GitHub 关注项目进展:
https://github.com/juicedata/juicefs-csi-driver