Skip to content

K8s Exited With 137 When Rolling Update

🏷️ Kubernetes

k8s 滚动升级时报了 exited with 137 错误:

Exec lifecycle hook ([sleep 40s]) for Container "xxx" in Pod "xxx_xxx(xxx)" failed - error: command 'sleep 40s' exited with 137: , message: ""

这个应该是在容器关闭时报的错。网上查 137 这个错好多都说是内存不足导致的,这里容器的内存应该是够的。

经过调查发现是容器部署的配置中 spec.template.spec.terminationGracePeriodSeconds 值为 30 导致的。

terminationGracePeriodSeconds 是容器优雅关机的最大允许时间,超过这个时间 k8s 会强制关闭 pod ,估计是这个操作导致返回了 137 错误代码。

按照这篇博客中的说法,terminationGracePeriodSeconds 并不是从 preStop 钩子执行结束后才开始计时,而是从关闭流程开始计时的。

preStop Hook 原本是想延迟 40 秒关闭服务(sleep 40s),但是在 30 秒的时候,由于已经超出了 terminationGracePeriodSeconds 设置的最大允许时间,此时会使用 SIGKILL 命令来强制结束进程。

SIGKILL 信号的返回值为 9,至于为何会返回 137 感兴趣的可以看一下这篇博客

综上,在上面的例子中,将 terminationGracePeriodSeconds 设为大于 40 的值(如 60)就可以避免这个错误了。

参考链接:

  1. [K8S] 如何利用terminationGracePeriodSeconds 优雅地关闭你的服务?
  2. 如何利用terminationGracePeriodSeconds优雅地关闭你的服务
  3. kubernetes pod内容器状态OOMKilled和退出码137全流程解析