短連接場(chǎng)景下自動(dòng)擴(kuò)容的pod流量不均問(wèn)題分析

背景

  • 某業(yè)務(wù)應(yīng)用,為發(fā)新品做準(zhǔn)備,進(jìn)行一次壓測(cè)
  • 應(yīng)用鏈路:域名 -> 業(yè)務(wù)nginx pod ->業(yè)務(wù)app pod(app有配置HPA)
  • 業(yè)務(wù)nginx對(duì)uptream上游是短連接
  • 業(yè)務(wù)nginx pod數(shù)小于業(yè)務(wù)app pod數(shù)

現(xiàn)象

  • 壓測(cè)期間觸發(fā)了HPA自動(dòng)擴(kuò)容,但是新擴(kuò)出來(lái)的業(yè)務(wù)app新pod流量很低,而之前的pod流量是均勻
  • 初步假設(shè)是否nginx是否配置了會(huì)話保持,或者某種原因?qū)е耼ginx命中了某種緩存

排查

  1. 簡(jiǎn)單判斷:
    (1)查看nginx配置文件負(fù)載均衡算法
    (2)查看業(yè)務(wù)app pod壓測(cè)前,流量是否均勻
    (3)查看業(yè)務(wù)app pod新增副本后,原來(lái)的副本的流量是否junyun
    (4)最終查看nginx日志和ipvs記錄的連接數(shù),nginx配置文件無(wú)異常,舊pod流量均勻,不均勻值發(fā)生在新的pod上
    (5)懷疑是否大流量下nginx的負(fù)載均衡算法失效,但是根據(jù)步驟3的結(jié)果,暫時(shí)把這個(gè)可能性排查
    (6)剩下的可能性是nginx命中了某種緩存(來(lái)源ip或者來(lái)源端口),下面簡(jiǎn)單抓包查看,確定流量轉(zhuǎn)發(fā)有什么規(guī)律
  2. 查看ipvs連接數(shù)
ipveadm -Ln
查看活躍連接數(shù)和非活躍連接與舊pod是否相差很大
  1. 查看業(yè)務(wù)nginx的tcp狀態(tài)
ss -s
查看確認(rèn)timewait較多,確實(shí)是短連接

3, 從ningx pod網(wǎng)卡上抓包

> tcpdump -i any -w your_capture.pcap 'host 192.168.1.100'

> tshark -r your_capture.pcap -Y "tcp" -T fields -e tcp.srcport -e frame.time_relative \
| awk '{
    port = $1;
    time = $2;
    if (last_time[port] != "") {
        delta = time - last_time[port];
        print "Port " port " reused after " delta " seconds";
    }
    last_time[port] = time;
}'

最終結(jié)果觀察端口確實(shí)出現(xiàn)了重用,而且重用時(shí)間隔都小于2min
規(guī)律的時(shí)間間隔肯定不是意外,似乎確定了方向
查看當(dāng)前內(nèi)核,大于 4.4+,MSL等于30秒,所以發(fā)送重用是正常的
  1. 上一步發(fā)現(xiàn)重用時(shí)間隔都小于2min,但是大于1min,因?yàn)閗8s集群內(nèi)使用的是lvs,通過(guò)google搜尋對(duì)應(yīng)的案例,發(fā)現(xiàn)ipvs中的連接hash表會(huì)記錄各連接狀態(tài),做緩存超時(shí)
ipvsadm -lcn
#查看 IPVS 已建立的連接及剩余時(shí)間 -》命令執(zhí)行后的結(jié)果
IPVS connection entries
pro expire state (此處為對(duì)client的連接狀態(tài))       source             virtual            destination

ipvs 查看文檔,只支持tcp、tcpfin、udp三個(gè)imeout的修改
默認(rèn)timewait默認(rèn)timewait是2min,這個(gè)2min剛好與上面2min吻合
  1. 端口重用為什么會(huì)影響流量分布
  • 首先明確,ipvs滿足下面兩個(gè)條件,才會(huì)重新選擇一個(gè)新的后端
    (1)新的tcp連接,不是新的http
    (2)詞tcp連接沒(méi)有命中連接hash表 [這里的命中指的是tcp連接的源端口和源IP能夠匹配到連接hash表的某條記錄](méi)
  1. 后續(xù)縮小內(nèi)核port_range參數(shù)在測(cè)試環(huán)境驗(yàn)證,復(fù)現(xiàn)此現(xiàn)象

總結(jié)

  • 短連接+大流量場(chǎng)景下,端口復(fù)用+ipvs連接hash表會(huì)可能會(huì)導(dǎo)致流量轉(zhuǎn)發(fā)不均

解決方案:

  1. nginx與業(yè)務(wù)app采用長(zhǎng)連接,應(yīng)用側(cè)配置主動(dòng)斷開(kāi)
  2. 擴(kuò)容nginx pod到足夠數(shù)量,目的是降低端口重用概率
  3. 修改內(nèi)核fd和ip_local_port_range參數(shù),增加端口的可用數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容