首页 > 其他分享 >JuiceFS CSI:Mount Pod 的平滑升级及其实现原理

JuiceFS CSI:Mount Pod 的平滑升级及其实现原理

时间:2024-11-01 10:47:14浏览次数:1  
标签:Node CSI Mount 升级 Pod 平滑

当集群中需要升级 Mount Pod 时,目前推荐的方式是更新配置后重新挂载应用 Pod 进行滚动升级,但这种升级方式的问题在于需要业务重启。

如果对业务的使用模式很清楚时,比如没有数据写入等,也可以选择手动重建 Mount Pod 的方式。在更新配置后,手动删除已有的 Mount Pod,并等待其重建,同时依赖 CSI 对挂载点的自动恢复功能,等待应用 Pod 中挂载点的恢复。这种升级的过程有几个问题:

  1. 操作繁琐:需要用户自己使用 kubectl 命令,通过应用 Pod 找到对应的 Mount Pod;
  2. 升级时业务中断:CSI 需要先等待旧的 Mount Pod 完全被删除,才会去创建新的 Mount Pod。这就导致了在旧的 Mount Pod 删除后、新的 Mount Pod 起来前,业务处于不可用状态;
  3. 挂载点自动恢复对原 I/O 操作的影响:由于 CSI 使用了重新 bind 应用挂载点的方式实现了自动恢复,所以即使在恢复后,原先的 I/O 操作都会报错。

为了解决现有的升级过程遇到的问题,JuiceFS CSI Driver 在 v0.25.0 版本中,实现了 Mount Pod 的平滑升级,即在应用不停服的情况下升级 Mount Pod。

相比有损升级的方式,使用平滑升级的好处在于:

  1. 操作简单:在 CSI Dashboard 中,可以轻易的在应用 Pod 的页面找到 Mount Pod,且点击按钮即可触发平滑升级;
  2. 业务不中断:升级过程中,业务不会受到影响,用户也可以使用平滑升级功能来进行 Mount Pod 的参数和配置修改。

01 CSI 如何实现 Mount Pod 的平滑升级

目前 JuiceFS CSI 支持两种平滑升级方式,即二进制升级和 Pod 重建升级。

二进制升级

二进制升级不会重建 Mount Pod,而是升级 Mount Pod 中的客户端二进制。其依赖 JuiceFS 客户端自身的守护进程,即社区版版本在 v1.2.0 以上,商业版版本在 v5.0.0 以上。

整个二进制升级的过程如下:

  1. 在触发平滑升级后,CSI Node 启动一个使用新镜像的 Job,在 Job 中将 JuiceFS 客户端二进制 copy 到 Mount Pod 中;
  2. 等 Job 完成后,CSI Node 向 Mount Pod 发送 SIGHUP 信号;
  3. Mount Pod 接收到 SIGHUP 信号后,将目前的 I/O 请求状态信息保存到临时文件中,此时服务进程退出;
  4. Mount Pod 的服务进程退出后,守护进程会用新的二进制再次启动新的服务进程;
  5. 新的服务进程启动后读取中间状态文件,并继续处理之前的请求;
  6. 新的服务进程向守护进程拿当前的 FUSE fd。

二进制升级使用于仅需要升级客户端的情况。但升级后查看 Pod 的 yaml,其镜像依然是旧的。由于没有重建 Pod,这种升级的好处在于速度快且风险小,缺点在于不能更新 Mount Pod 的其他配置。

Pod 重建升级

Pod 重建升级指的是重建 Mount Pod 进行平滑升级。这种升级方式依赖 JuiceFS 本身的平滑升级功能,即社区版版本在 v1.2.1 以上,商业版版本在 v5.1.0 以上。

整个 Pod 重建升级的过程如下:

  1. 每个 Mount Pod 在启动后,都会将自身使用的 FUSE fd 传给 CSI Node,CSI Node 维护了每个 Mount Pod 使用的 FUSE fd 的关系表;
  2. 在触发了平滑升级后,CSI Node 会先起一个与新 Mount Pod 相同配置的空 Job,这一步的作用是提前将新镜像 pull 在节点上,从而节省升级时间;
  3. 等 Job 完成后,CSI Node 向旧的 Mount Pod 发送 SIGHUP 信号;
  4. 旧的 Mount Pod 接收到 SIGHUP 信号后,将目前的 I/O 状态信息保存到临时文件中,并退出。此时 Mount Pod 变为 Complete 状态;
  5. CSI Node 根据 ConfigMap 中的配置,创建新的 Mount Pod;
  6. 新的 Mount Pod 起来后,读取临时文件中的中间状态信息,从而继续处理之前的请求;
  7. 新的 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 的实际资源使用情况,动态调整资源配比等。用户可以根据需要,选择更适合的升级方式,同时建议在负载比较低的时候进行升级操作。

标签:Node,CSI,Mount,升级,Pod,平滑
From: https://www.cnblogs.com/JuiceData/p/18519729

相关文章

  • k8s~为pod添加节点的资源限制
    CPU单位CPU资源以CPU核心数为单位进行度量的。在Kubernetes中,一个CPU相当于:1AWSvCPU1GCPCore1AzurevCore一个超线程(在使用超线程的裸金属Intel处理器上)请求0.5CPU的容器所保证的CPU核数是请求节点上的1个CPU的一半。你可以用后缀m表示milli。例如100mCPU、100m......
  • RK3588J的6路MIPI CSI视频采集方案
    本文主要介绍基于RK3588J的6路高清视频采集案例,开发环境如下Windows开发环境:Windows764bit、Windows1064bit虚拟机:VMware15.5.5开发环境:Ubuntu20.04.664bitU-Boot:U-Boot-2017.09Kernel:Linux-5.10.160LinuxSDK:rk3588_linux_release_v1.2.1摄像头模块型号:TL138......
  • k8s之调动pod到指定节点与创建多容器pod并查找pod日志
    在Kubernetes中,可以通过以下步骤将Pod调度到指定节点、创建多容器Pod,并查找Pod日志。1.将Pod调度到指定节点要将Pod调度到特定节点,可以使用nodeSelector或nodeAffinity进行调度。方法一:使用nodeSelector首先,需要确保节点具有指定的标签,然后在Pod配置......
  • deployment扩容-查看pod使用的CPU-统计ready状态节点数量
    在Kubernetes中,以下命令可以帮助您完成这些操作:1.Deployment扩容使用kubectlscale命令扩容Deployment,将副本数(Pod数量)增加到指定数量:kubectlscaledeployment<deployment-name>--replicas=<number-of-replicas>例如,将名为my-deployment的Deployment扩......
  • 温故知新,基于播客形式学习英语之EnglishPod 365, 英语口语发音注意事项
    英语国际音标学习英语国际音标(IPA,InternationalPhoneticAlphabet)是掌握标准发音的有效途径。以下是学习国际音标的关键方法和具体音标的说明:1.音标基础知识元音和辅音:音标分为元音(vowels)和辅音(consonants),元音是发音时没有任何阻碍的,而辅音则包含部分阻碍发音的动作。长......
  • k8s 进入pod network namespace
    6种namespaceNamespace弊端最主要的问题就是隔离得不彻底。首先,多个容器之间共享内核。其次,有很多资源是不能被Namespace化的,例如时间。NetworkNamespace进入Docker的networknamespacedocker把所有容器的NetworkNamespace放在/run/docker/netns目录下。dockerrun--rm......
  • 【K8S系列】Kubernetes pod节点Unknown 问题及解决方案详解【已解决】
    在Kubernetes中,Pod的状态为Unknown表示无法获取Pod的当前状态。这通常意味着KubernetesAPI服务器无法与Pod所在的节点通信,或者Kubelet进程遇到问题。以下将详细介绍Unknown状态的原因、解决方案以及如何配置健康检查以提高系统的稳定性。一、Unknown状态......
  • 苹果的AirPods和其他品牌无线耳机有什么区别_1
    苹果的AIrPods自推出以来就在无线耳机市场上引起了广泛关注,它们以其独特的设计、无缝的设备集成和优质的用户体验而著称。本文将探讨AirPods与其他品牌无线耳机的主要差异有:1.设计和舒适度;2.音质和性能;3.价格和价值;4.电池寿命和充电;5.兼容性和功能;6.附加功能;7.品牌生态系统。1.......
  • 在K8S中,Pod的调度机制是什么?
    在Kubernetes(K8s)中,Pod的调度机制是一个复杂而精细的过程,它确保了Pod能够被合理地分配到集群中的各个节点上,以满足应用程序的需求和资源的最优利用。以下是Pod调度机制的详细解释:1.调度器的作用Kubernetes的调度器(scheduler)负责接收Pod的调度请求,并根据一系列的策略和算法为Pod......
  • 在K8S中,每个 Pod 中有一个特殊的 Pause 容器能否去除,原因是什么?
    在Kubernetes(K8s)中,每个Pod中有一个特殊的Pause容器,这个容器是不能被去除的,原因如下:1.Pause容器的功能网络命名空间持有者:Pause容器在Pod中充当网络命名空间的主要进程,它创建了一个网络命名空间,并在其中设置Pod的网络配置,如IP地址、网络接口和路由规则。Pod中的其他容器可以......