runc hang 导致 Kubernetes 节点 NotReady

本文讲述了在 Kubernetes 集群中遇到节点 NotReady 问题,原因是 runc v1.0.0-rc93 存在 bug 导致 docker hang。通过分析,确定问题与 pipe 容量不足有关。解决方案包括增大 pipe-user-pages-soft 限制和升级 runc 到 v1.1.1。文中详细介绍了问题的复现、根本原因及修复思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kubernetes 1.19.3

OS: CentOS 7.9.2009

Kernel: 5.4.94-1.el7.elrepo.x86_64

Docker: 20.10.6

先说结论,runc v1.0.0-rc93 有 bug,会导致 docker hang 住。

发现问题

线上告警提示集群中存在 2-3 个 K8s 节点处于 NotReady 的状态,并且 NotReady 状态一直持续。

  • kubectl describe node,有 NotReady 相关事件。

  • 登录问题机器后,查看节点负载情况,一切正常。

  • 查看 kubelet 日志,发现 PLEG 时间过长,导致节点被标记为 NotReady。

  • docker ps 正常。

  • 执行 ps 查看进程,发现存在几个 runc init 的进程。runc 是 containerd 启动容器时调用的 OCI Runtime 程序。初步怀疑是 docker hang 住了。

要解决这个问题可以通过两种方法,首先来看一下 A 方案。

解决方案 A

针对 docker hang 住这样的现象,通过搜索资料后发现了以下两篇文章里也遇到了相似的问题:

  • docker hang 问题排查[https://www.likakuli.com/posts/docker-hang/]

  • Docker hung 住问题解析系列(一):pipe 容量不够[https://juejin.cn/post/6891559762320703495]

这两篇文章都提到了是由于 pipe 容量不够导致 runc init 往 pipe 写入卡住了,将 /proc/sys/fs/pipe-user-pages-soft 的限制放开,就能解决问题。

于是,查看问题主机上 /proc/sys/fs/pipe-user-pages-soft 设置的是 16384。所以将它放大 10 倍 echo 163840 > /proc/sys/fs/pipe-user-pages-soft,然而 kubelet 还是没有恢复正常,pleg 报错日志还在持续,runc init 程序也没有退出。

考虑到 runc init 是 kubelet 调用 CRI 接口创建的,可能需要将 runc init 退出才能使 kubelet 退出。而根据文章中的说明,只需要将对应的 pipe 中的内容读取掉,runc init 就能退出。因为读取 pipe 的内容可以利用「UNIX/Linux 一切皆文件」的原则,通过 lsof -p 查看 runc init 打开的句柄信息,获取写入类型的 pipe 对应的编号(可能存在多个),依次执行 cat /proc/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值