TKE集群,一次磁盘挂载问题处理

2020-10-26 00:39:29 浏览数 (1)

1. 导语

随着云原生概念的普及,越来越多的企业,已经将业务迁移到容器平台上,以充分利用容器、Kubernetes、服务网格来完成基础架构的转型升级。

然而,在业务上云过程中,不可避免的遇到使用上的问题。这里,我们以腾讯云容器服务TKE为例,分析一次PVC卷挂载异常的处理过程。

2. 背景介绍

Kubernetes 官方层面,支持多种存储形式的挂载,常见的类型有:

  1. hostPath:挂载host 机器上的一个文件,或者目录到业务pod内部。对大部分业务pod 来说,不需要此种配置。
  2. emptyDir:在pod运行前,预先创建。其生命周期,伴随Pod;如果Pod被删除,内部数据将会永远消失,但是Pod重启不会清除对应数据。一个使用场景,即在业务Crash后,作为数据还原点。
  3. secret:常用来存储一些敏感数据,如密码——需要事先创建,然后挂载到Pod内部。
  4. nfs:支持网络文件系统挂载,可以被多个Pod共同挂载,从而实现数据文件在Pod间的共享。
  5. csi:容器存储接口,可以向容器编排系统暴露任意类型的存储,进而挂载到业务Pod内,其使用形式目前多基于PVC。
  6. downwardApi:可以环境变量或者volume file 形式,暴露pod或者容器自身的信息,到业务容器内部。
  7. pvc:可以用来挂载一个持久化存储卷PersistentVolume,使用过程中,可以屏蔽底层的存储类型,如磁盘、文件存储等。
  8. configMap:将配置数据放在配置集中,后续可以作为volume 挂载到Pod内,也可以作为容器内部的环境变量——需要事先创建,使用较为广泛。

腾讯云TKE,针对以上大部分类型,已有对应的支持。这里,我们来看一个PVC挂载使用报错的问题。

业务异常:

查看事件报错:kubectl get ev -n ***, 发现如下异常:

磁盘挂载报错磁盘挂载报错

比较明显的,可以看出业务Pod 运行前,磁盘挂载操作失败。对应的磁盘,依然占用未被释放。

3. 场景分析

(1)查看Pod 挂载的 pvc:

代码语言:javascript复制
kubectl describe pod *** -n *** |grep -3 -i persis

(2)查看PVC对应PV:

代码语言:javascript复制
kubectl get pvc vol-****-c0woyfk2ycw0-22 -n **** 

业务Pod PVC 绑定的volume 即:pvc-65273f8d-64f8-11ea-b2dc-525400e94be5

(3)查看PV对应的磁盘信息:

代码语言:txt复制
kubectl get pv pvc-65273f8d-64f8-11ea-b2dc-525400e94be5  -o yaml |grep -3 -i disk 

(4)查看磁盘挂载的CVM信息:

在云服务器控制台,云硬盘模块,键入对应的磁盘ID,即可过滤出特定的磁盘信息。然后,点击进入,查询该磁盘所属的CVM实例信息。

(5)登陆CVM,排查异常,检查磁盘是否依然被占用;

登陆CVM过程,此处忽略,首先查看磁盘对应信息:

代码语言:javascript复制
查看磁盘设备信息
#ls /dev/disk/by-id

然后,使用lsof 命令排查对应磁盘是否被进程占用:

代码语言:javascript复制
#以 vdb 磁盘为例
#lsof /dev/vdb 

如果是,kill 释放;反之,尝试手动umount在CVM内部卸载,随后在CVM控制台卸载对应磁盘。

4. 解决处理

参考相关资料,磁盘挂载的过程,有遵循以下流程,即:

Provision -> Attach -> Mount; Unmount -> Detach -> Delete

  • Provision: 创建磁盘
  • Attach:绑定磁盘到CVM机器
  • Mount:挂载磁盘到特定路径下
  • UnMount:卸载磁盘设备
  • Detach:解除磁盘跟CVM的绑定
  • Delete:删除磁盘

所以,参考磁盘挂载流程及上述场景分析,在特定CVM上排查处理即可:

(1)lsof 排查未未释放进程,手动kill

(2)将已经mount 的磁盘,进行unmount , 然后在CVM 控制台上卸载对应磁盘。

至此:挂盘问题修复-》新Pod挂载PVC成功-》业务Pod运行起来。

5. 参考资料

https://kubernetes.io/docs/concepts/storage/volumes

0 人点赞