1.故障背景

记录k8s驱逐告警过程_文件系统

  上述图片是我司阿里云K8S环境的事件告警。

  • FreeDiskSpaceFailed 磁盘空间不足。(实际剩下还有百分之20可用)

 

2.故障原因

前提环境:由于历史遗留问题,整个线上k8s环境的node所有机器磁盘仅有60G,这在生产上是明显不符合环境使用规范的,线上磁盘空间规划极小;且由于该机器操作更新较多,镜像下载频繁,所以磁盘很快就到告警阈值。

 

3.故障处理

1.磁盘告警处理

由于第一天仅有一个告警FreeDiskSpaceFailed 显示磁盘不足,面临周五下班,根据多年来的运维经验,周五左右不做扩容缩容等操作(非紧急情况下),决定去修改阿里云ack 节点池的kubelet操作,把告警阈值临时调整至90。

记录k8s驱逐告警过程_Pod_02

记录k8s驱逐告警过程_裸设备_03

以上操作后,故障消失。

 

4.故障升级

  周六凌晨夜间4点左右,收到除白天磁盘空间不足外,还多出2个告警,见下图:

记录k8s驱逐告警过程_裸设备_04

  告警显示某些容器的探针失败了,并且表明Kubernetes集群中有一个或多个节点存在不可容忍的污点(Taint)。污点是节点的一个属性,用来阻止一些Pod被调度到这个节点上。当Pod没有对应的容忍度(tolerations)来处理污点时,它就不会被调度到这些节点上。

  上述一共3个事件告警,(实际只有一个),另外2个告警是因为第一个磁盘不足事件而衍生出来的告警,根据排错思路一步一步进行拆解。

 

5.故障原因

  重新开工单联系阿里云售后,售后小哥告知周五调整的阈值是错误的,仔细翻看官网文档后,确实周五调整的是镜像垃圾回收的阈值。

记录k8s驱逐告警过程_文件系统_05

  实际要调整以下参数

记录k8s驱逐告警过程_文件系统_06

  但是这里并不重要,因为要修复该问题,磁盘扩容即可。

  主要是为何出现容器探针失败的问题和pod污点的告警?

  这是由于在k8s中有一个特性叫做“节点压力驱逐”,见下图

记录k8s驱逐告警过程_裸设备_07

  所以才会多出上面2个新的告警,问题是很多,但是解决起来确实较为简单,将磁盘扩容即可。

 

6.故障处理

  将磁盘空间不足的k8s node节点进行磁盘扩容即可。

6.1 云盘扩容流程

记录k8s驱逐告警过程_裸设备_08

 

6.2 第一步,在ECS控制台扩容云盘容量

  1.登录ECS管理控制台

  2.在左侧导航栏,选择存储与快照 > 块存储(云盘)

  3.在页面左侧顶部,选择目标资源所在的资源组和地域。

记录k8s驱逐告警过程_文件系统_09

  4.在云盘页面找到待扩容的目标云盘,进行扩容。

  • 如果云盘挂载的实例状态为运行中,在云盘操作列单击扩容
  • 如果云盘状态为待挂载或云盘挂载的实例状态为已停止,在云盘操作列选择 > 扩容

    也可以选择多块云盘,在列表下方单击扩容,批量扩容多块云盘。

  5.在确定目标盘与须知向导页面,单击已知晓并备份,继续扩容

  6.在配置扩容方式与容量向导页面,设置扩容参数。

记录k8s驱逐告警过程_裸设备_10

在确认扩容结果向导页面,待扩容结果列显示为成功时,在页面左下角单击下一步,扩容分区和文件系统。

记录k8s驱逐告警过程_Pod_11

8.在确认扩容结果向导页面,待扩容结果列显示为成功时,在页面左下角单击下一步,扩容分区和文件系统。(付完钱,磁盘空间才会增加)

记录k8s驱逐告警过程_裸设备_12

 

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

记录k8s驱逐告警过程_Pod_13

  如下图所示,输出CHANGED字样时,表示分区扩容成功。

记录k8s驱逐告警过程_Pod_14

 

  2.扩容文件系统

  运行以下命令,获取需要扩容的文件系统的类型和挂载目录。

df -Th

  Type值为文件系统类型,Mounted on值为分区的挂载目录。如下图表示/dev/vdb1分区的文件系统类型为ext4,挂载目录为/mnt。

记录k8s驱逐告警过程_文件系统_15

  如果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.参考

https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction/?spm=5176.2020520104.0.0.f49f709ayVUCVR

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/customize-the-kubelet-configurations-of-a-node-pool?spm=5176.2020520104.console-base_help.dexternal.77ed709aDb9c73

https://help.aliyun.com/zh/ecs/user-guide/extend-the-partitions-and-file-systems-of-disks-on-a-linux-instance?spm=a2c4g.11186623.0.i14#50541782adxmp

作者:小家电维修