当前位置: 首页 > 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.gsyq.cn/news/1629520.html

相关文章:

  • 大模型轻量化选型避坑指南:效果与成本的真实评估方法
  • GalTransl:用AI技术彻底革新Galgame汉化体验的完整指南
  • 慢速HTTP攻击防御实战与LiqunKit工具深度解析
  • Si4732与PIC18F86J11构建高保真收音系统
  • 三步掌握WidescreenFixesPack:让经典游戏在宽屏显示器焕发新生
  • 高斯溅射渲染引擎gsplat:从零构建高性能3D重建开发环境
  • 服务治理——微服务的“交通管理“
  • palera1n越狱深度解析:解锁iOS设备的终极技术方案
  • 5分钟实现Windows毛玻璃特效:DWMBlurGlass美化指南
  • 运营不会写代码,也能用 Codex 做报表自动化和小工具吗?
  • 【lucene】codecs各格式的学习顺序
  • 零失败AI图片生成方案:Stable Diffusion实战指南
  • PCF8591与PIC18F2682的信号转换系统设计与优化
  • NoFences终极指南:免费开源桌面分区工具快速整理Windows桌面
  • AI编程不是替代程序员,而是重写职业契约(附Gartner认证能力矩阵与迁移路线图)
  • 真实场景下的机器学习Pipeline实战指南:从业务理解到模型上线
  • Jmeter压测实战:Shell脚本实现Linux服务器性能实时监控与自动化集成
  • 【信息科学与工程学】计算机科学与自动化——第五十七篇 计算性与不可计算性01
  • IDM激活脚本终极指南:永久解锁下载神器,告别30天试用限制
  • Potrace完全指南:如何将位图完美转换为矢量图形
  • ICM-42605与PIC32MZ的6DOF运动追踪系统设计
  • YOLOv8一站式实战指南:从零掌握图像分类、目标检测与实例分割
  • WidescreenFixesPack:让经典游戏在现代显示器上重获新生的技术解决方案
  • C#集成YOLOv8目标检测:30分钟实现工业视觉应用开发
  • 2026年中国自动驾驶真实图景:L2普及、L3落地与L4盈利全景实测
  • 基于Playwright的UI自动化测试平台:从架构设计到CI/CD集成
  • Automation Prompting:提示即服务的工程化实践
  • OpenCode 接入 Kimi 2.5 的协议桥接实践
  • Android真机与模拟器双场景Burp抓包配置与HTTPS解密实战
  • STM32与IIM-42652传感器的6DoF运动解算实践