当前位置: 首页 > news >正文

Go 服务优雅停机:K8s 发 SIGTERM 后不是立刻消失

Go 服务优雅停机:K8s 发 SIGTERM 后不是立刻消失

Go 服务部署在 K8s 后,优雅停机经常被忽略。Pod 被滚动更新时会收到 SIGTERM,如果服务没有停止接收新请求、等待进行中请求结束、关闭连接池,就可能产生一批莫名其妙的 502 或处理中断。

优雅停机不是形式主义,它决定发布时用户是否被无辜打断。

一、停机链路要清楚

flowchart TD A[K8s SIGTERM] --> B[Stop Accepting] B --> C[Drain Requests] C --> D[Close Resources] D --> E[Exit]

K8s 不会读心。应用收到信号后,需要自己处理生命周期。

二、Go HTTP Server 支持 Shutdown

srv := &http.Server{Addr: ":8080", Handler: router} go func() { if err := srv.ListenAndServe(); err != http.ErrServerClosed { log.Fatal(err) } }() ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() _ = srv.Shutdown(ctx)

Shutdown会停止接收新连接,并等待已有请求完成,直到 context 超时。

三、K8s 配置要配合

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

preStop 可以给负载均衡摘流量一点时间。具体配置要结合网关和服务发现机制测试。

四、长请求要有上限

如果请求可能跑几分钟,停机就会拖很久。服务应该设置请求超时,并对长任务异步化。

shutdown_policy: max_request_time: 15s async_jobs: resumable force_exit_after: 30s

优雅停机不是无限等待。超过窗口仍要退出,否则发布会卡住。

还要处理 readiness。收到 SIGTERM 后,可以先让 readiness 失败,让流量入口停止转发,再等待已有请求完成。

var shuttingDown atomic.Bool func readiness(w http.ResponseWriter, r *http.Request) { if shuttingDown.Load() { w.WriteHeader(http.StatusServiceUnavailable) return } w.WriteHeader(http.StatusOK) }

这样服务不是一边准备退出,一边继续接新请求。生命周期信号要和探针配合。

五、总结

Go 服务在 K8s 中要处理 SIGTERM、停止接收新请求、等待已有请求、关闭资源,并与 terminationGracePeriod 和 preStop 配合。

Pod 不是立刻消失,但也不会永远等你。生命周期写清楚,滚动发布才真的平滑。

上线前可以做一次演练:压测中滚动发布,观察 5xx、请求耗时和连接关闭情况。优雅停机只有被验证过,才不是纸面配置。

http://www.jsqmd.com/news/1117544/

相关文章:

  • 第二章Netty,入门版HelloWorld
  • Context Engineering 2026年中实战:Prompt、记忆、RAG、工具与评估五位一体
  • 3步掌握ComfyUI-WanVideoWrapper:让AI视频生成变得简单[特殊字符]
  • 数字控制DC-DC降压转换器设计与PIC32MZ实现
  • Play Integrity Fix解决方案:Android设备认证修复技术路径
  • 企业级分布式监控系统部署实战:构建高可用网络监控架构
  • 大模型轻量化选型避坑指南:效果与成本的真实评估方法
  • GalTransl:用AI技术彻底革新Galgame汉化体验的完整指南
  • 【AI编程实战避坑指南】:20年技术老兵亲述3大血泪教训与5个立竿见影优化策略
  • 如何快速解决Windows软件运行问题:一站式Visual C++运行库终极方案
  • git rebase到底是什么意思?
  • AI对话系统中的JSON结构化记忆设计与实践
  • 戴森球计划终极蓝图指南:从新手到大师的工厂设计革命
  • 思源宋体中文版:7种字重免费商用字体完全指南
  • ModelOps实战指南:破解模型上线后的七大致命断点
  • AI护航五层实时架构:从输入净化到人工接管的工程实践
  • 为什么你的Custom Instructions总被覆盖?揭秘模型推理链中第4层token-level指令拦截机制(附可复现调试工具包)
  • 三步掌握WidescreenFixesPack:让经典游戏在宽屏显示器焕发新生
  • 通往AGI的具身之路——TVA自适应协同进化系统(4)
  • 2026年最新实用英语教学软件推荐 帮你避开选品的常见误区
  • 怎样免费实现百度网盘高速下载:5分钟部署直链解析工具终极指南
  • 5步快速上手:XUnity Auto Translator终极Unity游戏翻译指南
  • Si4732与PIC18F86J11构建高保真收音系统
  • 慢速HTTP攻击防御实战与LiqunKit工具深度解析
  • 高斯溅射渲染引擎gsplat:从零构建高性能3D重建开发环境
  • 土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测
  • palera1n越狱深度解析:解锁iOS设备的终极技术方案
  • OBS多平台直播插件终极指南:一键同步推流到8个平台的完整解决方案
  • 惠普暗影精灵笔记本终极性能管理指南:OmenSuperHub免费开源方案
  • 运营不会写代码,也能用 Codex 做报表自动化和小工具吗?