Как корректно завершить работу службы Go, работающей в Kubernetes - PullRequest
0 голосов
/ 17 января 2019

У меня есть API, написанный на Go, который был Dockerised и работает в кластере Kubernetes на GKE.

В настоящий момент мой API-сервер не обрабатывает сценарии выключения, например, умирает или умирает модуль Pod.

Какой набор сигналов UNIX следует ожидать для ловкого отключения сервера и какие обстоятельства могут их вызвать? Например, сбои, выключения K8s и т. Д.

1 Ответ

0 голосов
/ 17 января 2019

Kubernetes посылает сигнал 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
}

Также вы должны добавить датчики живучести и готовности в свои капсулы:

livenessProbe:
  httpGet:
    path: /health
    port: 80
readinessProbe:
  httpGet:
    path: /health
    port: 80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...