文章目錄
- 計網基礎知識
-
- MTU 最大資料傳輸單元
- 封包
- 其他計網基礎知識
- 容器網絡組網類型
-
- Overlay
-
- L2 overlay
- L3 overlay
- Underlay
-
- L2 underlay
- L3 underlay
- Flannel
-
- 參考
- 概述
-
- 每個 pod 一個虛拟IP
- 為什麼要封包解包?
- 為什麼 host-gw 需要在二層網絡?
- 要具有的假設概念
- UDP Overlay
-
- 缺點
- 有沒有比 UDP 更高效的辦法呢?
- VXLAN Overlay 通信過程
-
- 可能困惑的點
- 為什麼稱為隧道?
- Host-gw
計網基礎知識
MTU 最大資料傳輸單元
- MTU用以訓示整個IP封包的最大長度(IP頭+三層Payload),MTU是一個三層的定義,即MTU = IP MTU
- 參考:什麼是MTU(Maximum Transmission Unit)?
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMyEzMiNmMzEmY3I2MihzN3ATYiR2YxU2N2QjN2ITNm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
封包
- MAC 位址的作用: 下一跳,鄰近點的傳輸,若比作快遞,就是需要經過城市中,鄰近城市的快遞傳遞
- IP 位址的作用:确定源位址和目的位址,即快遞發出地和快遞接收地
- RAW IP 包 = IP 標頭 + Payload(封包資料)
其他計網基礎知識
- 兩個不同網段的IP位址能ping通,但是為什麼不能在ARP上找到另一個的MAC位址?
容器網絡組網類型
Overlay
- 架構形式:就是在實體網絡上再架構一個虛拟網絡
- 傳輸形式:就是用一種傳輸協定封裝另一種傳輸協定,将容器虛拟ip包作為資料,用主控端ip進行再次封裝,在底層網絡傳輸(這種就是ip包再添加個ip頭,在實體網絡中傳輸)
L2 overlay
- 相較于傳統的 L2 網絡,L2 overlay 是個”大二層“的概念
- ”大“ 指的是可以跨越多個資料中心(即容器可以跨L3 underlay 進行 L2 通信)
- ”二層“ 指的是通信雙方在同一個邏輯的網段内,例如 172.17.1.2/16 和 172.17.2.3/16
- 就是不同的主機上的容器網段都是在一個大邏輯網段内,是以直接用 MAC 通信就好,但是在三層網絡中傳輸也不認識,這就交給一些協定處理了,比如 VXLAN
- VXLAN 是 L2 overlay 網絡的典型實作,通過在 UDP 包中封裝原始 L2 封包,實作了容器的跨主機通信
- L2 overlay 網絡,容器可在任意主控端間遷移而不改變其 IP 位址,使得建構在大二層 overlay 網絡上的容器在動态遷移是具有很高的靈活性
L3 overlay
- 類似 L2 overlay,但會在節點上增加一個網關
- 同一主機上的容器,在同一子網内,可直接通過二層通信
- 跨節點的容器通信,隻能走 L3,都會經過網關轉發,是以性能弱于 L2 overlay
- 不同節點的容器可以處于不同的網段内,例如 172.17.1.0/16 和 192.168.1.0/16
- fannel 的 UDP 模式采用的就是 L3 overlay 模型
- L3 overlay 網絡容器在主機間遷移時可能需要改變其 IP 位址
Underlay
- 架構形式:就是正常的實體網絡
- 傳輸形式:不需要再次封裝,每個節點上都維護了路由表資訊或轉發表資訊,兩種形式
- 一種采用實際的 IP,macvlan
- 第二種,IP 標頭封裝 容器虛拟IP,MAC 層封裝 主控端MAC,這樣可以通過二層網絡到達對方,利用節點上的路由資訊到達目标容器
L2 underlay
- 可了解為底層網絡
- 使用實際的 IP
- 傳統網絡組網就是Underlay類型
L3 underlay
- 網絡插件在每個節點上維護了路由表資訊,三層路由
- fannel 的 host-gw 模式和 Calico 的 BGP 組網方式都是 L3 underlay 類型的網絡
Flannel
參考
- Flannel的兩種模式解析(VXLAN、host-gw)
- flannel跨主網絡通信方案(UDP、VXLAN、HOST-GW)詳解
- Kubernetes網絡插件Flannel的3種工作模式
- 十分鐘漫談容器網絡方案01—Flannel
概述
fannel三種模式 | 效率 |
---|---|
UDP | 性能較差,封包解包涉及到多次使用者态和核心态互動 |
VXLAN | 性能較好,封包解包在核心态實作,核心轉發資料,flanneld負責動态配置ARP和FDB(轉發資料庫)表項更新 |
host-gw | 性能最好,不需要再次封包,正常發包,目的容器所在的主機充當網關 flanneld 負責主機上路由表的重新整理 |
每個 pod 一個虛拟IP
- k8s 確定每個 pod 一個 IP,此 IP 來自與預先配置的網段,是虛拟 IP
- 也可以配置為實際的 IP,不過目前網絡為了節省資源采用了 虛拟IP
為什麼要封包解包?
- 由上面可知 Pod IP 為虛拟 IP,是以在實際網絡中傳輸,轉發路徑中的其他所有裝置并不認識,無法完成資料包的轉發
- 是以 Pod IP 采用主控端上的 IP 進行再次封裝,也就是 UDP(就是假裝成大人的模樣,這樣路徑上的路由裝置就都會認識,進而放行啦,到達對方主機)、VXLAN模式(相當于建立了一個隧道,不管路上多複雜,都交給VXLAN處理了,在内部的容器資料包看來,就是有個直達的隧道,直接到對方主機)
- 容器的 IP 包封裝後就變為了 資料包中的 PayLoad(封包資料)部分
- 到達目标主機後,解開包,因為目的主機預先配置了規則,就知道解開包後該轉發給目的容器了
- 為什麼 UDP 是封裝,VXLAN是隧道呢?
- 因為 UDP 是從使用者态發出的包,相當于明面上
- 而 VXLAN 是核心态處理,使用者态不需要關心,給我們的感覺就是,資料包背地裡直接挖個隧道過去對方了
為什麼 host-gw 需要在二層網絡?
- 此種形式下的資料包為(源 host mac 位址,目的 host mac 位址)(源容器 虛拟IP,目的容器 虛拟IP)(封包資料部分)
- 此種規則,要發包的容器,根據所在主控端上的路由規則,發送給網關(也就是目的容器所在的主控端),由此獲得目的主機 mac 位址,進行二層封包
- 因為在二層網絡,通過 mac 位址就可以通信,到達目的 host,目的 host 已配置了路由規則,根據目的容器的 IP,就完成了資料轉發
- 若在三層網絡,則需要通過 IP 通信,而該資料包的 IP 都是虛拟 IP,轉發路徑的中間的節點都不認識此虛拟 IP,導緻資料被丢棄
要具有的假設概念
- 若容器為虛拟 IP,那麼假設 隻有源主機 和 目的主機 認識 源容器和目的容器的 VIP(虛拟 IP )
- 若容器為虛拟 IP,那麼若在三層傳輸(利用 IP 傳輸),必須借用主控端 IP,僞裝成大人的模樣(也就是再次封裝),否則中間路徑上的裝置都不認識
- 若容器為虛拟 IP,那麼在二層網絡中傳輸(利用 MAC 傳輸),就是同一網絡,借用主控端 MAC 位址就可完成傳輸,那麼就不用管虛拟 IP 的問題,直接傳輸就好
UDP Overlay
- 以 UDP 底層實作的 Overlay 為例
- 目标容器發往容器,但都是虛拟IP,也就是 VIP --> VIP
- 對應的 IP 包為,(源容器VIP,目的容器VIP)(封包資料),這就是 RAW IP 包
- 通過鍊路層傳輸到 cni0 網橋,利用 MAC 位址,(源容器 mac 位址,主控端 cni0 網橋 mac 位址)(源容器VIP,目的容器VIP)(封包資料)
- 到了 cni0 之後,fanneld程序剝掉 MAC 標頭,得到 RAW IP 包
- 之後,開始跨主機通信,根據路由表資訊可知,目的容器對應的目的節點的 IP
- 跨主機通信采用 UDP 封包
- flanneld 程序進行 UDP 封包
- UDP 標頭為(源端口,目的端口)
- 就是 在源主機的 flanneld端口 —> 目的主機的 flanneld端口,那麼標頭為(8285,8285)
- flanneld 的端口為 8285
- 若主控端對 flanneld 做了端口映射,
- 比如源主機 flanneld 的端口為 8285 —> 映射為主控端2345
- 目的主機 flanneld 的端口為 8285 —> 映射為主控端8756
- 那麼標頭為(2345,8756)
- 是以封過的UDP包為
- (源主機 MAC 位址, 目的主機 MAC 位址)(源主機IP,目的主機IP)(源主機端口,目的主機端口)(封包資料 RAW IP 包)
- 即(源主機 MAC 位址, 目的主機 MAC 位址)(源主機IP,目的主機IP)(源主機端口,目的主機端口)【(源容器VIP,目的容器VIP)(封包資料)】
- 為什麼内部沒加 MAC 位址
- 因為鄰近傳輸時已經被 flanneld 程序剝掉了
- MAC 位址隻用于鄰近傳輸,最開始就是源主機上的鄰近傳輸,是以如果将此位址封裝上,目的主機上将無法識别
- 之後便開始通過正常的網絡進行資料傳輸
- 到達目的主機後,flanneld 程序剝掉 UDP 標頭,之後根據内層 RAW IP 包轉發到相應的目的容器,此時的傳輸需要加上 MAC 標頭才能進行傳輸
- 其中需要的路由表資訊,由 flanneld 程序從 etcd 擷取
- 目标容器發往容器,但都是虛拟IP,也就是 VIP --> VIP
缺點
UDP模式使用了Flannel自定義的一種標頭協定,實作三層網絡Overlay網絡處理跨主通信的問題。但是由于資料在核心和使用者态經過了多次拷貝:容器是使用者态,docker0和flannel0是核心态,flanneld是使用者态,最終又要通過核心将資料發到外部網絡,是以性能損耗較大,對于有資料傳輸有要求的線上業務并不适用。
有沒有比 UDP 更高效的辦法呢?
- 能否吧封包/解包交給 Linux 核心做,而不是讓 flanneld 代勞呢
- 有,VXLAN
VXLAN Overlay 通信過程
Kubernetes網絡插件Flannel的3種工作模式
- 容器 A — 通過容器内路由表 —> cni0 網橋
- cni0 的 IP 包 — 經過 host A 路由表,發現發往節點 B,需要交給 flannel.1 接口 ( 1 指的的 VTEP裝置的 VNI 号)
- flannel.1 裝置是 VTEP 裝置 — 通過 etcd 得知 容器 B 的 IP 屬于節點 B,并得到 host B IP — 通過 host A 轉發表得知 host B 的 MAC 位址 — 根據 flannel.1 裝置的參數(VNI, local IP, Port)進行 VXLAN 封包,之後通過 host A 的 eth1 網卡發出
- 通過底層網絡,VXLAN 到達 host B 的 eth1 網卡接口
- 通過 8472 端口,VXLAN 包被轉發給 VTEP 裝置 flannel.1 進行解包
- 解封裝後的 IP 包 — 比對 host B 的路由表 — 核心将 IP 包轉發給 cni0 網橋
- cni0 網橋将 IP 包轉發給容器 B
特别注意:
在 VXLAN 模式下,資料是由核心轉發的,flannel 不轉發資料,僅動态設定 ARP 和 FDB 表項
- VXLAN 其實是在三層網絡上建構出來一個二層網絡通道
- 原來的二層以太網幀(包含 MAC 頭部、IP 頭部、和傳輸層頭部的封包),被放在 VXLAN 標頭李進行封裝,在套到标準的 UDP 頭部(UDP 頭部、IP 頭部和 MAC 頭部),用來在底層網絡上傳輸封包
可能困惑的點
- VNI 是什麼?為什麼需要
- VNI 在 VXLAN 標頭中,用于說明傳個那個 VTEP 裝置,可能一台主機上有多個 VTEP 裝置,是以需要傳輸到可以處理此資料包的VTEP裝置,需要用 VNI 進行訓示
- VXLAN 内部幀中除了 VXLAN 標頭,還需要目的 VTEP 裝置的 MAC 位址
- 為了準确到達吧
為什麼稱為隧道?
- tunnel
- 隧道是一個邏輯上的概念,在 VXLAN 中并沒有具體的實體實體相對應,可看作一種虛拟通道
- 從圖中看出,VXLAN 雙方都認為自己在直接和對方通信,并不知道底層網絡的存在
- 從整體來看,每個 VXLAN 網絡像是為通信的虛拟機搭建了一個單獨的通信通道,也就是隧道
- VTEP
- VXLAN 網絡的邊緣裝置,用來進行 VXLAN 封包的處理(封包和解包)
- VTEP 可以是網絡裝置(例如交換機),也可以是一台機器(例如虛拟化叢集中的主控端)
- VNI
- 是每個 VXLAN 的辨別,是個 24 位證書,是以最大值為 2^24 = 16777216
- 如果一個 VNI 對應一個租戶,那麼理論上 VXLAN 可以支撐千萬級租戶
Host-gw
- 依據名字了解,就是把 host 當做 gateway,就是把主控端當做路由器
- 核心是IP包在封裝成桢的時候,使用路由表的“下一跳”設定上的MAC位址,這樣可以經過二層網絡到達目的主控端(使用 MAC 位址通信)
- 和其他兩種模式相比,host-gw模式少了額外的封包和拆包過程,效率與虛拟機直接的通信相差無幾。 高效
- host-gw
- 每個主機會維護一張路由表,記錄發往某目标容器子網的資料包的下一跳IP位址(也就是子網所在主控端的IP)
- 主控端将下一跳目的主機的MAC位址作為目的位址,通過二層網絡把包發往目的主機
- 目的主機收到後,會直接轉發給對應容器
- 是以host-gw模式下,資料包直接以容器IP包的形式在網絡中傳遞,每個主控端就是通信鍊路中的網關。
-
Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel
- 當 host A 上的 容器 A 要發送資料 給host B 上的 容器 B
- 根據目的容器 B 的 IP,容器 A 與主控端 A 上的路由表進行比對,需要發給網關進行路由,此時比對的路由規則中的網關就是 host B
- 同理,目的容器若是 容器 A,容器 B 與主控端 B 上的路由表進行比對,需要發給網關進行路由,比對的路由規則中的網關就是 host A
- 是以此模式要求:
- 通信雙方的主控端能夠直接路由,就是中間沒有其他節點
- 叢集的所有節點必須處于同一個網絡内(在同一個二層網絡中,與主控端同一網段,真實 IP)
- 此種模式的限制
- 無法适用于叢集規模較大且需要對節點進行網段劃分的場景
- 随着叢集的擴大,路由表項的更新是個不小的壓力,是以路由表規則的數量實作制網絡規模的一個重要因素
- flanneld 的唯一作用就是負責主機上路由表的動态重新整理