每次滚动发布,监控里都有一批任务状态卡在 RUNNING 再也没更新,单次发布丢 300 多个,Pod 的 preStop 只配了 5 秒。日志里能对上时间点,这种反而好排。

容器收到终止信号后 5 秒就被 kill,线程池还没来得及把队列里的任务跑完。shutdown 之后的 awaitTermination 也没写,进程直接消失。这一点先确认清楚,后面就不用反复试。

lifecycle:
  preStop:
    exec:
      command: ["sh", "-c", "sleep 30"]

这次卡住的地方就在「优雅停机丢任务」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

处理上按这个顺序:preStop 的时长按最长任务耗时加缓冲来配 给到 30 秒;收到信号后停止接新任务 先 shutdown;awaitTermination 等到队列清空 超时才 shutdownNow;把未完成任务数打到日志里 发布后核对。

结果对不对很好判断,下一次发布后未完成任务数为 0,监控里没有卡在 RUNNING 的记录。

作者 9823189