我有一个用Go语言编写的API,该API已被Docker化,并在GKE的Kubernetes集群中运行。
目前,我的API服务器无法处理任何关闭情况,例如Pod垂死或故意关闭。
我应该期望捕获哪些UNIX信号集以正常关闭服务器,什么情况会触发它们?例如当机,K8关机等。
答案 0 :(得分:3)
Kubernetes发送NULL
信号。因此,正常关机可能如下所示:
SIGTERM
此外,您还应该将“活力和就绪”探针添加到您的广告连播中:
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
)
func main() {
var srv http.Server
idleConnsClosed := make(chan struct{})
go func() {
sigint := make(chan os.Signal, 1)
// interrupt signal sent from terminal
signal.Notify(sigint, os.Interrupt)
// sigterm signal sent from kubernetes
signal.Notify(sigint, syscall.SIGTERM)
<-sigint
// We received an interrupt signal, shut down.
if err := srv.Shutdown(context.Background()); err != nil {
// Error from closing listeners, or context timeout:
log.Printf("HTTP server Shutdown: %v", err)
}
close(idleConnsClosed)
}()
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
// Error starting or closing listener:
log.Printf("HTTP server ListenAndServe: %v", err)
}
<-idleConnsClosed
}