知识卡片
优雅关闭的信号竞态与延迟
内容
Pod 要终止时,Kubernetes 会同时做两件事:给 Pod 发送终止信号,同时通知集群里其他组件”别再往这个 Pod 转发流量了”。问题是 Kubernetes 是分布式系统,这两件事是并行发生的,不保证谁先谁后——完全可能出现”Pod 已经开始优雅关闭流程,但还没等集群其他组件收到不要转发的通知,新请求就已经打过来了”这种时间窗口,这些请求会被拒绝,从客户端角度看就是一次不该发生的错误。解法是故意延迟发送真正的终止信号(用 preStop 钩子睡几秒),把这几秒时间留给”通知集群别再转发流量”这条消息先传播开,等外界确实不会再有新请求进来了,才真正开始关闭流程。发散:这个细节很容易被忽略——只在应用层开启”优雅关闭”支持是不够的,因为竞态发生在应用外部(平台的流量路由更新和终止信号是两条独立的异步消息),必须在平台层面额外买一份时间差保险,纯靠应用自己的关闭逻辑再优雅也堵不住这个窗口。
参考来源
《Cloud Native Spring in Action》第7章《Kubernetes fundamentals for Spring Boot》