ToB企服应用市场:ToB评测及商务社交产业平台

标题: Kubernetes CSI注册流程 [打印本页]

作者: 万有斥力    时间: 2023-6-18 05:47
标题: Kubernetes CSI注册流程
问题起因

近段时间,在工作中,遇到了一个问题:有一套K8S集群在做可靠性验证,在重启上下电之后,发现这个节点上的Pod状态异常。通过kubectl describe查看Pod情况,都是挂卷出错,而kubelet日志中也报了某个CSI插件没有找到。但问题是CSI插件对应的Pod是正常Running状态。那么为什么CSI会找不到呢?于是带着这个问题,研究起了k8s的代码。
代码分析

CSI没有找到,那意味着肯定是有地方储存CSI的数据,相应的有地方去创建/更新CSI的数据。这个咨询CSI业务的开发了解到,CSI注册后会更新csiNode资源,同时node资源上也会有csi的拓扑信息。
另外根据kubelet的日志报错信息:Error calling CSI NodeGetInfo()找到了CSI注册流程的代码。
CSI注册流程的代码入口在pkg/kubelet/pluginmanager/plugin_manager.go:108 (v1.25.3版本)
首先是Run方法,这里主要处理了两件事
reconciler主循环

根据个人对代码的理解,绘制了下面的流程图。

问题分析

由于kubelet日志中出现了Error calling CSI NodeGetInfo()的报错日志,那么说明CSI Pod实现的NodeGetInfo方法出现了错误。通过CSI开发分析,是由于需要发请求,而节点刚重启,受网络配置的影响,请求超时了,导致方法报错。
那么又出了一个问题,为什么没有恢复呢?
原因在于在kubelet调用NodeGetInfo方法时,已经将asw缓存更新了,此时dsw和asw缓存一致,kubelet不会再触发卸载、注册流程。
这不合理呀,这里没有真正注册成功啊。
再次走读代码,终于识别到了一个点:kubelet是有通知事件发给CSI Pod的。在校验CSI信息和注册过程中,如果出现异常,kubelet会发一个注册失败的通知给CSI Pod。而在官方的CSI范例中,CSI是会清理自己在/var/lib/kubelet/plugins_registry目录创建的文件,并退出。因为CSI是一个Daemonset类型部署的Pod,那么在主进程退出之后,K8S会再次部署这个Pod。那么CSI Pod会再次进入CSI注册的主流程,而那个时候,网络就绪了,CSI注册也就会成功。
根据这个信息,向CSI开发确认,他们忽略了通知注册失败的处理,导致注册失败后没有自动恢复。
OK,问题定位清楚了,也趁着这个机会学习了CSI的注册流程。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4