一、 java?bootstrap.yml??
bootstrap.yml 啟動文件增加timeout-per-shutdown-phase?
spring:lifecycle:timeout-per-shutdown-phase: 30m# 這個值是故意設置這么大的,因為現在推理服務支持深度思考# 為了保證用戶側的連接不被斷開,因此我們需要設置超大 graceful shutdown 時間# 注意: 為了保證這個值是有效的,需要確保 k8s 中的 terminationGracePeriod 不低于此時間# 否則 k8s 會強制殺死 pod(這個值相當于不生效)# 上線前需要檢查 nacos 中是否有這個配置,防止配置被覆蓋
timeout-per-shutdown-phase:?
服務主進程優雅退出的時間 默認30s,配置該參數后可以實現如果當前還有未斷開的鏈接那么主進程會在給定的時間后強制退出。
應用場景下:
當程序收到 kill -15的信號java默認timeout-per-shutdown-phase的參數為30s 也就說等待30s后pod內的進程就會自動退出(kill -9)之后就會與上游的服務斷開鏈接,如果上游的服務有復用鏈接的特性那么會更為明顯。屆時客戶端就會接受到503(服務暫時不可用)的http狀態碼。
二、k8s yaml 增加配置
lifecycle:preStop:exec:command:- sh- -c- sleep 70terminationGracePeriodSeconds: 1800
?配置解釋:
preStop:
必須配置,否則每次發布k8s的pod進入到Terminating狀態后,會立刻刪除pod網絡相關的配置例如Pod Ip 、路由等
應用場景下:?
配置preStop后pod會進入到Terminating狀態同時會從endpointSlice上摘除這個節點,也就意味著該節點不會接收新的流量,但是pod的IP以及網絡配置還是存在的因為pod沒有進入到回收的階段還在sleep, 通過preStop鉤子 進入到sleep階段 這個時候就會將已經進入到該pod的請求繼續進行處理,不會強制中斷和上游的鏈接
terminationGracePeriodSeconds:
給定pod最大回收的時間,我這里配置了1800s,pod一旦超過了30分鐘即使還有未中斷的鏈接(沒有處理完的請求) 都會強制被回收。