Kubernetes 滚动更新导致 Nacos 服务瞬断?从 preStop 到优雅下线完整拆解

📅 2026/7/17 22:55:58 👁️ 阅读次数 📝 编程学习
Kubernetes 滚动更新导致 Nacos 服务瞬断?从 preStop 到优雅下线完整拆解

适用场景与边界

适合以下场景:

  • 服务运行在 Kubernetes 中。
  • 服务同时注册到 Nacos,调用方通过 Nacos 做服务发现。
  • 发布或重启时偶发Connection refusedRead timed out、5xx。
  • 服务是 Spring Boot / Spring Cloud 微服务,支持优雅关闭。

不适合直接照搬的场景:

  • 服务只通过 Kubernetes Service 调用,不接入 Nacos。
  • 使用 Dubbo、Consul、Eureka 等其他注册中心,API 语义不同。
  • 服务是长连接、消息消费或批处理任务,需要单独设计 drain 逻辑。

一、为什么 K8s 滚动更新还会请求失败

Kubernetes 终止 Pod 的流程大致是:

1. Pod 进入 Terminating 2. 从 Service Endpoints 中移除 3. 执行 preStop hook 4. 给容器主进程发送 SIGTERM 5. 等待 terminationGracePeriodSeconds 6. 超时后 SIGKILL 强杀

如果服务只通过 Kubernetes Service 调用,这套机制基本够用。

但很多 Spring Cl