JuiceFS CSI:Mount Pod 的平滑升级及其实现原理
当集群中需要升级 Mount Pod 时,目前推荐的方式是更新配置后重新挂载应用 Pod 进行滚动升级,但这种升级方式的问题在于需要业务重启。
如果对业务的使用模式很清楚时,比如没有数据写入等,也可以选择手动重建 Mount Pod 的方式。在更新配置后,手动删除已有的 Mount Pod,并等待其重建,同时依赖 CSI 对挂载点的自动恢复功能,等待应用 Pod 中挂载点的恢复。这种升级的过程有几个问题:
- 操作繁琐:需要用户自己使用 kubectl 命令,通过应用 Pod 找到对应的 Mount Pod;
- 升级时业务中断:CSI 需要先等待旧的 Mount Pod 完全被删除,才会去创建新的 Mount Pod。这就导致了在旧的 Mount Pod 删除后、新的 Mount Pod 起来前,业务处于不可用状态;
- 挂载点自动恢复对原 I/O 操作的影响:由于 CSI 使用了重新 bind 应用挂载点的方式实现了自动恢复,所以即使在恢复后,原先的 I/O 操作都会报错。
为了解决现有的升级过程遇到的问题,JuiceFS CSI Driver 在 v0.25.0 版本中,实现了 Mount Pod 的平滑升级,即在应用不停服的情况下升级 Mount Pod。
相比有损升级的方式,使用平滑升级的好处在于:
- 操作简单:在 CSI Dashboard 中,可以轻易的在应用 Pod 的页面找到 Mount Pod,且点击按钮即可触发平滑升级;
- 业务不中断:升级过程中,业务不会受到影响,用户也可以使用平滑升级功能来进行 Mount Pod 的参数和配置修改。
01 CSI 如何实现 Mount Pod 的平滑升级
目前 JuiceFS CSI 支持两种平滑升级方式,即二进制升级和 Pod 重建升级。
二进制升级
二进制升级不会重建 Mount Pod,而是升级 Mount Pod 中的客户端二进制。其依赖 JuiceFS 客户端自身的守护进程,即社区版版本在 v1.2.0 以上,商业版版本在 v5.0.0 以上。
整个二进制升级的过程如下:

- 在触发平滑升级后,CSI Node 启动一个使用新镜像的 Job,在 Job 中将 JuiceFS 客户端二进制 copy 到 Mount Pod 中;
- 等 Job 完成后,CSI Node 向 Mount Pod 发送 SIGHUP 信号;
- Mount Pod 接收到 SIGHUP 信号后,将目前的 I/O 请求状态信息保存到临时文件中,此时服务进程退出;
- Mount Pod 的服务进程退出后,守护进程会用新的二进制再次启动新的服务进程;
- 新的服务进程启动后读取中间状态文件,并继续处理之前的请求;
- 新的服务进程向守护进程拿当前的 FUSE fd。
二进制升级使用于仅需要升级客户端的情况。但升级后查看 Pod 的 yaml,其镜像依然是旧的。由于没有重建 Pod,这种升级的好处在于速度快且风险小,缺点在于不能更新 Mount Pod 的其他配置。
Pod 重建升级
Pod 重建升级指的是重建 Mount Pod 进行平滑升级。这种升级方式依赖 JuiceFS 本身的平滑升级功能,即社区版版本在 v1.2.1 以上,商业版版本在 v5.1.0 以上。
整个 Pod 重建升级的过程如下:

- 每个 Mount Pod 在启动后,都会将自身使用的 FUSE fd 传给 CSI Node,CSI Node 维护了每个 Mount Pod 使用的 FUSE fd 的关系表;
- 在触发了平滑升级后,CSI Node 会先起一个与新 Mount Pod 相同配置的空 Job,这一步的作用是提前将新镜像 pull 在节点上,从而节省升级时间;
- 等 Job 完成后,CSI Node 向旧的 Mount Pod 发送 SIGHUP 信号;
- 旧的 Mount Pod 接收到 SIGHUP 信号后,将目前的 I/O 状态信息保存到临时文件中,并退出。此时 Mount Pod 变为 Complete 状态;
- CSI Node 根据 ConfigMap 中的配置,创建新的 Mount Pod;
- 新的 Mount Pod 起来后,读取临时文件中的中间状态信息,从而继续处理之前的请求;
- 新的 Mount Pod 向 CSI Node 拿当前的 FUSE fd。
其中 Mount Pod 和 CSI Node 之间通过 Unix domain socket 来传递文件句柄。当某个 FUSE 请求未能在升级期间完成,会被强制中断,建议在负载比较低的时候进行升级操作。
可以看到整个平滑升级的过程,与宿主机上客户端的平滑升级类似,唯一的区别在于由 CSI Node 向旧的服务进程发送 SIGHUP 信号以及新的服务进程启动后向 CSI Node 拿 FUSE fd。这是因为 Mount Pod 在重建后,其中的守护进程无法向旧的守护进程发送 SIGHUP 信号以及无法通过 Unix domain socket 传递文件句柄,所以在 K8s 环境中这些工作就交由 CSI Node 来完成。
这种升级方式由于重建了 Pod,缺点在于如果集群环境比较复杂,重建 Pod 的过程中出错的风险比较大;其优点在于可以更新 Mount Pod 的其他配置,且查看 Pod 的 yaml,其镜像是新的。
02 如何触发平滑升级
目前平滑升级可以在 CSI Dashboard 或者 kubectl 插件中触发。
Dashboard 中触发
首先在 CSI Dashboard 中,点击「配置」按钮,更新 Mount Pod 需要升级的新镜像版本。

其次,在 Mount Pod 的详情页,有两个升级按钮,分别是「Pod 重建升级」和「二进制升级」。
- Pod 重建升级:Mount Pod 会重建,可用于更新镜像、调整挂载参数、调整 pod 资源等。Mount Pod 的最低版本要求为 1.2.1(社区版)或 5.1.0(企业版);
- 二进制升级:Mount Pod 不重建,只升级其中的二进制,不可变更其他配置,且升级完成后 Pod yaml 中所看到的依然是原来的镜像。Mount Pod 的最低版本要求为 1.2.0(社区版)或 5.0.0(企业版)。

点击升级按钮,即可触发 Mount Pod 的平滑升级。

触发后可以看到整个过程,完成后页面会自动跳转到新的 Mount Pod 的详情页。
kubectl 插件中触发
使用 kubectl 在 CSI ConfigMap 配置中更新 Mount Pod 所需要升级的镜像版本。
apiVersion: v1
data:
config.yaml: |
mountPodPatch:
- ceMountImage: juicedata/mount:ce-v1.2.0
eeMountImage: juicedata/mount:ee-5.1.1-ca439c2
kind: ConfigMap
使用 JuiceFS kubectl plugin 触发 Mount Pod 的平滑升级。
# Pod 重建升级
kubectl jfs upgrade juicefs-kube-node-1-pvc-52382ebb-f22a-4b7d-a2c6-1aa5ac3b26af-ebngyg --recreate
# 二进制升级
kubectl jfs upgrade juicefs-kube-node-1-pvc-52382ebb-f22a-4b7d-a2c6-1aa5ac3b26af-ebngyg
03 总结
鉴于目前的有损升级方案存在诸多缺陷,JuiceFS CSI Driver 在 v0.25.0 版本中,支持了 Mount Pod 的平滑升级。CSI 提供了两种平滑升级方案,包括二进制升级和 Pod 重建升级。二进制升级风险小,但不支持更新 Mount Pod 的其他配置;Pod 重建升级在集群环境较复杂的情况下有失败的风险,但支持更新 Mount Pod 的其他配置,比如可以根据 Mount Pod 的实际资源使用情况,动态调整资源配比等。用户可以根据需要,选择更适合的升级方式,同时建议在负载比较低的时候进行升级操作。
JuiceFS CSI:Mount Pod 的平滑升级及其实现原理的更多相关文章
- nginx的平滑升级
一:解释nginx的平滑升级 随着nginx越来越流行,并且nginx的优势也越来越明显,nginx的版本迭代也来时加速模式,1.9.0版本的nginx更新了许多新功能,例如stream四层代理功能, ...
- 平滑升级你的Nginx
1.概述(可以直接跳过看第2部分) Nginx方便地帮助我们实现了平滑升级.其原理简单概括,就是: (1)在不停掉老进程的情况下,启动新进程. (2)老进程负责处理仍然没有处理完的请求,但不再接受处理 ...
- 高性能Web服务器Nginx的配置与部署研究(14)平滑升级你的Nginx
1.概述(可以直接跳过看第2部分) Nginx方便地帮助我们实现了平滑升级.其原理简单概括,就是: (1)在不停掉老进程的情况下,启动新进程. (2)老进程负责处理仍然没有处理完的请求,但不再接受处理 ...
- Nginx 启动、停止、平滑重启和平滑升级 graceful shutdown of worker processes
Controlling nginx http://nginx.org/en/docs/control.html nginx can be controlled with signals. The pr ...
- Nginx的特性功能-反向代理、负载均衡、缓存、动静分离、平滑升级
反向代理 nginx配置文件 events { } 事件驱动 httpd { } 关于httpd相关的配置 server { } 定义虚拟主机 location { } ...
- Nginx平滑升级的详细操作方法
转至:https://blog.csdn.net/midion9/article/details/49684325 一.平滑升级概述Nginx方便地帮助我们实现了平滑升级.其原理简单概括,就是:(1) ...
- JuiceFS CSI Driver 的最佳实践
文章根据 Juicedata 工程师朱唯唯,在云原生 Meetup 杭州站所作主题演讲<JuiceFS CSI Driver 的最佳实践>整理而成. 大家好,我是来自 Juicedata ...
- CSI 工作原理与JuiceFS CSI Driver 的架构设计详解
容器存储接口(Container Storage Interface)简称 CSI,CSI 建立了行业标准接口的规范,借助 CSI 容器编排系统(CO)可以将任意存储系统暴露给自己的容器工作负载.Ju ...
- JuiceFS CSI Driver 常见问题排查指南
Kubernetes 作为资源调度和应用编排的开源系统,正在成为云计算和现代 IT 基础架构的通用平台.JuiceFS CSI Driver 实现了容器编排系统的存储接口,使得用户可以在 Kubern ...
- Sidecar-详解 JuiceFS CSI Driver 新模式
近期发布的 JuiceFS CSI Driver v0.18 版本中,我们提供了一种全新的方式访问文件系统,即 JuiceFS 客户端以 Sidecar 方式运行于应用 Pod 中,且客户端与应用同生 ...
随机推荐
- 关于Protobuf在使用中的一些注意点
Protobuf是谷歌旗下的一款二进制序列化协议 协议的编写 在项目中新建一个xxx.proto文件 文件的格式 第一行写protobuf的版本 syntax = "proto3" ...
- GNU make-Makefile文件简介
Makefile简介 Makefile是一种特殊格式的文件,被make工具使用来管理软件的构建过程.Makefile定义了一组规则和依赖关系,告诉make如何编译和链接程序. Makefile语句 T ...
- idea启动项目发现端口被占用!!!导致启动不起来
windows端口被占用 netstat -ano |findstr 端口号 任务管理器详细信息 PID排序找到刚才查到的 右键结束 原因: idea被异常终止导致tomcat没死
- One-for-All:上交大提出视觉推理的符号化与逻辑推理分离的新范式 | ECCV 2024
通过对多样化基准的严格评估,论文展示了现有特定方法在实现跨领域推理以及其偏向于数据偏差拟合方面的缺陷.从两阶段的视角重新审视视觉推理:(1)符号化和(2)基于符号或其表示的逻辑推理,发现推理阶段比符号 ...
- 基于surging的木舟IOT平台如何添加网络组件
一 . 概述 为了弥补代码的遗失,木舟IOT平台正在加班加点进行研发,后面不只是针对于IOT设备接入上报,告警,视频管理,组态数据可视化大屏,后面还会有快速搭建微服务平台,利用surging.cli工 ...
- 计算QPS-Sentinel限流算法
sentinel 前方参考 计算QPS-Sentinel限流算法 https://www.cnblogs.com/yizhiamumu/p/16819497.html Sentinel 介绍与下载使用 ...
- 6.12Web应用漏洞发现探针利用
已知CMS.开发框架. 思路: 各个页面查看数据包(地址信息),查看框架,上fofa关键字搜索(查看其框架信息如thinkhphp),利用检测工具测试漏洞情况: 网站根目录下的robots.txt文件 ...
- Dell存储备份告警:
创建时间 修改日期 对象名称 消息 类型 告警状态 已确认 告警定义 类型 23-3-12 11:59:26 23-3-12 11:59:37 copyMirrorswap 2 CMs Operati ...
- 城市时空预测的统一数据管理和综合性能评估 [实验、分析和基准]《Unified Data Management and Comprehensive Performance Evaluation for Urban Spatial-Temporal Prediction [Experiment, Analysis & Benchmark]》
2023年11月1日,还有两个月,2023年就要结束了,希望在结束之前我能有所收获和进步,冲呀,老咸鱼. 论文:Unified Data Management and Comprehensive Pe ...
- BOM – Navigator SendBeacon
介绍 游览器专门做给 tracking 用的接口. 从前我们想 tracking 用户点击 anchor 是比较麻烦的. 因为 click 事件触发后, 想发 ajxax 去做 tracking re ...