比較kube-proxy模式:iptables還是IPVS?

kube-proxy是任何 Kubernetes 部署中的關鍵組件。它的作用是將流向服務(通過集群 IP 和節點端口)的流量負載均衡到正確的后端podkube-proxy可以運行在三種模式之一,每種模式都使用不同的數據平面技術來實現:userspaceiptablesIPVS

userspace 模式非常舊且慢,絕對不推薦!但是,應該如何權衡選擇 iptables 還是 IPVS 模式呢?在本文中,我們將比較這兩種模式,在實際的微服務環境中衡量它們的性能,并解釋在何種情況下你可能會選擇其中一種。

首先,我們將簡要介紹這兩種模式的背景,然后深入測試和結果……

背景:iptables 代理模式

iptables 是一個 Linux 內核功能,旨在成為一個高效的防火墻,具有足夠的靈活性來處理各種常見的數據包操作和過濾需求。它允許將靈活的規則序列附加到內核數據包處理管道中的各個鉤子上。在 iptables 模式下,kube-proxy將規則附加到 “NAT pre-routing” 鉤子上,以實現其 NAT 和負載均衡功能。這種方式可行,簡單,使用成熟的內核功能,并且與其他使用 iptables 進行過濾的程序(例如 Calico)能夠很好地兼容。

然而,kube-proxy 編程 iptables 規則的方式意味著它名義上是一個 O(n) 風格的算法,其中 n 大致與集群規模成正比(更準確地說,是與服務的數量和每個服務背后的后端 pod 數量成正比)。

背景:IPVS 代理模式

IPVS 是一個專門為負載均衡設計的 Linux 內核功能。在 IPVS 模式下,kube-proxy通過編程 IPVS 負載均衡器來代替使用 iptables。它同樣使用成熟的內核功能,且 IPVS 專為負載均衡大量服務而設計;它擁有優化的 API 和查找例程,而不是一系列順序規則。

結果是,在 IPVS 模式下,kube-proxy 的連接處理具有名義上的 O(1) 計算復雜度。換句話說,在大多數情況下,它的連接處理性能將保持恒定,而不受集群規模的影響。

此外,作為一個專用的負載均衡器,IPVS 擁有多種不同的調度算法,如輪詢、最短期望延遲、最少連接數和各種哈希方法。相比之下,iptables 中的 kube-proxy 使用的是隨機的等成本選擇算法。

IPVS 的一個潛在缺點是,通過 IPVS 處理的數據包在 iptables 過濾鉤子中的路徑與正常情況下的數據包非常不同。如果計劃將 IPVS 與其他使用 iptables 的程序一起使用,則需要研究它們是否能夠預期地協同工作。(別擔心,Calico 早在很久以前就已經與 IPVS kube-proxy 兼容了!)

性能比較

好的,從名義上來說,kube-proxy在 iptables 模式下的連接處理是 O(n) 復雜度,而在 IPVS 模式下是 O(1) 復雜度。但在實際微服務環境中,這意味著什么呢?

在大多數情況下,涉及應用程序和微服務時,kube-proxy性能有兩個關鍵屬性可能是您關心的:

  1. 對往返響應時間的影響:當一個微服務向另一個微服務發出 API 調用時,平均而言第一個微服務發送請求并從第二個微服務接收響應需要多長時間?
  2. 對總 CPU 使用率的影響:在運行微服務時,包括用戶空間和內核/系統使用在內的主機總 CPU 使用率是多少?這包括了支持微服務所需的所有進程,包括 kube-proxy。

為了說明這一點,我們在一個專用節點上運行了一個“客戶端”微服務 pod,每秒生成 1000 個請求,發送到由 10 個“服務器”微服務 pod 支持的 Kubernetes 服務。然后,我們在 iptables 和 IPVS 模式下,在客戶端節點上測量了性能,使用了各種數量的 Kubernetes 服務,每個服務有 10 個 pod 支持,最多達到 10,000 個服務(即 100,000 個服務后端)。對于微服務,我們使用golang編寫的簡單測試工具作為我們的客戶端微服務,并使用標準NGINX作為服務器微服務的后端pods。

往返響應時間

在考慮往返響應時間時,理解連接和請求之間的區別非常重要。通常,大多數微服務將使用持久連接或“keepalive”連接,這意味著每個連接會在多個請求之間重復使用,而不是每個請求都需要新建一個連接。這一點很重要,因為大多數新連接都需要在網絡上進行三次握手(這需要時間),并且在 Linux 網絡棧內進行更多處理(這也需要一點時間和 CPU 資源)。

為了說明這些差異,我們在有和沒有 keepalive 連接的情況下進行了測試。對于 keepalive 連接,我們使用了 NGINX 的默認配置,該配置會將每個連接保持活躍狀態以供最多 100 個請求重復使用。請參見下圖,注意響應時間越低越好。

圖表顯示了兩個關鍵點:

  1. 在超過 1,000 個服務(10,000 個后端 pod)之前,iptables 和 IPVS 之間的平均往返響應時間差異微不足道。
  2. 平均往返響應時間的差異僅在不使用 keepalive 連接時才明顯。也就是說,當每個請求都使用新連接時,差異才會顯現。

對于 iptables 和 IPVS 模式,kube-proxy 的響應時間開銷與建立連接有關,而不是與連接上的數據包或請求數量有關。這是因為 Linux 使用連接跟蹤(conntrack),能夠非常高效地將數據包匹配到現有連接。如果數據包在 conntrack 中被匹配到,就不需要通過 kube-proxy 的 iptables 或 IPVS 規則來決定如何處理它。

值得注意的是,在這個例子中,“服務器”微服務使用的是 NGINX pod 提供一個小的靜態響應體。許多微服務需要做的工作遠不止這些,這將導致相應更高的響應時間,這意味著 kube-proxy 處理的時間差在這種圖表中將占據更小的百分比。

最后有一個奇怪現象需要解釋:為什么在 10,000 個服務時,非 keepalive 連接的響應時間在 IPVS 模式下變得更慢,即使 IPVS 中新連接的處理復雜度是 O(1)?要真正深入了解這一點,我們需要進行更多的挖掘,但其中一個因素是整個系統由于主機上增加的 CPU 使用而變得更慢。這也引出了下一個話題。

總CPU使用率

為了說明總 CPU 使用率,下面的圖表集中在不使用持久/keepalive 連接的最壞情況下,此時 kube-proxy 連接處理的開銷影響最大。

圖表顯示了兩個關鍵點:

  1. 在超過 1,000 個服務(10,000 個后端 pod)之前,iptables 和 IPVS 之間的 CPU 使用率差異相對不顯著。
  2. 在 10,000 個服務(100,000 個后端 pod)時,iptables 的 CPU 增加約為一個內核的 35%,而 IPVS 增加約為一個內核的 8%。

有兩個主要因素影響這種 CPU 使用模式。
第一個因素是,默認情況下,kube-proxy 每 30 秒重新編程一次內核中的所有服務。這解釋了為什么即使 IPVS 的新連接處理名義上是 O(1) 復雜度,IPVS 模式下的 CPU 也會略有增加。此外,較早版本內核中重新編程 iptables 的 API 速度比現在慢得多。因此,如果您在 iptables 模式下使用舊版內核,CPU 增長將比圖表中顯示的更高。

第二個因素是 kube-proxy 使用 iptables 或 IPVS 處理新連接所需的時間。對于 iptables,這在名義上是 O(n) 復雜度。在大量服務的情況下,這對 CPU 使用有顯著影響。例如,在 10,000 個服務(100,000 個后端 pod)時,iptables 每個新連接執行約 20,000 條規則。不過,請記住,在這個圖表中,我們展示的是每個請求都使用新連接的最壞情況。如果我們使用 NGINX 默認的每個連接 100 次 keepalive 請求,那么 kube-proxy 的 iptables 規則執行頻率將減少 100 倍,從而大大降低使用 iptables 而非 IPVS 的 CPU 影響,接近一個內核的 2%。

值得注意的是,在這個例子中,“客戶端”微服務簡單地丟棄了從“服務器”微服務接收到的每個響應。一個實際的微服務需要做的工作遠不止這些,這將增加圖表中的基礎 CPU 使用率,但不會改變與服務數量相關的 CPU 增加的絕對值。

結論

在顯著超過 1,000 個服務的規模下,kube-proxy 的 IPVS 模式可以提供一些不錯的性能提升。具體效果可能有所不同,但一般來說,對于使用持久“keepalive”連接風格的微服務,且運行在現代內核上的情況下,這些性能提升可能相對有限。對于不使用持久連接的微服務,或者在較舊內核上運行時,切換到 IPVS 模式可能會帶來顯著的收益。

除了性能方面的考慮外,如果您需要比 kube-proxy 的 iptables 模式的隨機負載均衡更復雜的負載均衡調度算法,也應該考慮使用 IPVS 模式。

如果您不確定 IPVS 是否會對您有利,那么堅持使用 kube-proxy 的 iptables 模式。它已經經過大量的生產環境驗證,盡管并不完美,但可以說它作為默認選擇是有原因的。

比較 kube-proxy 和 Calico 對 iptables 的使用

在本文中,我們看到 kube-proxy 使用 iptables 在非常大規模時會導致性能影響。我有時會被問到,為什么 Calico 沒有遇到同樣的挑戰。答案是 Calico 對 iptables 的使用與 kube-proxy 有顯著不同。kube-proxy 使用了一條非常長的規則鏈,其長度大致與集群規模成正比,而 Calico 使用的是非常短且優化的規則鏈,并廣泛使用 ipsets,其查找時間復雜度為 O(1),不受其大小影響。
為了更好地理解這一點,下面的圖表顯示了在集群中的節點平均托管 30 個 pod,且集群中的每個 pod 平均適用 3 個網絡策略的情況下,每個連接由 kube-proxy 和 Calico 執行的 iptables 規則的平均數量。

即使在完全擴展的集群中運行,擁有 10,000 個服務和 100,000 個后端 pod 時,Calico 每個連接執行的 iptables 規則數量大致與 kube-proxy 在擁有 20 個服務和 200 個后端 pod 時執行的規則數量相同。換句話說,Calico 對 iptables 的使用是可擴展的!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19244.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19244.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT::QNetworkReply類readAll()讀取不到數據的可能原因

程序中,當發送請求時,并沒有加鎖,而是在響應函數中加了鎖,導致可能某個請求的finished信號影響到其他請求響應數據的讀取 connect(reply,&QNetworkReply::finished,this,&Display::replyFinished);參考這篇文章&#xff…

[LLM]從GPT-4o原理到下一代人機交互技術

一 定義 背景:在推出GPT-4o之前,使用語音模式與ChatGPT交流的延遲較長,無法直接觀察語調、多個說話者或背景噪音,且無法輸出笑聲、歌唱或表達情感。 GPT-4o作為OpenAI推出的一款多模態大型語言模型,代表了這一交互技…

聽說京東618裁員?所以日常準備很重要呀

文末有最少必要的面試題,還準備了離線 PDF 版本。 京東也要向市場輸送人才了? 這幾天看到技術群里不少朋友在討論京東裁員相關的信息。 我去看了下京東近期的操作,京東內部考勤調整和午休時間縮短,以及強化打卡機制等管理調整;有…

R可視化:生存分析森林圖

生存分析森林圖 生存分析森林圖 介紹 ggplot2繪制生存分析森林圖加載R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE)library(tidyverse) library(survival) library(survminer) library(tableone) library(forestplot)# rm(list = ls()) options(stringsAsFa…

AMEYA360代理 | 村田電子去寄生電感降噪元件(LCT)特點和規格

株式會社村田制作所(以下簡稱“村田”)開發了行業首款(1)利用負互感(2)、能對從數MHz到1GHz的諧波(3)范圍內電源噪聲進行抑制的去寄生電感降噪元件“LXLC21系列”(以下簡稱“本產品”)。只需將1件本產品連接至電源電路中的電容器,即可消除與本產品連接的電容器的ESL…

鏈表5(考試用)7-5 sdut-C語言實驗-鏈表的逆置

7-5 sdut-C語言實驗-鏈表的逆置 分數 20 全屏瀏覽 作者 馬新娟 單位 山東理工大學 輸入多個整數,以-1作為結束標志,順序建立一個帶頭結點的單鏈表,之后對該單鏈表的數據進行逆置,并輸出逆置后的單鏈表數據。 輸入格式: 輸入…

OpenMv圖片預處理

本博客講述的是獲取一張圖片首先對圖像進行處理,比如畸形矯正,圖像濾波等操作。 1.histeq()自適應直方圖均衡 # 自適應直方圖均衡例子 # # 此示例展示了如何使用自適應直方圖均衡來改善圖像中的對比度。 #自適應直方圖均衡將圖像分割成區域,然后均衡這些區域中的直方圖,…

ubuntu server版 虛擬機根目錄磁盤擴容

之前一直使用桌面版ubuntu,因為項目原因需要拉取的代碼太大了且項目比較多選擇了體量更小的Ubuntu server版,在使用中發現根目錄的磁盤很快就用滿了 如上,明明分配的300G但是/dev/mapper/ubuntu--vg-ubuntu--lv 只有98G都用滿了 server版本與桌面版不同的是在server版安裝的時…

企業數據安全建設需警惕5大陷阱

我們已經生活在一個數字化的時代,那些能夠從數據中獲取最大價值的組織將成為最后的贏家。在數字化轉型和數據民主化的發展背景下,企業開展數據安全保護刻不容緩。 不過,盡管企業在數據保護方面已取得了長足的進步,但數據安全建設…

Chrome DevTools 助力網頁開發:新手入門指南

網頁開發是一個充滿活力的領域,擁有合適的工具將使您事半功倍。Chrome DevTools 正是這樣一個強大的工具套件,它直接內置于您的 Chrome 瀏覽器中。無論您是剛涉足網頁開發的新手,還是希望提升技能的經驗豐富的專業人士,本指南都將…

一篇文章搞懂二叉樹

文章目錄 DP 樹葉的度樹的度節點的層次節點的祖先節點的子孫雙親節點或父節點 樹的表示孩子兄弟表示法雙親表示法樹和非樹樹的應用 二叉樹滿二叉樹完全二叉樹推論二叉樹的存儲以數組的方式以鏈表的方式堆(Heap)堆的分類大根堆和小根堆的作用 二叉樹的遍歷DFS和BFS DP 動態規劃…

HCIA--DHCP: 動態主機配置協議 (復習)

DHCP: 動態主機配置協議 -- 同一分發管理ip地址 基于UDP 67/68端口工作 網絡中存在DHCP的服務器為需要自動生成ip地址的設備分配ip地址;--C/S模型 成為DHCP服務器的條件: 該設備存在接口或網卡連接到所要分發ip地址的廣播域內該接口或網卡必須已經配置…

在WHM中如何調整max_upload_size 參數大小

今日我們在搭建新網站時需要調整一下PHP參數max_upload_size 的大小,我們公司使用的Hostease的美國獨立服務器產品默認5個IP地址,也購買了cPanel面板,因此聯系Hostease的技術支持,尋求幫助了解到如何在WHM中調整PHP參數&#xff0…

全志T527芯片詳解【二】:高清圖像編解碼

硬件模塊加持 T527集成了多個圖形顯示和編解碼相關的硬件模塊,為高清圖像顯示、高清視頻播放和多路高清攝像頭輸入提供了強大的硬件基礎: ARM Mail-G57 GPU自研顯示引擎(Display Engine)去隔行處理單元(De-interIace)2D圖像加速單元(Graphic2D)視頻編解…

Debug-013-el-loading中顯示倒計時時間

前言: 今天實現一個小小的優化,業務上是后端需要從設備上拿數據,所以前端需要不斷調用一個查詢接口,直到后端數據獲取完畢,前后端根據一個ending字段為true判斷停止調用查詢接口。由于這個查詢時間比較久&…

SFOS2:組件介紹

一、前言 在sailfish os application的開發過程中,幾乎是困難重重,因為我暫未找到具有完整性、指導性、易懂性的開發文檔,特別是組件的使用,現決定將自己的探究結果記錄下來。因此,這篇文章只會具有參考價值&#xff0…

Java面向數據編程1.1版本

近年來,Java 獲得了許多新的語言特性:類型模式、switch改進、記錄record和記錄records模式、密封sealed 類型和一些其他模式。 有時,整體的效果遠大于各部分之和,如果正確組合,這些特性可以對我們的日常編碼產生重大影…

Unix環境高級編程--8-進程控制---8.1-8.2進程標識-8.3fork函數-8.4 vfork函數

1、進程控制幾個過程 創建進程--》執行進程---》終止進程 2、進程標識 (1)專用進程:ID為0的進程是調度進程,常常被稱為交換進程,也稱為系統進程; ID為1通常是init進程,在自舉結束時由內核調用…

鏈動3+1模式:深度解析與優勢探討

在數字化營銷領域,鏈動模式因其強大的裂變能力和高效的引流機制而備受矚目。其中,鏈動21模式一度是商家們的首選,但隨著時間的推移,其存在的問題也逐漸顯現:預留小號和較低的復購率成為制約其進一步發展的瓶頸。為了解…

map優化多個if

原代碼如下,多個按鈕的點擊操作,其中val是操作的按鈕的標志 const operationConst {INSTALLAPP: installApp,STOPAPP: stopApp,HOME: home,CLEAR: clear...... } function moreOperation(val, list) {selectedList list && list.length 0 ?…