挂载数据盘当kubelet目录后,kubelet无法执行CSI的UmountDevice操作

简介: 当挂载数据盘,并通过shared bind mount 分别挂载到kubelet和containerd目录后,kubelet无法执行CSI的UmountDevice操作

环境

挂载自定义数据盘当kubelet目录的集群

现象

当使用EBS PV的Pod被删除并重新调度到另一个节点时,EBS盘从原节点解绑,并绑定到新节点的时间很长,在6分钟左右,也堵塞了新Pod启动的时间。

原因分析

背景

当前我们挂载自定义数据盘vdb当/var/lib/kubelet目录的方式为:

  1. 将vdb mount 到 /mnt/vdb目录下
  2. 创建 /mnt/vdb/containerd 、/mnt/vdb/kubelet、 /mnt/vdb/containerd/log/pods目录,分别shared bind mount 到 /var/lib/containerd 、 /var/lib/kubelet、/var/log/pods目录下

网络异常,图片无法展示
|

当节点上的Pod需要使用EBS PV的时候,ebs盘会被CSI挂载到/var/lib/kubelet/plugins/kubernetes.io/csi/pv/{pvcName}/globalmount 目录下,在上述情况下,因为bind mount默认使用的shared传播(原始挂载的子挂载公开给副本挂载,副本挂载的子挂载也传播给原始挂载。),因此,在/proc/self/mountinfo里会有如下两个Item:

网络异常,图片无法展示
|

问题

当EBS PV从一个节点被调度到另一个节点,需要在旧节点上经历UmountVolume、UmountDevice,DetachVolume,在新节点上经历AttachVolume,MountDevice、MountVolume这六个流程。

在kubelet执行UmountDevice前,会调用GetDeviceMountRefs("/var/lib/kubelet/plugins/kubernetes.io/csi/pv/{pvcName}/globalmount")方法,查看该挂载点是否存在相关的另一个挂载点,在上述例子中就会返回"/mnt/vdb/kubelet/plugins/kubernetes.io/csi/pv/pvc-2c1845ae-fc5f-426d-a802-a0bdc47e942c/globalmount",导致kubelet报错 "xxx is still mounted by other references",从而不会执行UmountDevice,堵塞中PV调度流程,在失败并超时6分钟以后,会跳过UmountDevice,强制执行DetachVolume。同时,会导致节点上残留了旧的无效挂载点。


我观察到阿里云的ACK服务,同样使用了该方式挂载自定义数据盘当kubelet目录,但并没有发现kubelet有如上无法UmountDevice的现象,所以想请教下,ACK中的kubelet是做了什么优化改动吗?比如修改了GetDeviceMountRefs相关方法?

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
开发工具 对象存储
nfs挂载报错问题
nfs挂载报错问题
103 0
|
5月前
|
存储 Kubernetes API
在K8S中,PVC创建和挂载失败原因有哪些?
在K8S中,PVC创建和挂载失败原因有哪些?
|
5月前
|
存储 Kubernetes 网络安全
[k8s]使用nfs挂载pod的应用日志文件
[k8s]使用nfs挂载pod的应用日志文件
201 1
|
5月前
|
Kubernetes Unix 数据库
一个恢复CSI挂载信息的解决方法
一个恢复CSI挂载信息的解决方法
56 4
|
5月前
|
存储 Kubernetes 调度
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(NFS网络存储)
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(NFS网络存储)
75 0
|
5月前
|
存储 Kubernetes API
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(PV&PVC)
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(PV&PVC)
76 0
|
8月前
|
存储 Kubernetes 应用服务中间件
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
705 0
|
存储 Kubernetes Perl
Kubernetes 在等待 pod 中的 PVC 或 PV 挂载时超时
Kubernetes 在等待 pod 中的 PVC 或 PV 挂载时超时
725 0
|
Kubernetes Linux 程序员
【kubernetes】分享一个卸载由 kubeadm 创建的k8s集群的脚本
【kubernetes】分享一个卸载由 kubeadm 创建的k8s集群的脚本
157 0
|
Kubernetes Perl 容器
【kubernetes】ConfigMap: 在 Pod 中挂载文件(非目录)
【kubernetes】ConfigMap: 在 Pod 中挂载文件(非目录)
699 4

热门文章

最新文章