Redian新闻
>
一个恢复CSI挂载信息的解决方法

一个恢复CSI挂载信息的解决方法

公众号新闻

问题描述

之前有做过一个华为OBS 的CSI插件,其基本运作原理如下图所示。CSI插件Pod挂载了主机的/var/lib/kubelet/pods目录,当创建挂载Pvc的业务Pod时,CSI插件会启动一个s3fs进程,该进程用于远程连接s3服务,将bucket(也即Pvc)挂载到/var/lib/kubelet/pods中的对应Pod目录下(一般为/var/lib/kubelet/pods/<pod-uuid>/volumes/<pod-uuid>kubernetes.io~csi/<pvc-name>/mount),然后由kubelet挂载到业务Pod中。

该插件有个问题,就是当CSI插件重启之后,会丢失掉内部负责远程连接s3服务的s3fs进程,因此会导致业务Pod内部挂载目录失效,访问/var/lib/kubelet/pods/<pod-uuid>/volumes/<pod-uuid>kubernetes.io~csi/<pvc-name>/mount目录会出现Transport endpoint is not connected的问题。此时为了让业务Pod能够正常访问,需要重启业务Pod,但这种方式很不优雅。

解决思路

为了解决Transport endpoint is not connected问题,首先需要恢复s3fs进程,但恢复进程依赖几个数据:Pvc的名称、Pod的uid、s3服务的地址以及访问使用的AK/SK等。有两种方式可以保存这类数据:

  1. 在CSI插件正常运行过程中,将元数据保存到s3服务,其实就是将s3服务作为一个元数据库使用。但这种方式可能存在元数据被误删以及元数据和系统不一致的情况

  2. 在CSI插件启动后使用client-go动态获取集群中的相关数据

此次采用了第二种方式,执行思路为:

  1. 获取所有命名空间下的Pvc(allPvcs)

  2. allPvcs中找到Pvc的metadata.annotations.volume.beta.kubernetes.io/storage-provisioner 为目标storageclass的Pvc(targetPvcs)

  3. 获取挂载了上述targetPvcs的pod(targetPods)

  4. 找到targetPods的uid(targetUid)

  5. 拼接挂载路径/var/lib/kubelet/pods/<targetUid>/volumes/<targetUid>kubernetes.io~csi/<targetPvc-name>/mount

  6. 找到targetPvcsspec.storageClassName,进而找出负责该Pvc的storageclass(targetStorageclass)

  7. targetStorageclassparameters找到相关的信息,最主要的是保存访问s3服务的AK/SK的secret(targetSecret)

  8. targetSecret中找到AK/SK

  9. 执行挂载

上述步骤的主要目的就是找出挂载路径以及s3服务的访问信息。

实施过程

在完成编码之后,经验证发现/var/lib/kubelet/pods/<targetUid>/volumes/<targetUid>kubernetes.io~csi/<targetPvc-name>/mount挂载成功,进入该目录之后可以看到bucket中的内容,但进入业务容器发现,目录并没有成功挂载。

需要提出的一点是,由于CSI插件是被异常重启的,导致挂载失效,并没有执行标准的Unmounting 流程(即调用NodeUnpublishVolume方法),因此在重新挂载之前首先需要umount掉原来的挂载点。

业务容器没有挂载成功的原因是整个恢复流程并没有触发kubelet执行umount/mount来将pvc重新挂载到业务容器。解决方式与CSI插件的/var/lib/kubelet/pods/<targetUid>/volumes/<targetUid>kubernetes.io~csi/<targetPvc-name>/mount一样,执行umountmount即可。但这么做首先要知道Pod映射到主机上的挂载路径,这样就比较麻烦了,因为pod映射到主机上的路径与使用的CRI相关,如果朝这一方向下去,难度比较大,在CSI Volume Plugins in Kubernetes Design Doc中也提过,正常情况下是由kubelet执行的:

  1. The volume manager component of kubelet, notices a mounted CSI volume, referenced by a pod that has been deleted or terminated, so it calls the in-tree CSI volume plugin’s UnmountDevice method which is a no-op and returns immediately.

  2. Next kubelet calls the in-tree CSI volume plugin’s unmount (teardown) method, which causes the in-tree volume plugin to issue a NodeUnpublishVolume call via the registered unix domain socket to the local CSI driver. If this call fails from any reason, kubelet re-tries the call periodically.

  3. Upon successful completion of the NodeUnpublishVolume call the specified path is unmounted from the pod container.

那么怎么才能让容器重新挂载成功呢?

只要重新触发kubelet的挂载动作即可,可以采用livenessProbe来触发该动作,方式如下:


apiVersion: v1

kind: Pod

metadata:

name: csi-s3-test-nginx

namespace: default

spec:

containers:

- name: csi-s3-test-nginx

image: nginx

livenessProbe:

failureThreshold: 3

initialDelaySeconds: 20

periodSeconds: 5

timeoutSeconds: 5

exec:

command:

- ls

- /var/lib/www/html

volumeMounts:

- mountPath: /var/lib/www/html

name: webroot

- mountPath: /var/lib/www/html2

name: webroot2

volumes:

- name: webroot

persistentVolumeClaim:

claimName: csi-s3-pvc

readOnly: false

- name: webroot2

persistentVolumeClaim:

claimName: csi-s3-pvc2

readOnly: false

如果使用这种方式的话,还需要执行之前恢复s3fs进程的操作吗?答案是需要的,重启只会触发kubelet的动作,但不会触发CSI重新挂载,因此恢复s3fs进程和livenessProbe都是同时需要的。

链接:https://www.cnblogs.com/charlieroro/p/16323666.html#5223509

(版权归原作者所有,侵删)


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
2023【AIoT新维奖】优秀产品/解决方案榜发布!精准锚定痛点,打开AIoT商业化通路(3.24)2024 CSRankings美国「CS专业」排名!MIT跌出前5,UCSD比伯克利还牛......无需额外知识或训练!中科大等提出OPERA:缓解多模态大模型幻觉问题的基于注意力惩罚与回退策略的解码方法微软TaskWeaver开源框架:携手数据分析与行业定制,打造顶级Agent解决方案签名信的进展以及为什么我们要求实名签名?抢滩NGS下一个主战场,太古语科技打造低微通量基因检测解决方案在美国房子有白蚁9种最常见信号,以及三大解决方法!科技爱好者周刊#286:蓝色指示灯的解决方案最近寒假这形势,像极了“土匪窝”:这是我见过最高明的解决方法Windows格式化对话框是一个使用了30年的 “临时解决方案”产品进入国内一半以上生殖中心,“智慧生殖”整体解决方案供应商互创联合破冰美国市场创业黑马携手华为云发布“中小企业服务大模型解决方案” 共促企业数智化升级电销人员是如何知道我们的个人信息的?腾讯智慧出行解决方案总监潘英超:云端赋智,成就智能驾驶新引擎|甲子引力房子有白蚁9种最常见信号,以及三大解决方法!6061 血壮山河之随枣会战 第三章 15TPAMI 2024 | 针对节点的融合全局-局部信息的图谱滤波方法中欧多资产团队:希望为大众理财提供稳定、清晰、透明的“解决方案”IT影响中国2023:锐捷AI-FlexiForce智算中心网络解决方案荣获影响力解决方案奖2022年3月1日,24位郭文贵事件受害人首次实名致信美国政府如何减少“闪粉污染”?这家公司找到了解决方案视频号挂载短剧是“鸡肋”?我们和多位从业者聊了聊CSRankings美国CS专业排名出炉!MIT跌出前5,UCSD比伯克利还牛......抄袭上一届同学作业后果分析及解决方案这种毛病,10个妈妈9个有!解决方法很简单,每天10分钟,全身都舒服省级党委书记追问:“剩余5%不满意的解决了没有?”还随机电话查访群众无痛缓解多模态大模型幻觉!基于注意力惩罚与回退机制的解码方法「OPERA」巴斯在美国市长会议向联邦提出流浪汉问题解决方案爱因斯坦成为Salesforce的解决方案快克智能,毫米波雷达组装&测试自动化解决方案|年会展商谁教你这样发信息的?【首发】中科搏锐完成数千万元A轮战略融资,加速落地脑科学在脑血管病诊疗中的解决方案联想正式发布ThinkVision裸眼3D显示器;HTC VIVE与NuEyes为视障人群推出可穿戴XR解决方案《跌宕起伏心灵煎熬的14天》(1) 【交通事故】阴差阳错出国门(1)
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。