【Kubernetes】k8s中容器之間、pod之間如何進行網絡通信?

目錄

  • Pod
  • Kubernetes 網絡模型
  • 同一Pod上的容器之間進行通信
  • 同一Node上的不同Pod之間進行通信
  • 不同Node上的Pod之間進行通信
  • Service
  • 參考


Pod

首先來回顧一下Pod:

Pod 是用于構建應用程序的最小可部署對象。單個 Pod 代表集群中正在運行的工作負載,并封裝一個或多個 Docker 容器、任何所需的存儲以及唯一的 IP 地址


Kubernetes 網絡模型

集群中每一個 Pod 都會獲得自己的、 獨一無二的 IP 地址。一個Pod里的一組容器共享相同的IP地址。

Kubernetes 強制要求所有網絡設施都滿足以下基本要求(從而排除了有意隔離網絡的策略):

  • Pod 能夠與所有其他節點上的 Pod 通信, 且不需要網絡地址轉譯(NAT)
  • 節點上的代理(比如:系統守護進程、kubelet)可以和節點上的所有 Pod 通信。

考慮到這些限制,我們剩下四個不同的網絡問題需要解決:

  • 容器到容器網絡
  • Pod 到 Pod 網絡
  • Pod 到服務網絡
  • 互聯網到服務網絡

同一Pod上的容器之間進行通信

通常,我們將虛擬機中的網絡通信視為直接與以太網設備交互。默認情況下,Linux 將每個進程分配給根網絡命名空間,以提供對外部世界的訪問。如下圖所示:
在這里插入圖片描述

Pod 被建模為一組共享網絡命名空間的 Docker 容器。Pod 中的容器都具有通過分配給 Pod 的網絡命名空間分配的相同 IP 地址和端口空間,并且可以通過 localhost 找到彼此,因為它們駐留在同一命名空間中。

根本原因是使用Docker的一種網絡模型:–net=container 能夠讓同一個Pod內的多個docker容器相互通信。

container模式指定新創建的Docker容器和已經存在的一個容器共享一個網絡命名空間,也就是說新創建的Docker容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。

在k8s中每個Pod容器有一個pause容器,它擁有獨立的網絡命名空間,在Pod內啟動Docker容器時候使用 –net=container就可以讓當前Docker容器加入到Pod容器擁有的網絡命名空間(pause容器)。


同一Node上的不同Pod之間進行通信

從 Pod 的角度來看,它存在于自己的以太網命名空間中。不同的Pod存在于不同的網絡命名空間里。
但是可以使用Linux虛擬以太網設備或由兩個虛擬接口組成的veth對 將兩個網絡命名空間進行連接 。要連接 Pod 命名空間,我們可以將 veth 對的一側分配給根網絡命名空間,將另一側分配給 Pod 的網絡命名空間。然后使用網橋把兩個虛擬網絡組成為一個以太網。如下圖所示:
在這里插入圖片描述
在上面這個網絡模型下,Pod之間是如何通信的呢?

  1. Pod 1 向其自己的以太網設備發送數據包eth0,該設備可作為 Pod 的默認設備。對于 Pod 1,eth0通過虛擬以太網設備連接到根命名空間veth0
  2. 網橋cbr0配置有veth0連接到它的網段。一旦數據包到達網橋,網橋就會使用 ARP 協議解析將數據包發送到的正確網段
  3. 當數據包到達虛擬設備veth1時,它會直接轉發到 Pod 2 的命名空間以及該命名空間內的設備eth0

不同Node上的Pod之間進行通信

同樣會用到虛擬接口和網橋。

在這里插入圖片描述

  1. 數據包首先通過 Pod 1 的以太網設備發送,該設備與根命名空間 中的虛擬以太網設備配對。最終,數據包到達根命名空間的網橋
  2. ARP 將在網橋處失敗,因為沒有設備連接到具有數據包正確 MAC 地址的網橋。發生故障時,網橋將數據包從默認路由(根命名空間的eth0設備)發送出去。此時,路由離開節點并進入網絡
  3. 我們現在假設網絡可以根據分配給節點 的 CIDR 塊將數據包路由到正確的節點。數據包進入目標節點(在 VM 2 上)的根命名空間eth0,并通過網橋路由到正確的虛擬以太網設備
  4. 最后,路由通過駐留在 Pod 4 命名空間內的虛擬以太網設備對完成

一般來說,每個節點都知道如何將數據包傳遞到在其內運行的 Pod。一旦數據包到達目標節點,數據包的流動方式與在同一節點上的 Pod 之間路由流量的方式相同。


Service

我們要知道,Pod的IP地址不持久,會隨著擴展或縮小、應用程序崩潰或節點重啟而出現和消失。哪怕重啟一個Pod,它的IP也可能和前一次不一樣。

所以Kubernetes 里使用Service來管理一組 Pod 的狀態,允許我們跟蹤一組隨時間動態變化的 Pod 的IP 地址。Service充當 Pod 的抽象,并將單個虛擬 IP 地址分配給一組 Pod 的IP 地址

任何發送到服務虛擬 IP 的流量都將被路由到與該虛擬 IP 關聯的 Pod 集。這允許與 Service 關聯的 Pod 集隨時更改 ,只要虛擬IP不改,客戶端就感覺不到Pod的變化。

創建新的 Kubernetes Service時,系統會創建一個新的虛擬 IP(也稱為集群 IP)。集群內的任何位置,尋址到虛擬 IP 的流量都將負載均衡到與Service關聯的一組Pod。實際上,Kubernetes 會自動創建并維護一個分布式集群內負載均衡器,該均衡器將流量分配到Service關聯的健康 Pod。


參考

https://sookocheff.com/post/kubernetes/understanding-kubernetes-networking-model/
https://kubernetes.io/zh-cn/docs/concepts/services-networking/

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

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

相關文章

C++初階篇----類與對象上卷

目錄 引言1.面向過程和面向對象初步認識2.類的引入3.類的定義3.1聲明與定義全部放在類體中3.2聲明與定義分離 4.類的訪問限定符及封裝4.1訪問限定符4.2封裝 5.類的作用域6.類的實例化類是對對象進行描述一個類(一個類型變量)可以實例化出多個對象 7.類對…

Day12-【Java SE進階】JDK8新特性:Lambda表達式、方法引用、常見算法、正則表達式、異常

一、JDK8新特性 1.Lambda表達式 Lambda表達式是JDK 8開始新增的一種語法形式;作用:用于簡化名內部類的代碼寫法。 注意:Lambda表達式并不是說能簡化全部匿名內部類的寫法,只能簡化函數式接口的匿名內部類。 有且僅有一個抽象方法的接口。注意:將來我們見到的大部…

分布式事務簡介

分布式事務簡介,通過組內分享學習到的知識,并進行討論。 主要內容 分布式事務簡介 分布式事務是指跨越多個數據庫或服務的一系列操作,這些數據庫或服務可能分布在網絡的不同節點上,它們共同組成一個完整的邏輯工作單元&#xf…

GEE必須會教程—蒸散發數據時間序列分析與下載

今天帶來的有關蒸散發數據的下載代碼,蒸散發數據在氣象氣候,農業干旱監測等領域應用廣泛,那么在GEE上如何方便快捷獲取蒸散發數據呢?今天跟著小編分享代碼,快來學習吧!! A.定義研究區域 //定義…

JSON-RPC 快速開始

文章目錄 JSON-RPC什么是JSON-RPCJSON-RPC java開源實現JSON-PRC go開源實現JSON-RPC 和 Restful 都屬于什么?RPC、JSON-RPC和HTTP區別 以太坊使用json-rpc?JSON-RPC和gRPCWEB開發中,使用JSON-RPC好,還是RESTful API好&#xff1f…

【前端素材】推薦優質數據統計后臺管理系統網頁Cleopatra.平臺模板(附源碼)

一、需求分析 在線后臺管理系統是指供管理員或運營人員使用的Web應用程序,用于管理和監控網站、應用程序或系統的運行和數據。它通常包括一系列工具和功能,用于管理用戶、內容、權限、數據等。下面是關于在線后臺管理系統的詳細分析: 1、功…

ssh簡介以及 windows 安裝ssh教程

SSH(Secure Shell)是一種網絡協議,用于計算機之間的加密登錄和其他安全網絡服務。通過 SSH,用戶可以安全地訪問遠程計算機,執行命令、傳輸文件等操作。SSH 使用公鑰加密技術,確保數據傳輸的安全性。本文將從…

TypeScript 哲學 - 2、Narrowing

四種類型守衛 1、truthiness narrowing 2、 3、 4、 control flow analysis

C語言:結構體(自定義類型)知識點(包括結構體內存對齊的熱門知識點)

和黛玉學編程呀,大家一起努力呀............. 結構體類型的聲明 回顧一下 struct tag { member-list; }variable-list; 創建和初始化 我們知道,在C語言中,對于一些數據是必須初始化的,但是結構體怎么創建并且初始化呢&#xff1…

【計算機網絡】TCP 如何實現可靠傳輸

TCP通過三次握手建立連接,四次揮手釋放連接,確保連接建立和連接釋放的可靠。 序列號、檢驗和、確認應答信號、重發機制、連接管理、窗口控制、流量控制、擁塞控制 標準回答 可靠傳輸就是通過TCP連接傳送的數據是沒有差錯、不會丟失、不重復并且按序到達的…

springboot+vue+mysql項目使用的常用注解

實體類常用注解 Data Data 是一個 Lombok 提供的注解&#xff0c;使用 Data 注解可以簡化代碼&#xff0c;使代碼更加簡潔易讀。 作用&#xff1a;自動為類生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依賴 <depende…

rk3568-一種基于wifi的網絡環境搭建方案

前言&#xff1a; PC--Ubuntu--開發板 三者之間的網絡互相ping通很重要&#xff0c;尤其是ubuntu和開發板互ping成功最關鍵&#xff0c;關系到nfs&#xff0c;tftp等常用的開發手段。現在大多數開發板都帶有wifi芯片&#xff0c;現在提供一種方案可以三個設備無線地搭建網絡環境…

Open3D0.14.1編譯、安裝、demo使用教程

寫在前面 本文內容 Open3D在0.15版之前&#xff0c;沒有提供編譯好的包&#xff0c;要使用C版本必須自己編譯&#xff0c;本文是Open3D0.14.1在Windows下和Linux(Ubuntu1804)下的編譯、使用教程&#xff1b; Open3D其他版本的編譯和使用相關教程見 各個版本的Open3D、PCL的編譯…

STL常見容器(map/multimap容器)---C++

STL常見容器目錄&#xff1a; 8.map/ multimap容器8.1 map基本概念8.2 map構造和賦值8.3 map大小和交換8.4 map插入和刪除8.5 map查找和統計8.6 map容器排序8.6.1 內置類型排序8.6.2 自定義類型排序8.6.3 自定義和內置類型混合排序 8.map/ multimap容器 兩者基本一致&#xff…

用node寫后端環境運行時報錯Port 3000 is already in use

解決方法:關閉之前運行的3000端口,操作如下 1.WindowR輸入cmd確定,打開命令面板 2.查看本機端口詳情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,這里要看你自己項目中package.joson的啟動命令是什…

Flink:動態表 / 時態表 / 版本表 / 普通表 概念區別澄清

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

Python+PySide6實現一個選擇文件并做處理的GUI辦公小工具(完整代碼)

目錄 專欄導讀背景安裝注意事項完整代碼結尾專欄導讀 ?? 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手 ?????? 博客主頁:請點擊——> 一晌小貪歡的博客主頁求關注 ?? 該系列文章專欄:請點擊——>Python辦公自動化專欄求訂閱 ?? 此外還…

天翼云登錄參數JavaSrcipt逆向

天翼云登錄參數 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目標網站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目標參數 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四個參數 …

安卓使用ExoPlayer出現膨脹類異常

1.導包 implementation com.google.android.exoplayer:exoplayer-core:2.15.1implementation com.google.android.exoplayer:exoplayer-ui:2.15.1 2.在Androidifest.xml加入權限&#xff0c;我這里加了忘了與讀寫權限 <uses-permission android:name"android.permissio…

【Fastadmin/ThinkPHP5】使用Queue隊列方法詳細步驟

在現代應用開發中&#xff0c;合理利用隊列系統能夠有效提升系統的性能和響應速度&#xff0c;尤其是在處理耗時較長的任務時&#xff0c;如發送大量郵件、執行定時任務等。下面是如何在ThinkPHP框架中設置和使用隊列功能的詳細指南&#xff1a; 1.配置隊列服務 在applicatio…