flannel網絡插件介紹


插件介紹

     flannel項目本身只是一個框架 真正為用戶提供容器網絡功能的是后端實現 目前支持三種方式

     1.VXLAN

     2.host-gw

     3.UDP

    flannel會在宿主機上創建一個flannel0設備和創建一系列的路由表規則

flannel0設備介紹

負責在操作系統內核和用戶應用程序之間傳遞IP包
   1.內核態向用戶態流動
      當操作系統將一個IP包發送給flannel0設備后,flannel0設備就會把這個IP包交給
      創建這個設備的應用程序也就是flanneld進程
   2.用戶態向內核態流動
      flanneld進程向flannel0設備發送了一個IP包 這個IP包就會出現在宿主機的網絡棧中 然后根據宿主機上的路由表規則處理

flannel子網

      每台宿主機都會被flannel分配一個單獨的子網段
     每台宿主機上的所有容器地址都是這個子網段中的一個IP地址
     子網信息和宿主機的對應關系都保存在etcd中
     必須把docker0網橋的地址范圍設置成flannel為宿主機分配的子網
     dockderd --bip=flannel_subnet

UDP模式

    UDP數據包封裝模式
         容器進程     ->     docker0    >內核                        用戶態到內核態
         內核      >  flannel0        > flanneld進程                 內核態到用戶態
         flanneld進程  >  內核 >  eth0物理機網卡發出        用戶態到內核態
         由於UDP模式在內核態和用戶態切換次數過多     所以性能比較差

        系統級別編程的優化原則就是要減少用戶態到內核態的切換次數 並且把核心的處理邏輯都放在內核態進行

    數據包流程分析

       UDP包的源地址和目標地址都是物理機地址 目標主機的flanneld進程在收到UDP包后
       1.flanneld進程解析UDP包里的容器源IP和目標容器IP然后把解析后的包發給flannel0設備
       2.操作系統自動接收flannel0中的數據 根據宿主機路由表轉發到docker0設備
       3.docker0通過自身的端口找到目標容器

  

 

   

VXLAN模式

     VXLAN本身是Linux內核自帶的模塊 完全可以在內核態實現封裝和解封裝的操作

     VXLAN的設計思想
        在現有的三層網絡上 構建一個虛擬的 由內核VXLAN模塊負責維護的二層網絡
        使得連接在這個VXLAN二層網絡中的虛擬機或者容器可以像在一個LAN中自由通信
        在一個LAN中的所有主機相當於連接在一個交換機上 通過交換機就可以找到目標機

    VTEP虛擬隧道端點設備 在宿主機上創建的設備叫flannel1
         VTEP設備既有自己的IP地址 也有自己的MAC地址
         VTEP設備和flannel0設備的作用相同 區別在於VTEP設備封裝和解封裝的對象是二層數據幀
         flannel0設備封裝和解封裝的對象是UDP數據包

  通過每個宿主機上的VTEP設備組成了一個虛擬的二層網絡 通過二層數據幀進行通信
  二層通信需要封裝源MAC地址和目標MAC地址
  根據目標IP來查找目標的MAC地址 是通過ARP表來實現的
  flanneld進程會在每個節點上自動維護VTEP的IP和MAC地址的對應關系
  ip neigh show dev flannel.1
  flanneld進程
      1.維護主機路由表 記錄網段 網關 處理網卡設備信息
         根據路由記錄找到目標設備的IP地址
      2.維護VTEP設備的ARP表 記錄VTEP的IP和MAC地址的對應關系
         根據目標設備的IP地址找到目標設備的MAC地址
      3.維護FDB 網橋轉發規則 記錄VTEP的MAC地址和宿主機IP對應關系

      4.flannel子網和宿主機之間的對應關系

     flanneld做為宿主機上的一個用戶進程 它們之間只要宿主機能相互通信
     那么每個宿主機上的flanneld進程是可以通過宿主機網絡相互傳遞數據包的

    最新版本的 Flannel 並不依賴 L3 MISS 事件和 ARP 學習,而會在每台節點啟動時把它的 VTEP 設備對應的 ARP 記錄,直接下放到其他每台宿主機上

    封裝好VTEP設備的MAC地址(內部數據幀),對於宿主機網絡來說並沒有什么實際意義所以上面封裝出來的這個數據幀,並不能在我們的宿主機二層網絡里傳輸
   所以接下來,Linux 內核還需要再把“內部數據幀”進一步封裝成為宿主機網絡里的一個普通的數據幀,好讓它“載着”“內部數據幀”,通過宿主機的eth0網卡進行傳輸

  VNI機制
      Linux 內核會在“內部數據幀”前面,加上一個特殊的 VXLAN 頭,用來表示這個“乘客”實際上是一個 VXLAN 要使用的數據幀。而這個 VXLAN 頭里有一個重要的標志叫作 VNI,它        是 VTEP 設備識別某個數據幀是不是應該歸自己處理的重要標識。而在Flannel中,VNI 的默認值是1,這也是為何宿主機上的 VTEP 設備都叫作flannel.1 的原因,這里的“1”,其 實就是 VNI 的值

   VXLAN模式組建的覆蓋網絡,其實就是一個由不同宿主機上的VTEP設備,也就是 flannel.1 設備組成的虛擬二層網絡.對於VTEP設備來說,它發出的“內部數據幀”就仿佛是一直在這個虛擬的二層網絡上流動.這,也正是覆蓋網絡的含義

 UDP模式原理

      通過的是兩個宿主機之間UDP通信 直接像目標主機發送UDP數據包即可(只要求宿主機之間可以相互訪問即可)

      通過flannel維護了一個子網(容器網段)和宿主機IP的對應關系路由規則即可

VXLAN模式原理

     通過VXLAN搭建的一個虛擬二層網絡      二層網絡通信就必須由自己的MAC地址才行

     創建自己的VTEP設備(有自己的IP和MAC地址)  IP是用來給路由表用的 MAC地址是用來在虛擬二層網絡中通信用的

     封裝好的二層數據幀本質上還是走的宿主機之間的UDP通信機制 也只要求宿主機之間能夠連通即可

     目標容器IP 根據路由規則找到 目標VTEP設備的IP 目標設備IP 根據ARP表找到目標設備MAC   目標MAC地址根據FDB表找到目標宿主機IP

      找到目標宿主機IP就變成了兩個宿主機之間的UDP通信  封裝和解析UDP包的內容交給了f'lannel和其創建的獨特的網絡設備

host-gw模式

        三層網絡方案   而在這種模式下 容器通信的過程就免除了額外的封包和解包帶來的性能損耗

       host-gw 模式能夠正常工作的核心,就在於 IP 包在封裝成幀發送出去的時候,會使用路由表里的“下一跳”來設置目的 MAC 地址。這樣,它就會經過二層網絡到達目的宿主機。

      flannel host-gw 模式必須要求集群宿主機之間是二層連通的

     由flanneld負責創建和維護路由規則
      在宿主機10.168.0.2執行ip route...
      10.244.1.0/24    via    10.168.0.3      dev eth0
      10.244.1.0/24     目標容器網段
      10.168.0.3          容器網段所對應的宿主機
      dev eth0     源主機上的處理網絡設備

      目的IP地址屬於 10.244.1.0/24 網段的IP包,應該經過本機的 eth0 設備發出去(即:dev eth0;
      並且它下一跳地址(next-hop)是 10.168.0.3(即:via 10.168.0.3)
      所謂下一跳地址就是:如果IP包從主機A發到主機B,需要經過路由設備X的中轉
      那么X的IP地址就應該配置為主機A的下一跳地址

     10.244.1.x是宿主機10.168.0.3創建的容器ip地址段 當10.168.0.2主機
     上的容器要訪問10.244.1.x容器的時候 IP包從網絡層進入鏈路層2主機會把
     下一跳地址的MAC地址(3主機MAC)封裝成目標MAC地址

    正因如此就要求兩個宿主機10.168.0.2和10.168.0.3必須在同一個二層網絡中 只有這樣兩個主機才能直接通過MAC地址通信


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM