作為在 kubernetes 中擴展 pod 的一部分,我想確保在關閉之前優雅地為我的 http 連接提供服務。在某種程度上,我已經在 go 中實現了這段代碼:package mainimport ( "fmt" "io" "net/http" "os" "os/signal" "syscall" "github.com/braintree/manners")func main() { shutdown := make(chan int) //create a notification channel to shutdown sigChan := make(chan os.Signal, 1) //start the http server http.HandleFunc("/", hello) server := manners.NewWithServer(&http.Server{Addr: ":80", Handler: nil}) go func() { server.ListenAndServe() shutdown <- 1 }() //register for interupt (Ctrl+C) and SIGTERM (docker) signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) go func() { <-sigChan fmt.Println("Shutting down...") server.Close() }() <-shutdown}func hello(w http.ResponseWriter, r *http.Request) { // time.Sleep(3000 * time.Millisecond) io.WriteString(w, "Hello world!")}這會尋找 docker SIGTERM 并在現有請求得到服務后正常關閉。當我在具有 10 個實例的 kubernetes 中運行這個容器時,只要我不縮減到單個實例,我就可以毫無意外地擴展和縮減。當我擴展到單個實例時,我看到一組簡短的 http 錯誤,然后一切看起來都很好。我覺得很奇怪,因為在擴展時我會假設代理首先更新,然后容器被關閉,上面的代碼將允許提供請求。在我當前的設置中,我正在運行 2 個節點,也許問題是當擴展低于節點數量時,并且 etcd 更新存在某種計時問題?對這里發生的事情的任何見解都會非常有用
2 回答

九州編程
TA貢獻1785條經驗 獲得超4個贊
有一個小窗口,在此期間,正在移除但仍處于活動狀態的 Pod 將成為負載平衡集的一部分。正如 Brendan 剛剛說的(他以幾秒鐘的優勢擊敗了我),準備就緒檢查應該完全在你的控制之下為你解決這個問題。
- 2 回答
- 0 關注
- 182 瀏覽
添加回答
舉報
0/150
提交
取消