16 張圖硬核講解 Kubernetes 網絡
Overview
本文將探討 Kubernetes 中的網絡模型,以及對各種網絡模型進行分析。
Underlay Network Model
什麼是 Underlay Network
底層網絡 Underlay Network
顧名思義是指網絡設備基礎設施,如交換機,路由器, DWDM
使用網絡介質將其鏈接成的物理網絡拓撲,負責網絡之間的數據包傳輸。
underlay network
可以是二層,也可以是三層;二層的典型例子是以太網 Ethernet
,三層是的典型例子是互聯網 Internet
。
而工作於二層的技術是 vlan
,工作在三層的技術是由 OSPF
, BGP
等協議組成。
k8s 中的 underlay network
在 kubernetes 中,underlay network
中比較典型的例子是通過將宿主機作爲路由器設備,Pod 的網絡則通過學習路由條目從而實現跨節點通訊。
這種模型下典型的有 flannel
的 host-gw
模式與 calico
BGP
模式。
flannel host-gw
flannel host-gw
模式中每個 Node 需要在同一個二層網絡中,並將 Node 作爲一個路由器,跨節點通訊將通過路由表方式進行,這樣方式下將網絡模擬成一個underlay network
。
Notes:因爲是通過路由方式,集羣的 cidr 至少要配置 16,因爲這樣可以保證,跨節點的 Node 作爲一層網絡,同節點的 Pod 作爲一個網絡。如果不是這種用情況,路由表處於相同的網絡中,會存在網絡不可達
Calico BGP
BGP(Border Gateway Protocol
)是去中心化自治路由協議。它是通過維護 IP 路由表或前綴
表來實現 AS (Autonomous System
)之間的可訪問性,屬於向量路由協議。
與 flannel
不同的是,Calico
提供了的 BGP
網絡解決方案,在網絡模型上,Calico
與 Flannel host-gw
是近似的,但在軟件架構的實現上,flannel
使用 flanneld
進程來維護路由信息;而 Calico
是包含多個守護進程的,其中 Brid
進程是一個 BGP
客戶端與路由反射器 (Router Reflector
),BGP
客戶端負責從 Felix
中獲取路由並分發到其他 BGP Peer
,而反射器在 BGP 中起了優化的作用。在同一個 IBGP 中,BGP 客戶端僅需要和一個 RR
相連,這樣減少了AS
內部維護的大量的 BGP 連接。通常情況下,RR
是真實的路由設備,而 Bird
作爲 BGP
客戶端工作。
IPVLAN & MACVLAN
IPVLAN
和 MACVLAN
是一種網卡虛擬化技術,兩者之間的區別爲, IPVLAN
允許一個物理網卡擁有多個 IP 地址,並且所有的虛擬接口用同一個 MAC 地址;而 MACVLAN
則是相反的,其允許同一個網卡擁有多個 MAC 地址,而虛擬出的網卡可以沒有 IP 地址。
因爲是網卡虛擬化技術,而不是網絡虛擬化技術,本質上來說屬於 Overlay network
,這種方式在虛擬化環境中與 Overlay network
相比最大的特點就是可以將 Pod 的網絡拉平到 Node 網絡同級,從而提供更高的性能、低延遲的網絡接口。本質上來說其網絡模型屬於下圖中第二個。
-
虛擬網橋:創建一個虛擬網卡對 (veth pair),一頭在容器內,一頭在宿主機的 root namespaces 內。這樣一來容器內發出的數據包可以通過網橋直接進入宿主機網絡棧,而發往容器的數據包也可以經過網橋進入容器。
-
多路複用:使用一箇中間網絡設備,暴露多個虛擬網卡接口,容器網卡都可以介入這個中間設備,並通過 MAC/IP 地址來區分 packet 應該發往哪個容器設備。
-
硬件交換,爲每個 Pod 分配一個虛擬網卡,這樣一來,Pod 與 Pod 之間的連接關係就會變得非常清晰,因爲近乎物理機之間的通信基礎。如今大多數網卡都支持 SR-IOV 功能,該功能將單一的物理網卡虛擬成多個 VF 接口,每個 VF 接口都有單獨的虛擬 PCIe 通道,這些虛擬的 PCIe 通道共用物理網卡的 PCIe 通道。
在 kubernetes 中 IPVLAN
這種網絡模型下典型的 CNI 有,multus 與 danm。
multus
multus
是 intel 開源的 CNI 方案,是由傳統的 cni
與 multus
,並且提供了 SR-IOV CNI 插件使 K8s pod 能夠連接到 SR-IOV VF 。這是使用了 IPVLAN/MACVLAN
的功能。
當創建新的 Pod 後,SR-IOV 插件開始工作。配置 VF 將被移動到新的 CNI 名稱空間。該插件根據 CNI 配置文件中的 “name” 選項設置接口名稱。最後將 VF 狀態設置爲 UP。
下圖是一個 Multus 和 SR-IOV CNI 插件的網絡環境,具有三個接口的 pod。
-
eth0
是flannel
網絡插件,也是作爲 Pod 的默認網絡 -
VF 是主機的物理端口
ens2f0
的實例化。這是英特爾 X710-DA4 上的一個端口。在 Pod 端的 VF 接口名稱爲south0
。 -
這個 VF 使用了 DPDK 驅動程序,此 VF 是從主機的物理端口
ens2f1
實例化出的。這個是英特爾 ® X710-DA4 上另外一個端口。Pod 內的 VF 接口名稱爲north0
。該接口綁定到 DPDK 驅動程序vfio-pci
。
Notes:術語
NIC:network interface card,網卡
SR-IOV:single root I/O virtualization,硬件實現的功能,允許各虛擬機間共享 PCIe 設備。
VF:Virtual Function,基於 PF,與 PF 或者其他 VF 共享一個物理資源。
PF:PCIe Physical Function,擁有完全控制 PCIe 資源的能力
DPDK:Data Plane Development Kit
於此同時,也可以將主機接口直接移動到 Pod 的網絡名稱空間,當然這個接口是必須存在,並且不能是與默認網絡使用同一個接口。這種情況下,在普通網卡的環境中,就直接將 Pod 網絡與 Node 網絡處於同一個平面內了。
danm
DANM 是諾基亞開源的 CNI 項目,目的是將電信級網絡引入 kubernetes 中,與 multus 相同的是,也提供了 SR-IOV/DPDK 的硬件技術,並且支持 IPVLAN.
Overlay Network Model
什麼是 Overlay
疊加網絡是使用網絡虛擬化技術,在 underlay
網絡上構建出的虛擬邏輯網絡,而無需對物理網絡架構進行更改。本質上來說,overlay network
使用的是一種或多種隧道協議 (tunneling
),通過將數據包封裝,實現一個網絡到另一個網絡中的傳輸,具體來說隧道協議關注的是數據包(幀)。
常見的網絡隧道技術
-
通用路由封裝 (
Generic Routing Encapsulation
) 用於將來自 IPv4/IPv6 的數據包封裝爲另一個協議的數據包中,通常工作與 L3 網絡層中。 -
VxLAN (
Virtual Extensible LAN
),是一個簡單的隧道協議,本質上是將 L2 的以太網幀封裝爲 L4 中 UDP 數據包的方法,使用 4789 作爲默認端口。VxLAN
也是VLAN
的擴展,對於 4096(m0MsmU 位VLAN ID
) 擴展爲 1600 萬(ylRhDp 位VN·ID
)個邏輯網絡。
這種工作在 overlay
模型下典型的有 flannel
與 calico
中的的 VxLAN
, IPIP
模式。
IPIP
IP in IP
也是一種隧道協議,與 VxLAN
類似的是,IPIP
的實現也是通過 Linux 內核功能進行的封裝。IPIP
需要內核模塊 ipip.ko
使用命令查看內核是否加載 IPIP 模塊lsmod | grep ipip
;使用命令modprobe ipip
加載。
Kubernetes 中 IPIP
與 VxLAN
類似,也是通過網絡隧道技術實現的。與 VxLAN
差別就是,VxLAN
本質上是一個 UDP 包,而 IPIP
則是將包封裝在本身的報文包上。
Notes:公有云可能不允許 IPIP 流量,例如 Azure
VxLAN
kubernetes 中不管是 flannel
還是 calico
VxLAN 的實現都是使用 Linux 內核功能進行的封裝,Linux 對 vxlan 協議的支持時間並不久,2012 年 Stephen Hemminger 才把相關的工作合併到 kernel 中,並最終出現在 kernel 3.7.0 版本。爲了穩定性和很多的功能,你可以會看到某些軟件推薦在 3.9.0 或者 3.10.0 以後版本的 kernel 上使用 VxLAN
。
在 kubernetes 中 vxlan 網絡,例如 flannel
,守護進程會根據 kubernetes 的 Node 而維護 VxLAN
,名稱爲 flannel.1
這是 VNID
,並維護這個網絡的路由,當發生跨節點的流量時,本地會維護對端 VxLAN
設備的 MAC 地址,通過這個地址可以知道發送的目的端,這樣就可以封包發送到對端,收到包的對端 VxLAN 設備 flannel.1
解包後得到真實的目的地址。
查看 Forwarding database
列表
$ bridge fdb
26:5e:87:90:91:fc dev flannel.1 dst 10.0.0.3 self permanent
Notes:VxLAN 使用的 4789 端口,wireshark 應該是根據端口進行分析協議的,而 flannel 在 linux 中默認端口是 8472,此時抓包僅能看到是一個 UDP 包。
通過上述的架構可以看出,隧道實際上是一個抽象的概念,並不是建立的真實的兩端的隧道,而是通過將數據包封裝成另一個數據包,通過物理設備傳輸後,經由相同的設備(網絡隧道)進行解包實現網絡的疊加。
weave vxlan
weave 也是使用了 VxLAN
技術完成的包的封裝,這個技術在 weave
中稱之爲 fastdp (fast data path)
,與 calico
和 flannel
中用到的技術不同的,這裏使用的是 Linux 內核中的 openvswitch datapath module
,並且 weave 對網絡流量進行了加密。
Notes:fastdp 工作在 Linux 內核版本 3.12 及更高版本,如果低於此版本的例如 CentOS7,weave 將工作在用戶空間,weave 中稱之爲
sleeve mode
Reference
https://github.com/flannel-io/flannel/blob/master/Documentation/backends.md#host-gw
https://projectcalico.docs.tigera.io/networking/bgp
https://www.weave.works/docs/net/latest/concepts/router-encapsulation/
https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin
https://github.com/nokia/danm
作者:Cylon 原文鏈接:https://www.cnblogs.com/Cylon/p/16595820.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/pgXQOak1RbSydTQFNRAdbg