平衡kube-apiserver流量

问题现象

多个kube-apiserver,重启单个kube-apiserver,会导致请求集中到其他kube-apiserver上,重启的kube-apiserver几乎没有收到请求。

问题分析

重启kube-apiserver,client因连接断开而重连到其他kube-apiserver。
client与kube-apiserver之间使用HTTP2连接,短连接和长连接请求都会复用同一个TCP长连接。

解决问题

在k8s 1.18版本中,kube-apiserver新增了--goaway-chance的启动参数,有效范围是[0,0.02),0表示不开启,只有1个kube-apiserver时不开启。

- --goaway-chance=0.001

kube-apiserver根据--goaway-chance参数值,通过向client发送goaway,概率性随机优雅关闭client连接。具体来说,不影响client正在进行中的请求,client新请求通过建立一个新的TCP连接来发送,从而触发新的负载均衡。

k8s源码MR

https://github.com/kubernetes/kubernetes/pull/88567

如何实现概率性?

randPool = &sync.Pool{
	New: func() interface{} {
		return rand.New(rand.NewSource(rand.Int63()))
	},
}

rnd := randPool.Get().(*rand.Rand)
// 随机返回[0,1)小数值
ret := rnd.Float64()

if ret < goawayChance {
return true
}
return false

如何设置goaway?

func (h *goaway) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if r.Proto == "HTTP/2.0" && h.decider.Goaway(r) {
		// Send a GOAWAY and tear down the TCP connection when idle.
		w.Header().Set("Connection", "close")
	}

	h.handler.ServeHTTP(w, r)
}

 

posted on 2026-03-05 07:47  王景迁  阅读(20)  评论(0)    收藏  举报

导航