天天看點

Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel

文章目錄

  • 計網基礎知識
    • 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)?
Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel

封包

  • 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,導緻資料被丢棄

要具有的假設概念

  1. 若容器為虛拟 IP,那麼假設 隻有源主機 和 目的主機 認識 源容器和目的容器的 VIP(虛拟 IP )
  2. 若容器為虛拟 IP,那麼若在三層傳輸(利用 IP 傳輸),必須借用主控端 IP,僞裝成大人的模樣(也就是再次封裝),否則中間路徑上的裝置都不認識
  3. 若容器為虛拟 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 擷取
Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel

缺點

UDP模式使用了Flannel自定義的一種標頭協定,實作三層網絡Overlay網絡處理跨主通信的問題。但是由于資料在核心和使用者态經過了多次拷貝:容器是使用者态,docker0和flannel0是核心态,flanneld是使用者态,最終又要通過核心将資料發到外部網絡,是以性能損耗較大,對于有資料傳輸有要求的線上業務并不适用。

Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel

有沒有比 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 表項

Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel
Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel
Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel
  • VXLAN 其實是在三層網絡上建構出來一個二層網絡通道
  • 原來的二層以太網幀(包含 MAC 頭部、IP 頭部、和傳輸層頭部的封包),被放在 VXLAN 標頭李進行封裝,在套到标準的 UDP 頭部(UDP 頭部、IP 頭部和 MAC 頭部),用來在底層網絡上傳輸封包
Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel

可能困惑的點

  • 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 可以支撐千萬級租戶
Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel

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 的唯一作用就是負責主機上路由表的動态重新整理
Kubernetes(k8s)網絡 overlay 與 flannel 分析學習計網基礎知識容器網絡組網類型Flannel

繼續閱讀