0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

K8S之長連接負載均衡不均如何解決

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-06-05 11:01 ? 次閱讀

一、前言

本文針對我們生產(chǎn)上出現(xiàn)的流量不均的問題,介紹一下解決方案。

k8s是一個特別復雜的系統(tǒng),而網(wǎng)絡相關(guān)的問題是其中最復雜的問題,要通過一兩篇文章介紹清楚是很難的。這個流量不均的問題出現(xiàn)的原因并不復雜,就是因為kube-proxy使用了默認的iptables做負載均衡,而它是以概率的方式轉(zhuǎn)發(fā),使用長連接且連接數(shù)較少時,偏差會比較大。下面介紹兩種場景。

二、場景

2.1滾動更新負載不均

在連接數(shù)比較固定或波動不大的情況下,滾動更新時,舊 Pod 上的連接逐漸斷掉,重連到新啟動的 Pod 上,越先啟動的 Pod 所接收到的連接數(shù)越多,造成負載不均:

1e3b4e60-034b-11ee-90ce-dac502259ad0.png

2.2rr 策略負載不均

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

1e42534a-034b-11ee-90ce-dac502259ad0.png

我們發(fā)現(xiàn)部分 Pod 連接數(shù)高,它們相比連接數(shù)低的 Pod 要同時處理更多的連接,消耗的資源也就相對更多從而造成負載不均。

將 kube-proxy 的 ipvs 轉(zhuǎn)發(fā)模式設置為 lc (Least-Connection) ,即傾向轉(zhuǎn)發(fā)給連接數(shù)少的 Pod,可能會有所緩解,但也不一定,因為 ipvs 的負載均衡狀態(tài)是分散在各個節(jié)點的,并沒有收斂到一個地方,也就無法在全局層面感知哪個 Pod 上的連接數(shù)少,并不能真正做到 lc。可以嘗試設置為 sh (Source Hashing),并且這樣可以保證即便負載均衡狀態(tài)沒有收斂到同一個地方,也能在全局盡量保持負載均衡。

這邊很多對kupe-proxy的ipvs模式可能不太了解,ipvs和iptables都是基于netfilter的,兩者差別如下:

ipvs 為大型集群提供了更好的可擴展性和性能

ipvs 支持比 iptables 更復雜的負載均衡算法(最小負載、最少連接、加權(quán)等等)

ipvs 支持服務器健康檢查和連接重試等功能

2.3、擴容失效問題 在連接數(shù)比較固定或波動不大的情況下,工作負載在 HPA 自動擴容時,由于是長鏈接,連接數(shù)又比較固定,所有連接都 "固化" 在之前的 Pod 上,新擴出的 Pod 幾乎沒有連接,造成之前的 Pod 高負載,而擴出來的 Pod 又無法分擔壓力,導致擴容失效:

1e47feda-034b-11ee-90ce-dac502259ad0.png

三、最佳實踐

業(yè)務層面自動重連,避免連接 "固化" 到某個后端 Pod 上。比如周期性定時重連,或者一個連接中處理的請求數(shù)達到閾值后自動重連。

不直接請求后端,通過七層代理訪問。比如 gRPC 協(xié)議,可以 使用 nginx ingress 轉(zhuǎn)發(fā) gRPC,也可以 使用 istio 轉(zhuǎn)發(fā) gRPC,這樣對于 gRPC 這樣多個請求復用同一個長連接的場景,經(jīng)過七層代理后,可以自動拆分請求,在請求級別負載均衡。

kube-proxy 的 ipvs 轉(zhuǎn)發(fā)策略設置為 sh (--ipvs-scheduler=sh)。

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 負載均衡
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    12368

原文標題:K8S之長連接負載均衡問題

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    OpenStack與K8s結(jié)合的兩種方案的詳細介紹和比較

    OpenStack與K8S結(jié)合主要有兩種方案。一是K8S部署在OpenStack平臺之上,二是K8S和OpenStack組件集成。
    的頭像 發(fā)表于 10-14 09:38 ?2.7w次閱讀

    如何使用kubernetes client-go實踐一個簡單的與K8s交互過程

    【導讀】Kubernetes項目使用Go語言編寫,對Go api原生支持非常便捷。 本篇文章介紹了如何使用kubernetes client-go實踐一個簡單的與K8s交互過程
    的頭像 發(fā)表于 02-02 11:16 ?6860次閱讀
    如何使用kubernetes client-go實踐一個簡單的與<b class='flag-5'>K8s</b>交互過程

    關(guān)于K8s最詳細的解析

    一個目標:容器操作;兩地三中心;四層服務發(fā)現(xiàn);五種Pod共享資源;六個CNI常用插件;七層負載均衡;八種隔離維度;九個網(wǎng)絡模型原則;十類IP地址;百級產(chǎn)品線;千級物理機;萬級容器;相如無億,K8s有億:億級日服務人次。
    的頭像 發(fā)表于 04-08 13:55 ?7287次閱讀
    關(guān)于<b class='flag-5'>K8s</b>最詳細的解析

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對強大的集群,成千上萬的容器,突然感覺不香了。 這時候就需要我們的主角 Kubernetes 上場了,先來了解一下 K8s 的基本概念,后面再介紹實踐,由淺入深步步為營
    的頭像 發(fā)表于 06-02 11:56 ?3445次閱讀

    簡單說明k8s和Docker之間的關(guān)系

    這篇文章主要介紹了k8s和Docker關(guān)系簡單說明,本文利用圖文講解的很透徹,有需要的同學可以研究下 最近項目用到kubernetes(以下簡稱k8sks之間有
    的頭像 發(fā)表于 06-24 15:48 ?3417次閱讀

    K8S集群服務訪問失敗怎么辦 K8S故障處理集錦

    問題1:K8S集群服務訪問失?。?? ? 原因分析:證書不能被識別,其原因為:自定義證書,過期等。 解決方法:更新證書即可。 問題2:K8S集群服務訪問失敗? curl: (7) Failed
    的頭像 發(fā)表于 09-01 11:11 ?1.6w次閱讀
    <b class='flag-5'>K8S</b>集群服務訪問失敗怎么辦 <b class='flag-5'>K8S</b>故障處理集錦

    K8S(kubernetes)學習指南

    K8S(kubernetes)學習指南
    發(fā)表于 06-29 14:14 ?0次下載

    mysql部署在k8s上的實現(xiàn)方案

    的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應用軟件之一。這里主要講 mysql 部署在 k8s 上,mysql 部署在 k8s 上的優(yōu)勢主要有以下幾點。
    的頭像 發(fā)表于 09-26 10:39 ?2514次閱讀

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    ),Kubernetes提供了應用部署,規(guī)劃,更新,維護的一種機制。 在Kubernetes中,我們可以創(chuàng)建多個容器,每個容器里面運行一個應用實例,然后通過內(nèi)置的負載均衡策略,實現(xiàn)對這一組應用實例的管理、發(fā)現(xiàn)、訪問,而這些細節(jié)都不需要運維人員去進行復雜的手工配置和處理。
    發(fā)表于 07-19 13:14 ?1116次閱讀

    什么是K3sK8s?K3sK8s有什么區(qū)別?

    Kubernetes,通??s寫為 K8s,是領(lǐng)先的容器編排工具。該開源項目最初由 Google 開發(fā),幫助塑造了現(xiàn)代編排的定義。該系統(tǒng)包括了部署和運行容器化系統(tǒng)所需的一切。
    的頭像 發(fā)表于 08-03 10:53 ?7568次閱讀

    k8s生態(tài)鏈包含哪些技術(shù)

    1. Apache APISIX Ingress 定義 ? 在 K8s 生態(tài)中,Ingress 作為表示 K8s 流量入口的一種資源,想要讓其生效,就需要有一個 Ingress Controller
    的頭像 發(fā)表于 08-07 10:56 ?1243次閱讀
    <b class='flag-5'>k8s</b>生態(tài)鏈包含哪些技術(shù)

    K8S落地實踐經(jīng)驗分享

    k8s 即 Kubernetes,是一個開源的容器編排引擎,用來對容器化應用進行自動化部署、 擴縮和管理。
    的頭像 發(fā)表于 01-02 11:45 ?1167次閱讀
    <b class='flag-5'>K8S</b>落地實踐經(jīng)驗分享

    k8s云原生開發(fā)要求

    Kubernetes(K8s)云原生開發(fā)對硬件有一定要求。CPU方面,建議至少配備2個邏輯核心,高性能CPU更佳。內(nèi)存至少4GB,但8GB或更高更推薦。存儲需至少20-30GB可用空間,SSD提升
    的頭像 發(fā)表于 10-24 10:03 ?224次閱讀
    <b class='flag-5'>k8s</b>云原生開發(fā)要求

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地與公有云分別建立K8s集群,并確保網(wǎng)絡連接。接著,配置kubeconfig文件連接兩集群,并安裝云服務插件以實現(xiàn)資源互通。然后,編寫Deploym
    的頭像 發(fā)表于 11-07 09:37 ?150次閱讀

    k8s和docker區(qū)別對比,哪個更強?

    Docker和Kubernetes(K8s)是容器化技術(shù)的兩大流行工具。Docker關(guān)注構(gòu)建和打包容器,適用于本地開發(fā)和單主機管理;而K8s則提供容器編排和管理平臺,適用于多主機或云環(huán)境,具備自動化
    的頭像 發(fā)表于 12-11 13:55 ?104次閱讀