一、前言
本文針對(duì)我們生產(chǎn)上出現(xiàn)的流量不均的問(wèn)題,介紹一下解決方案。
k8s是一個(gè)特別復(fù)雜的系統(tǒng),而網(wǎng)絡(luò)相關(guān)的問(wèn)題是其中最復(fù)雜的問(wèn)題,要通過(guò)一兩篇文章介紹清楚是很難的。這個(gè)流量不均的問(wèn)題出現(xiàn)的原因并不復(fù)雜,就是因?yàn)閗ube-proxy使用了默認(rèn)的iptables做負(fù)載均衡,而它是以概率的方式轉(zhuǎn)發(fā),使用長(zhǎng)連接且連接數(shù)較少時(shí),偏差會(huì)比較大。下面介紹兩種場(chǎng)景。
二、場(chǎng)景
2.1滾動(dòng)更新負(fù)載不均
在連接數(shù)比較固定或波動(dòng)不大的情況下,滾動(dòng)更新時(shí),舊 Pod 上的連接逐漸斷掉,重連到新啟動(dòng)的 Pod 上,越先啟動(dòng)的 Pod 所接收到的連接數(shù)越多,造成負(fù)載不均:

2.2rr 策略負(fù)載不均
假如長(zhǎng)連接服務(wù)的不同連接的保持時(shí)長(zhǎng)差異很大,而 ipvs 轉(zhuǎn)發(fā)時(shí)默認(rèn)是 rr 策略轉(zhuǎn)發(fā),如果某些后端 Pod "運(yùn)氣較差",它們上面的連接保持時(shí)間比較較長(zhǎng),而由于是 rr 轉(zhuǎn)發(fā),它們身上累計(jì)的連接數(shù)就可能較多,節(jié)點(diǎn)上通過(guò) ipvsadm -Ln -t CLUSTER-IP:PORT 查看某個(gè) service 的轉(zhuǎn)發(fā)情況:

我們發(fā)現(xiàn)部分 Pod 連接數(shù)高,它們相比連接數(shù)低的 Pod 要同時(shí)處理更多的連接,消耗的資源也就相對(duì)更多從而造成負(fù)載不均。
將 kube-proxy 的 ipvs 轉(zhuǎn)發(fā)模式設(shè)置為 lc (Least-Connection) ,即傾向轉(zhuǎn)發(fā)給連接數(shù)少的 Pod,可能會(huì)有所緩解,但也不一定,因?yàn)?ipvs 的負(fù)載均衡狀態(tài)是分散在各個(gè)節(jié)點(diǎn)的,并沒(méi)有收斂到一個(gè)地方,也就無(wú)法在全局層面感知哪個(gè) Pod 上的連接數(shù)少,并不能真正做到 lc??梢試L試設(shè)置為 sh (Source Hashing),并且這樣可以保證即便負(fù)載均衡狀態(tài)沒(méi)有收斂到同一個(gè)地方,也能在全局盡量保持負(fù)載均衡。
這邊很多對(duì)kupe-proxy的ipvs模式可能不太了解,ipvs和iptables都是基于netfilter的,兩者差別如下:
ipvs 為大型集群提供了更好的可擴(kuò)展性和性能
ipvs 支持比 iptables 更復(fù)雜的負(fù)載均衡算法(最小負(fù)載、最少連接、加權(quán)等等)
ipvs 支持服務(wù)器健康檢查和連接重試等功能
2.3、擴(kuò)容失效問(wèn)題 在連接數(shù)比較固定或波動(dòng)不大的情況下,工作負(fù)載在 HPA 自動(dòng)擴(kuò)容時(shí),由于是長(zhǎng)鏈接,連接數(shù)又比較固定,所有連接都 "固化" 在之前的 Pod 上,新擴(kuò)出的 Pod 幾乎沒(méi)有連接,造成之前的 Pod 高負(fù)載,而擴(kuò)出來(lái)的 Pod 又無(wú)法分擔(dān)壓力,導(dǎo)致擴(kuò)容失效:

三、最佳實(shí)踐
業(yè)務(wù)層面自動(dòng)重連,避免連接 "固化" 到某個(gè)后端 Pod 上。比如周期性定時(shí)重連,或者一個(gè)連接中處理的請(qǐng)求數(shù)達(dá)到閾值后自動(dòng)重連。
不直接請(qǐng)求后端,通過(guò)七層代理訪問(wèn)。比如 gRPC 協(xié)議,可以 使用 nginx ingress 轉(zhuǎn)發(fā) gRPC,也可以 使用 istio 轉(zhuǎn)發(fā) gRPC,這樣對(duì)于 gRPC 這樣多個(gè)請(qǐng)求復(fù)用同一個(gè)長(zhǎng)連接的場(chǎng)景,經(jīng)過(guò)七層代理后,可以自動(dòng)拆分請(qǐng)求,在請(qǐng)求級(jí)別負(fù)載均衡。
kube-proxy 的 ipvs 轉(zhuǎn)發(fā)策略設(shè)置為 sh (--ipvs-scheduler=sh)。
編輯:黃飛
-
負(fù)載均衡
+關(guān)注
關(guān)注
0文章
128瀏覽量
12838
原文標(biāo)題:K8S之長(zhǎng)連接負(fù)載均衡問(wèn)題
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
什么是 K8S,如何使用 K8S
OpenStack與K8s結(jié)合的兩種方案的詳細(xì)介紹和比較
關(guān)于K8s最詳細(xì)的解析
Docker不香嗎為什么還要用K8s
簡(jiǎn)單說(shuō)明k8s和Docker之間的關(guān)系
K8S集群服務(wù)訪問(wèn)失敗怎么辦 K8S故障處理集錦
k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres
什么是K3s和K8s?K3s和K8s有什么區(qū)別?
k8s生態(tài)鏈包含哪些技術(shù)
k8s云原生開(kāi)發(fā)要求
K8S之長(zhǎng)連接負(fù)載均衡不均如何解決
評(píng)論