llhuii / dive-into-k8s

Apache License 2.0
0 stars 0 forks source link

k8s api server设置信号处理 #8

Open llhuii opened 3 years ago

llhuii commented 3 years ago

https://code.k8s.io/staging/src/k8s.io/apiserver/pkg/server/signal.go 当连续两次收到SIGTERM/SIGINT时, 进程退出.

比如调试时, 连续按两次Ctrl-C即可让程序退出.

为什么要连续两次? 为了进程优雅的退出 第一次时, 通知进程准备停止了, 请做好资源清理

对应到代码:

  1. 程序一开始设置系统信号回调函数, 返回一个golang context
  2. 程序将该context往下传递, 其余逻辑根据该context.Done来获取是否停止的信号

当进程第一次收到信号时, cancel context, 第二次收到信号时, os.Exit(1):

ctx, cancel := context.WithCancel(context.Background())
signal.Notify(shtudownHandler, shutdownSignals...)
go func() {
<-shutdownHandler
cancel()
<-shutdownHandler
os.Exit(1)
}