如何正常关闭Kubernetes上运行的Go服务

时间:2019-01-17 15:20:47

标签: linux docker go kubernetes signals

我有一个用Go语言编写的API,该API已被Docker化,并在GKE的Kubernetes集群中运行。

目前,我的API服务器无法处理任何关闭情况,例如Pod垂死或故意关闭。

我应该期望捕获哪些UNIX信号集以正常关闭服务器,什么情况会触发它们?例如当机,K8关机等。

1 个答案:

答案 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
}