临时存储超限导致的Pod集体驱逐故障排查

背景

        在某天的下午,我们突然收到告警,埋点服务的接口报大量502,持续了大约2分钟,然后就自动恢复了,于是便开始排查问题所在。

排查过程

        在上面的故障现象中,我们首先怀疑是微服务出现了问题,因此进行了以下排查:

        1.登录KubeSphere控制台后,我们发现埋点服务的所有Pod副本都是刚刚重新生成的,这意味着Pod副本集体挂了,为什么会集体挂掉呢?

        2.接着,通过查看K8s事件日志,我们发现这些Pod都是由于临时存储超限而被驱逐的,而且时间点非常接近。然而,我们已经配置了PDB和优雅停机机制,为什么这些措施没有生效呢?

        尽管我们已经找到了故障的原因,但仍需进一步分析以解决上述疑惑。请继续往下看。

问题分析结果

        经过一番分析和了解,我们终于找到答案,解决上述的困惑,具体如下:

为什么Pod副本几乎同时被驱逐?

因为程序会往Pod的/tmp目录写临时数据,由于密集产生临时文件导致临时存储(ephemeral-storage )使用超限,导致Pod被驱逐(Evicted)。

为什么PDB和优雅停机不生效?

在非自愿中断的情况下,例如节点硬件故障或由于资源压力导致 kubelet 驱逐 Pod,则不受 PDB 控制,所以才导致此次驱逐事件业务感知较大。我根据Pod驱逐是否遵循PDB和优雅停机的主要情况进行梳理,如下图

ephemeral storage知识点

        在 K8s 中,ephemeral storage 是指在 Pod 生命周期内可用的临时存储空间。这些存储空间在 Pod 被删除或重新调度时会被清空。ephemeral storage 包括以下几种类型的临时存储:

Container Writable Layer:容器可写层,用于存储容器中产生的临时文件、缓存等。

Log Storage:K8s 会将容器的标准输出和标准错误日志写入到节点上的日志文件中。这些日志文件也被视为 ephemeral storage 的一部分。

EmptyDir Volume:EmptyDir的默认存储类型为磁盘,属于ephemeral storage,但如果将EmptyDir的medium定义为Memory,则EmptyDir的大小将受Memory Limit限制,如下是官方的文档截图:

结语

        通过此次故障的排查和分析,不仅让我们深入了解Pod的驱逐场景,也让我们更加重视临时存储(ephemeral storage)的使用情况,并迅速补充了对Pod临时存储的监控。本次分享就到这里,谢谢!

 欢迎订阅我的公众号「SRE运维手记」,可扫下方二维码,或者微信搜“SRE运维手记”

e45dc07b6fd04114a9f5fe6f4772a886.jpeg

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值