k8s集群網路(14)-flannel underlay overlay 網路通訊對比
- 2020 年 4 月 1 日
- 筆記
在前面的幾篇文章里我們介紹了基於flannel的underlay網路和overlay網路,包括host-gw模式的underlay網路,基於vxlan的overlay網路,基於udp的overlay網路。這裡我們做一下回顧總結和對比,相關文章可以參考如下:
- flannel underlay網路
- flannel vxlan overlay網路setup
- flannel vxlan overlay網路
- flannel udp overlay網路setup
- flannel udp overlay網路
對於flannel underlay網路:
- 數據包從源pod的network namespace到host network namespace的docker0 linux bridge上。
- 在源pod的host里做路由選擇,下一跳地址為目標pod的host。
- 在目標pod的host里做路由選擇,本地直連路由到目標pod里。
- 要求所有的worker node必須開啟路由轉發功能(net.ipv4.ip_forward = 1)。
- 要求所有的worker node都在同一個二層網路里,來完成目標pod的下一跳路由。
- host里的路由會在flannel啟動的時候寫入,因為host連接etcd集群,知道哪個子網屬於哪個host。
對於flannel vxlan overlay網路:
- 每個宿主都有名字為flannel.x的vxlan網路設備來完成對於vxlan數據的udp封包與拆包,upd數據在宿主的8472埠上(埠值可配置)處理。
- 數據從pod的network namespace進入到host的network namespace中。
- 根據host network namespace中的路由表,下一跳ip為目標vxlan設備的ip,並且由當前host的flannel.x設備發送。
- 根據host network namespace中的apr表找到下一跳ip的mac地址。
- 根據host network namespace中fbd轉發表找到下一跳ip的mac地址對應的轉發ip。
- 當前host的flannel.x設備根據下一跳ip的mac地址對應的轉發ip和本地路由表進行upd封包,這個時候:
- 外層udp包:源ip為當前host ip,目標ip為mac轉發表中匹配的ip,源mac為前host ip的mac,目標mac為fdb中匹配ip的mac。目標埠為8472(可配置),vxlan id為1(可配置).
- 內層二層以太包:源ip為源pod ip,目標ip為目標pod ip,源mac為源pod mac,目標mac為host network namespace中路由表裡下一跳ip的mac(一般為目標pod對應的host中flannel.x設備ip的mac)。
- 數據包由當前host路由到目標節點host。
- 目標節點host的8472埠接收到udp包之後,發現數據包里有vxlan id標識.。然後根據linux vxlan協議,在目標宿主機器上找到與數據報文中vxlan id對應的vxlan設備,將數據交由其處理。
- vxlan設備收到數據之後開始對vxlan udp報文拆包,去掉upd報文的ip,port,mac資訊後得到內部的payload,發現是一個二層報文。然後繼續對這個二層報文拆包,得到裡面的源pod ip和目標pod ip。
- 根據目標節點host上路由表,將數據由linux bridge docker0做本地轉發。
- 數據由linux bridge docker0利用veth pair轉發到目標pod。
- 每個host的flannel服務啟動的時候讀取etcd中的vxlan配置資訊,在host的路由表的和mac轉發介面表fdb里寫入相應數據。
對於flannel udp overlay網路:
- 每個宿主都有名字為flannel0的TUN網路設備來完成對於原始ip數據包的udp封包與拆包,upd數據在宿主的8285埠上(埠值可配置)的flannel進程處理。
- 數據從pod的network namespace進入到host的network namespace中。
- 根據host network namespace中的路由表,下一跳ip為目標為直連,並且由當前host的TUN設備flannel0發送。
- 當前host的TUN設備flannel0將數據從內核空間交給用戶空間應用程式flannel。
- 戶空間應用程式flannel根據目標ip屬於哪個子網,然後在etcd中查詢這個子網所在的目標host,最後完成upd封包,這個時候:
- 對於原始ip包:源ip為源pod ip,目標ip為目標pod ip。
- 對於外層udp包:源ip為當前host的ip,目標ip為flannel在etcd中查詢的匹配ip,目標port為8285(可以配置),源埠為隨機埠。
- flannel將upd包發送給TUN設備flannel0,數據由用戶空間進入內核空間。
- 數據在內核空間根據路由策略發送到目標宿主的8285埠。
- 目標宿主的8285埠為flannel進程,數據由內核空間進入用戶空間。
- flannel進程對udp數據拆包,去掉ip和port資訊,得到內層的原始ip包。然後把這個包發送給TUN device flannel0,數據由程式用戶空間進入內核空間。
- 根據目標節點host上路由表,將數據由linux bridge docker0做本地轉發。
- 數據由linux bridge docker0利用veth pair轉發到目標pod。
對於以上三種方式:
- 都要求host宿主開啟網路轉發功能(net.ipv4.ip_forward = 1)。
- flannel underlay網路沒有數據包的額外封包與拆包,效率會更高一些。
- 對於flannel underlay網路要求所有的worker node都在同一個二層網路里,從而完成目標pod的下一跳路由。換句話說,underlay網路worker node不能跨子網。
- flannel vxlan overlay網路和flannel udp overlay網路的worker node只要三層路由可達就好,支援worker node能跨子網。
- 對於flannel vxlan overlay網路和flannel udp overlay網路都有封包與拆包,並且外層包都是udp包。
- flannel vxlan overlay網路內層包是二層以太包,flannel udp overlay網路內層包是三層ip包。
- flannel vxlan overlay網路基於linux vxlan設備,flannel udp overlay網路基於linux TUN設備。
- flannel underlay網路和flannel vxlan overlay網路所有數據包都由作業系統內核空間處理,沒有用戶空間的應用程式參與。
- flannel udp overlay網路數據包既有作業系統內核空間處理,也有用戶空間的應用程式flannel參與,所以udp overlay網路效率最低,基本不會在生產上使用。
以上回顧了flannel underlay網路,vxlan overlay網路,udp overlay網路,做了一些總結和對比。但是在生產環境中具體選用那種網路請根據實際需求來,對於flannel underlay網路和flannel vxlan overlay網路並沒有明顯偏好。