1.故障背景
上述图片是我司阿里云K8S环境的事件告警。
- FreeDiskSpaceFailed 磁盘空间不足。(实际剩下还有百分之20可用)
2.故障原因
前提环境:由于历史遗留问题,整个线上k8s环境的node所有机器磁盘仅有60G,这在生产上是明显不符合环境使用规范的,线上磁盘空间规划极小;且由于该机器操作更新较多,镜像下载频繁,所以磁盘很快就到告警阈值。
3.故障处理
1.磁盘告警处理
由于第一天仅有一个告警FreeDiskSpaceFailed 显示磁盘不足,面临周五下班,根据多年来的运维经验,周五左右不做扩容缩容等操作(非紧急情况下),决定去修改阿里云ack 节点池的kubelet操作,把告警阈值临时调整至90。
以上操作后,故障消失。
4.故障升级
周六凌晨夜间4点左右,收到除白天磁盘空间不足外,还多出2个告警,见下图:
告警显示某些容器的探针失败了,并且表明Kubernetes集群中有一个或多个节点存在不可容忍的污点(Taint)。污点是节点的一个属性,用来阻止一些Pod被调度到这个节点上。当Pod没有对应的容忍度(tolerations)来处理污点时,它就不会被调度到这些节点上。
上述一共3个事件告警,(实际只有一个),另外2个告警是因为第一个磁盘不足事件而衍生出来的告警,根据排错思路一步一步进行拆解。
5.故障原因
重新开工单联系阿里云售后,售后小哥告知周五调整的阈值是错误的,仔细翻看官网文档后,确实周五调整的是镜像垃圾回收的阈值。
实际要调整以下参数
但是这里并不重要,因为要修复该问题,磁盘扩容即可。
主要是为何出现容器探针失败的问题和pod污点的告警?
这是由于在k8s中有一个特性叫做“节点压力驱逐”,见下图
所以才会多出上面2个新的告警,问题是很多,但是解决起来确实较为简单,将磁盘扩容即可。
6.故障处理
将磁盘空间不足的k8s node节点进行磁盘扩容即可。
6.1 云盘扩容流程
6.2 第一步,在ECS控制台扩容云盘容量
1.登录ECS管理控制台。
2.在左侧导航栏,选择存储与快照 > 块存储(云盘)。
3.在页面左侧顶部,选择目标资源所在的资源组和地域。
4.在云盘页面找到待扩容的目标云盘,进行扩容。
- 如果云盘挂载的实例状态为运行中,在云盘操作列单击扩容。
- 如果云盘状态为待挂载或云盘挂载的实例状态为已停止,在云盘操作列选择 > 扩容。
也可以选择多块云盘,在列表下方单击扩容,批量扩容多块云盘。
5.在确定目标盘与须知向导页面,单击已知晓并备份,继续扩容。
6.在配置扩容方式与容量向导页面,设置扩容参数。
在确认扩容结果向导页面,待扩容结果列显示为成功时,在页面左下角单击下一步,扩容分区和文件系统。
8.在确认扩容结果向导页面,待扩容结果列显示为成功时,在页面左下角单击下一步,扩容分区和文件系统。(付完钱,磁盘空间才会增加)
6.3 第二步,在操作系统中扩容分区和文件系统
1.扩容分区
本操作以公共镜像Alibaba Cloud Linux 3.2104 LTS 64位操作系统、在ECS实例内部将云盘分区/dev/vdb1由40 GiB扩容至60 GiB(已在控制台扩大容量为60 GiB)为例,请您根据实际环境进行操作。
运行以下命令,扩容指定分区。例如扩容分区名称为/dev/vdb1的分区,则执行如下命令。
注意:
- 命令参数中的/dev/vdb和1之间需要空格分隔,1是分区编号。
- 如果扩容的是系统盘,命令中的/dev/vdb需要替换为/dev/vda。
小于2T MBR分区命令:
type growpart || sudo yum install -y cloud-utils-growpart
sudo yum update cloud-utils-growpart
sudo LC_ALL=en_US.UTF-8 growpart /dev/vdb 1
如下图所示,输出CHANGED字样时,表示分区扩容成功。
2.扩容文件系统
运行以下命令,获取需要扩容的文件系统的类型和挂载目录。
df -Th
Type值为文件系统类型,Mounted on值为分区的挂载目录。如下图表示/dev/vdb1分区的文件系统类型为ext4,挂载目录为/mnt。
如果Filesystem取值后缀不带数字(例如/dev/vdc),则为裸设备。
扩容文件系统。
扩容云盘分区/dev/vdb1的ext*文件系统为例,则运行如下命令:
sudo resize2fs /dev/vdb1
扩容裸设备/dev/vdb的ext*文件系统为例,则运行如下命令:
sudo resize2fs /dev/vdb
运行以下命令,确认是否扩容成功。
如下图所示,分区/dev/vdb1文件系统容量(59 GiB)和云盘容量(60 GiB)基本一致(因为文件系统本身会占用部分存储空间),表示扩容完成。
7.总结
本次故障总结及其简单,k8s node磁盘空间不足,扩容磁盘即可解决。
但衍生出来的问题需要特别关注,知其所以然,如k8s节点的压力驱逐。
以及前期集群规划时服务器资源是否是在合理范围。
8.参考
作者:小家电维修