spec: contaienrs: - name: my-container lifecycle: preStop: httpGet: path: "/stop" port: 8080 scheme: "HTTP"
任务状态和任务信息保存在 DB 中, 修改代码逻辑,在服务里面加一些请求处理,服务增加优雅关闭处理,能够处理 sigterm 的信号。
从 k8s 角度:
使用自定义钩子
Deployment 资源支持以下几种钩子:
PostStart 钩子:在容器启动后立即执行。这通常用于执行容器启动后的初始化任务,例如等待其他服务启动、注册服务到服务发现系统等。
PreStop 钩子:在容器关闭之前执行。这通常用于执行容器关闭前的清理任务,例如保存数据、关闭连接、发送信号给其他进程等。
在关闭之前执行一些持久化操作,比如 可以执行一个 HTTP GET 请求 或者 exec 命令,并且它们执行是阻塞的,可以利用这个特性来做优雅停止。
调用 HTTP GET
修改 terminationGracePeriodSeconds , 将它调整到合适的值,不要过大。
terminationGracePeriodSeconds 等于 服务优雅退出超时时间和 preStopHook 之和
第二,没有持久化的话,本身这个程序也不可靠,总会遇到异常崩溃吧。
单纯想更新后不丢任务,可以让程序监听到 terminal 后主动找个地方存一下,启动时再去读。