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

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

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

K8S之長連接負(fù)載均衡不均如何解決

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 2023-06-05 11:01 ? 次閱讀

一、前言

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

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

二、場景

2.1滾動更新負(fù)載不均

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

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

2.2rr 策略負(fù)載不均

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

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

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

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

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

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

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

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

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

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

三、最佳實踐

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

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

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

編輯:黃飛

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

    關(guān)注

    0

    文章

    101

    瀏覽量

    12346

原文標(biāo)題:K8S之長連接負(fù)載均衡問題

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

收藏 人收藏

    評論

    相關(guān)推薦

    k8s核心原理學(xué)習(xí)指南3

    k8s學(xué)習(xí)3 - 核心原理
    發(fā)表于 09-25 16:37

    k8s volume中的本地存儲和網(wǎng)絡(luò)存儲

    八 、 k8s volume 本地存儲和網(wǎng)絡(luò)存儲
    發(fā)表于 03-25 08:44

    如何利用K8S全面擁抱微服務(wù)架構(gòu)?

    K8S是第一個將“一切以服務(wù)為中心,一切圍繞服務(wù)運(yùn)轉(zhuǎn)”作為指導(dǎo)思想的創(chuàng)新型產(chǎn)品,它的功能和架構(gòu)設(shè)計自始至終都遵循了這一指導(dǎo)思想,構(gòu)建在K8S上的系統(tǒng)不僅可以獨(dú)立運(yùn)行在物理機(jī)、虛擬機(jī)集群或者企業(yè)私有云上,也可以被托管在公有云中。
    的頭像 發(fā)表于 10-08 15:59 ?2.7w次閱讀

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

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

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

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

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

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

    Docker不香嗎為什么還要用K8s

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

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

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

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

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

    K8S(kubernetes)學(xué)習(xí)指南

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

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

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

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

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

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

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

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

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

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

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