需求導向的K8S網絡原理分析:Kube-proxy、Flannel、Calico的地位和作用

最近發現自己似乎從來沒學明白過Kubernetes網絡通信方案,特開一貼復習總結一下。

在k8s中,每個 Pod 都擁有一個獨立的 IP 地址,而且假定所有 Pod 都在一個可以直接連通的、扁平的網絡空間中。所以不管它們是否允許在同一個 Node(宿主機)中,都要求它可以直接通過對方的 IP 進行訪問。用戶不需要額外考慮如何建立 Pod 之間的連接,也不需要考慮將容器端口映射到主機端口等問題。同時,外界的

省流,K8s網絡的目標是為了實現:

  1. pod之間的互聯互通
  2. 對外提供服務

為了實現上述功能,需要為每一個pod都維護完整的網絡協議棧,同時,維護pod之間的網絡路由。

CNI容器網絡接口

首先,當你起了一個裸的、沒有網絡的pod之后,這個pod是沒有任何基于TCP/IP手段和外界進行通信的。你可能只能通過crictl的客戶端看到自己起了這么一個pod。

為了建立pod和外界的(基于TCP/IP的)通信,并且將不同pod的網絡隔離開,需要為每一個pod構建一個網絡命名空間。網絡命名空間(Network Namespace)是一種內核級別的隔離機制,用于將不同進程組(比如一個pod就是一個被隔離的進程組)的網絡環境隔離開來。每個網絡命名空間擁有獨立的網絡棧,實現網絡資源的完全隔離。

具體一點,網絡命名空間的核心功能及特性是:

  1. 網絡隔離
    不同網絡命名空間的進程無法直接通信,需通過跨命名空間的網絡設備(如 veth 對、網橋)或物理設備連接。例如,pod A 在命名空間ns1,pod B 在命名空間ns2,它們的(虛擬)物理層、數據鏈路層、網絡層、傳輸層、應用層都實現了相互獨立。
  2. 獨立網絡棧
    每個命名空間可獨立配置 IP 地址、子網、網關、DNS 服務器等。
  3. 輕量級隔離
    相比虛擬機,網絡命名空間的資源開銷極小,適合容器場景。

我們首先實現同一臺物理機內pod之間的相互通信。

為了實現不同網絡命名空間之間的通信,需要把若干的pod從物理層到網絡層連起來。

我們首先實現(虛擬)物理層和數據鏈路層的相互連接,這基于veth設備對。

你可以把它想象為一根帶有兩個水晶頭的網線,兩端(veth1和veth2)分別插在兩個pod上。如下圖所示:

在這里插入圖片描述

在有多個pod的情況下,一般會新建一個公用的虛擬交換機(如圖所示的bridge),然后所有的pod都接到這個交換機上,也能通過這個交換機實現pod之間的通信。如下圖所示:

在這里插入圖片描述

圖里面這個bridge是一個虛擬網絡設備,所以具有網絡設備的特征,可以配置IP、MAC地址等;其次,bridge是一個虛擬交換機,和物理交換機有類似的功能。
對于普通的網絡設備來說,只有兩端,從一端進來的數據會從另一端出去,如物理網卡從外面網絡中收到的數據會轉發給內核協議棧,而從協議棧過來的數據會轉發到外面的物理網絡中。
而bridge不同,bridge有多個端口,數據可以從任何端口進來,進來之后從哪個口出去和物理交換機的原理差不多,要看數據包指向的終端MAC地址。

進一步地,我們給pod、網橋都配上IP地址,于是我們實現了同一臺物理機內pod之間的相互通信。

在這里插入圖片描述
進一步地,我們需要實現跨不同主機pod之間的通信。

一種簡單的想法是,建一個跨多個主機的bridge不就得了?

在這里插入圖片描述
這種在已有的網絡上通過軟件構建一個擴展版虛擬網絡的方法,被稱為:Overlay Network(覆蓋網絡)。從實現效果來看,就是把若干個節點上的小bridge整合成了一個大bridge。

Calico和Flannel是overlay network的兩種實現方案。

Calico和Flannel

為了實現跨節點之間的數據通信,這就需要calico和flannel出場了。

跨節點數據包路由,主要就是兩種情形:

  1. 節點和節點之間能夠通過IP直連(三層可達)
  2. 節點和節點之間連接復雜(三層不可達)

解決方案也很簡單,對于三層可達的網絡,可以直接配置節點的路由表進行轉發。對于三層不可達的網絡,搭一個隧道實現網絡穿透就可以了。

從這個視角看,Calico和Flannel兩個插件雖然名字不太一樣,但是實現的功能大同小異。

calico中,主要提供兩種跨node包路由的模式:

  • BGP 模式:在三層可達的時候,Calico 在每個節點上運行 BGP 客戶端,將 Pod 的 IP 路由信息通過 BGP 協議通告給其他節點。pod間流量直接通過路由規則進行轉發。
  • IPIP 模式:當兩個節點不在同一子網(三層不可達)時,Calico 將Pod間數據包的外邊再包一層IP 頭,通過隧道實現傳輸。

IPIP模式的示意圖

flannel中,也提供兩種跨節點包路由的方式:

  • VXLAN模式:VXLAN 是 Linux 內核原生支持的網絡虛擬化技術,通過在 IP 包內封裝二層以太網幀,實現跨節點的虛擬二層網絡。原理和Calico的IPIP模式類似。
  • Host-gateway模式:直接利用節點的物理網絡進行路由,無需隧道封裝,通過將 Pod 子網的路由直接指向目標節點的物理 IP,實現跨節點通信。
    flannel架構圖

Kube-proxy

在前文中,我們已經通過calico / flannel等技術實現了同一個集群內pod的互聯互通。但是仍然有一些比較關鍵的需求需要解決。

在實際使用集群的過程中,pod啟動時的IP是隨機分配的,這意味著訪問集群內部pod必不能用硬編碼方式實現。此外, Pod 實例會動態變化,需要設計動態服務發現和動態負載均衡方案。要在pod不斷的變化的IP中追求不變,并且抓住這個不變實現集群內部pod的訪問。

K8S的解決方案是service+DNS。Service里記錄了pod的標簽和端口映射規則(只是一個配置文件)。在用戶向集群提交service的配置后,集群會創建和service同名的endpoint對象,用于根據service記錄的標簽去匹配對應的某些pod。用戶在訪問某些特定pod的時候,只需要訪問service/endpoint的IP即可,由endpoint實現流量的路由和負載均衡。

由于endpoint的IP也在變,所以集群內引入了DNS機制,為每一個service都賦予了一個域名,通過service域名訪問對應的pod。

為了實現上述功能,需要不斷地監控pod的狀態,進而實現路由轉發。Kube-proxy提供了這樣的解決方案。

kube - proxy 會持續監控 API Server,當 Service 或 Endpoint 資源發生變更時,kube - proxy 會通過list-watch手段獲取這些信息。
kube - proxy 根據這些信息更新本地的iptables/ipvs規則,這些規則決定了如何將流量從 Service 的 IP 和端口轉發到后端的 Pod。

references

https://segmentfault.com/a/1190000009491002
https://learn.lianglianglee.com
https://zhuanlan.zhihu.com/p/439920165
https://blog.csdn.net/weixin_42587823/article/details/144938902

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

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

相關文章

Vulnhub:Digitalword.local: FALL靶機滲透

將靶機按照圖中連接方式打開,fall在virtualBox中打開 信息收集 掃描得ip arp-scan -l 掃描端口 nmap -A -T4 -sV -p- 掃描目錄 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一個一個…

4、網工軟考—VLAN配置—hybird配置

1、實驗環境搭建: 2、實驗過程 SW1: 先創建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的標簽 …

【OCR】技術

OCR圖像識別 一、OCR是什么二、Python中如何實現OCR1.簡單應用 三、OCR的核心步驟1.?圖像預處理?(提高識別準確率)2.?文字識別3.?輸出結果 四、OCR到的應用場景五、注意事項六、擴展學習 此貼用來更新在工作中遇到的一些圖片解析內容 一、OCR是什么 …

深入理解 dispatchEvent:前端事件觸發的藝術

dispatchEvent 是 DOM 元素的一個方法,用于手動觸發/派發一個事件。這個方法允許開發者以編程方式觸發事件,而不是等待用戶交互或瀏覽器自動觸發。 1.基本概念 作用:dispatchEvent 用于在指定的 DOM 節點上觸發一個事件 使用場景&#xff1…

2025年數智化電商產業帶發展研究報告260+份匯總解讀|附PDF下載

原文鏈接:https://tecdat.cn/?p41286 在數字技術與實體經濟深度融合的當下,數智化產業帶正成為經濟發展的關鍵引擎。 從云南鮮花產業帶的直播熱銷到深圳3C數碼的智能轉型,數智化正重塑產業格局。2023年數字經濟規模突破53.9萬億元&#xff…

【深度學習】【目標檢測】【OnnxRuntime】【C++】YOLOV5模型部署

【深度學習】【目標檢測】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并親測有效,分享筆記邀大家共同學習討論 文章目錄 【深度學習】【目標檢測】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平臺搭建依賴環境模型轉換--pytorch轉onnxONNXRuntime推…

深入解析 JSON-RPC:從基礎到高級應用(附調用示例)

在當今的軟件開發領域,遠程過程調用(RPC)技術是實現分布式系統間通信的關鍵手段之一。JSON-RPC,作為一種基于 JSON 數據格式的輕量級 RPC 協議,因其簡潔性和高效性而備受青睞。本文將全面深入地探討 JSON-RPC 的核心概…

抽象代數:群論

系列筆記為本學期上抽象代數課整理的,持續更新。 群的相關定義 群的定義 群是一個帶有滿足結合律、單位元、逆元的二元運算的集合,記作 ( G , ? ) \left({G, \cdot}\right) (G,?)。若群運算滿足結合律,則該集合構成半群。如果該半群中含…

線程同步——讀寫鎖

Linux——線程同步 讀寫鎖 目錄 一、基本概念 1.1 讀寫鎖的基本概念 1.2 讀寫鎖的優點 1.3 讀寫鎖的實現 1.4 代碼實現 一、基本概念 線程同步中的讀寫鎖(Read-Write Lock),也常被稱為共享-獨占鎖(Shared-Exclusive Lock&a…

全面解析PRN文件:從原理到可視化的完整指南 【標簽打印】

文章目錄 一、PRN文件概述二、PRN文件結構深度解析2.1 文件頭配置2.1 繪圖指令詳解2.3 文本處理方案2.4 條碼/二維碼實現2.5 RFID指令集 三、實戰:PRN可視化工具開發3.1 基于Canvas的實現方案3.2 坐標轉換關鍵算法 四、常見問題解決方案4.1 內容偏移問題4.2 中文亂碼…

C++:函數(通識版)

一、函數的基礎 1.什么是函數?(獨立的功能單位) 函數是C中封裝代碼邏輯的基本單元,用于執行特定任務。 作用:代碼復用、模塊化、提高可讀性。 2、函數的基本結構 返回類型 函數名(參數列表) {// 函數體return 返回值…

sql注入語句學習

說明 注入漏洞作為登頂過web十大漏洞多次的漏洞,危害性不言而喻,其中sql注入就是注入漏洞常用的手段。其形成的原因是由于web在接收傳參數據時,對數據的過濾不夠嚴格,將其帶入到數據庫查詢中,導致用戶可以通過傳參一些…

云鑰科技多通道工業相機解決方案設計

項目應用場景分析與需求挑戰 1. 應用場景 ?目標領域?:工業自動化檢測(如精密零件尺寸測量、表面缺陷檢測)、3D立體視覺(如物體建模、位姿識別)、動態運動追蹤(如高速生產線監控)等。 ?核心…

離散的數據及參數適合用什么算法做模型

離散數據和參數適用的機器學習算法取決于具體任務(分類、回歸、聚類等)、數據特點(稀疏性、類別數量等)以及業務需求。以下是針對離散數據的常用算法分類和選擇建議: 1. 分類任務(離散目標變量) 經典算法 決策樹(ID3/C4.5/CART) 直接處理離散特征,無需編碼,可解釋性…

VMware 安裝 Ubuntu 實戰分享

VMware 安裝 Ubuntu 實戰分享 VMware 是一款強大的虛擬機軟件,廣泛用于多操作系統環境的搭建。本文將詳細介紹如何在 VMware 中安裝 Ubuntu,并分享安裝過程中的常見問題及解決方法。 1. 安裝前的準備工作 (1) 系統要求 主機操作系統:Windo…

基于Promise鏈式調用的多層級請求性能優化

代碼優化-循環嵌套關聯請求 1. 背景 在實際開發中,我們經常會遇到需要嵌套關聯請求的場景,比如: 獲取項目列表獲取項目詳情獲取項目進度 2. 問題 在這種場景下,我們可能會遇到以下問題: 串行請求瀑布流&#xff…

puppeteer+express服務端導出頁面為pdf

以下是開發步驟: 1、創建目錄 puppeteer_demo 目錄,打開目錄 初始化項目(命令為:npm init -y) 頁面如: 初始化后,項目目錄會出現 package.json 文件 2、安裝 puppeteer ,使用命令&a…

GPT-4o圖像生成功能:技術突破與隱憂并存

2025年3月25日,OpenAI正式推出GPT-4o原生圖像生成功能,宣稱其實現了“文本到圖像的終極跨越”。然而,這一被市場追捧的技術在短短72小時內便因用戶需求過載觸發限流,暴露出算力瓶頸與商業化矛盾的尖銳性。這場技術狂歡的背后&…

西域平臺商品詳情接口設計與實現?

接口描述: 該接口用于獲取西域平臺中指定商品的詳細信息,包括商品名稱、價格、庫存、描述、圖片等。 點擊獲取key和secret 接口地址: GET /api/product/detail 請求參數: 參數名 類型 是否必填 描述 productId st…

項目-蒼穹外賣(十五) Apache ECharts+數據統計

一、介紹 二、營業額統計 需求分析和設計&#xff1a; Controller: Service: /*** 營業額統計* param begindate* param enddate* return* */Overridepublic TurnoverReportVO turnoverStatistics(LocalDate begindate, LocalDate enddate) {//創建時間集合List<LocalDate&…