<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          16 張圖硬核講解 Kubernetes 網(wǎng)絡(luò)

          共 5410字,需瀏覽 11分鐘

           ·

          2022-11-18 23:03

          Overview

          本文將探討 Kubernetes 中的網(wǎng)絡(luò)模型,以及對各種網(wǎng)絡(luò)模型進行分析。

          Underlay Network Model

          什么是 Underlay Network

          底層網(wǎng)絡(luò) Underlay Network 顧名思義是指網(wǎng)絡(luò)設(shè)備基礎(chǔ)設(shè)施,如交換機,路由器, DWDM 使用網(wǎng)絡(luò)介質(zhì)將其鏈接成的物理網(wǎng)絡(luò)拓?fù)洌?fù)責(zé)網(wǎng)絡(luò)之間的數(shù)據(jù)包傳輸。

          Underlay network topology

          underlay network 可以是二層,也可以是三層;二層的典型例子是以太網(wǎng) Ethernet,三層是的典型例子是互聯(lián)網(wǎng) Internet

          而工作于二層的技術(shù)是 vlan,工作在三層的技術(shù)是由 OSPF, BGP 等協(xié)議組成。

          k8s 中的 underlay network

          在 kubernetes 中,underlay network 中比較典型的例子是通過將宿主機作為路由器設(shè)備,Pod 的網(wǎng)絡(luò)則通過學(xué)習(xí)路由條目從而實現(xiàn)跨節(jié)點通訊。

          underlay network topology in kubernetes

          這種模型下典型的有 flannelhost-gw 模式與 calico BGP 模式。

          flannel host-gw

          flannel host-gw 模式中每個 Node 需要在同一個二層網(wǎng)絡(luò)中,并將 Node 作為一個路由器,跨節(jié)點通訊將通過路由表方式進行,這樣方式下將網(wǎng)絡(luò)模擬成一個underlay network

          layer2 ethernet topology

          Notes:因為是通過路由方式,集群的 cidr 至少要配置 16,因為這樣可以保證,跨節(jié)點的 Node 作為一層網(wǎng)絡(luò),同節(jié)點的 Pod 作為一個網(wǎng)絡(luò)。如果不是這種用情況,路由表處于相同的網(wǎng)絡(luò)中,會存在網(wǎng)絡(luò)不可達

          Calico BGP

          BGP(Border Gateway Protocol)是去中心化自治路由協(xié)議。它是通過維護 IP 路由表或前綴表來實現(xiàn) AS (Autonomous System)之間的可訪問性,屬于向量路由協(xié)議。

          BGP network topology

          flannel 不同的是,Calico 提供了的 BGP 網(wǎng)絡(luò)解決方案,在網(wǎng)絡(luò)模型上,CalicoFlannel host-gw 是近似的,但在軟件架構(gòu)的實現(xiàn)上,flannel 使用 flanneld 進程來維護路由信息;而 Calico 是包含多個守護進程的,其中 Brid 進程是一個 BGP 客戶端與路由反射器(Router Reflector),BGP 客戶端負(fù)責(zé)從 Felix 中獲取路由并分發(fā)到其他 BGP Peer,而反射器在 BGP 中起了優(yōu)化的作用。在同一個 IBGP 中,BGP 客戶端僅需要和一個 RR 相連,這樣減少了AS內(nèi)部維護的大量的 BGP 連接。通常情況下,RR 是真實的路由設(shè)備,而 Bird 作為 BGP 客戶端工作。

          Calico Network Architecture

          IPVLAN & MACVLAN

          IPVLANMACVLAN 是一種網(wǎng)卡虛擬化技術(shù),兩者之間的區(qū)別為, IPVLAN 允許一個物理網(wǎng)卡擁有多個 IP 地址,并且所有的虛擬接口用同一個 MAC 地址;而 MACVLAN 則是相反的,其允許同一個網(wǎng)卡擁有多個 MAC 地址,而虛擬出的網(wǎng)卡可以沒有 IP 地址。

          因為是網(wǎng)卡虛擬化技術(shù),而不是網(wǎng)絡(luò)虛擬化技術(shù),本質(zhì)上來說屬于 Overlay network,這種方式在虛擬化環(huán)境中與 Overlay network 相比最大的特點就是可以將 Pod 的網(wǎng)絡(luò)拉平到 Node 網(wǎng)絡(luò)同級,從而提供更高的性能、低延遲的網(wǎng)絡(luò)接口。本質(zhì)上來說其網(wǎng)絡(luò)模型屬于下圖中第二個。

          Virtual networking modes: bridging, multiplexing and SR-IOV
          • 虛擬網(wǎng)橋:創(chuàng)建一個虛擬網(wǎng)卡對(veth pair),一頭在容器內(nèi),一頭在宿主機的 root namespaces 內(nèi)。這樣一來容器內(nèi)發(fā)出的數(shù)據(jù)包可以通過網(wǎng)橋直接進入宿主機網(wǎng)絡(luò)棧,而發(fā)往容器的數(shù)據(jù)包也可以經(jīng)過網(wǎng)橋進入容器。
          • 多路復(fù)用:使用一個中間網(wǎng)絡(luò)設(shè)備,暴露多個虛擬網(wǎng)卡接口,容器網(wǎng)卡都可以介入這個中間設(shè)備,并通過 MAC/IP 地址來區(qū)分 packet 應(yīng)該發(fā)往哪個容器設(shè)備。
          • 硬件交換,為每個 Pod 分配一個虛擬網(wǎng)卡,這樣一來,Pod 與 Pod 之間的連接關(guān)系就會變得非常清晰,因為近乎物理機之間的通信基礎(chǔ)。如今大多數(shù)網(wǎng)卡都支持 SR-IOV 功能,該功能將單一的物理網(wǎng)卡虛擬成多個 VF 接口,每個 VF 接口都有單獨的虛擬 PCIe 通道,這些虛擬的 PCIe 通道共用物理網(wǎng)卡的 PCIe 通道。

          在 kubernetes 中 IPVLAN 這種網(wǎng)絡(luò)模型下典型的 CNI 有,multus 與 danm。

          multus

          multus 是 intel 開源的 CNI 方案,是由傳統(tǒng)的 cnimultus,并且提供了 SR-IOV CNI 插件使 K8s pod 能夠連接到 SR-IOV VF 。這是使用了 IPVLAN/MACVLAN 的功能。

          當(dāng)創(chuàng)建新的 Pod 后,SR-IOV 插件開始工作。配置 VF 將被移動到新的 CNI 名稱空間。該插件根據(jù) CNI 配置文件中的 “name” 選項設(shè)置接口名稱。最后將 VF 狀態(tài)設(shè)置為 UP。

          下圖是一個 Multus 和 SR-IOV CNI 插件的網(wǎng)絡(luò)環(huán)境,具有三個接口的 pod。

          • eth0flannel 網(wǎng)絡(luò)插件,也是作為 Pod 的默認(rèn)網(wǎng)絡(luò)
          • VF 是主機的物理端口 ens2f0 的實例化。這是英特爾 X710-DA4 上的一個端口。在 Pod 端的 VF 接口名稱為 south0
          • 這個 VF 使用了 DPDK 驅(qū)動程序,此 VF 是從主機的物理端口 ens2f1 實例化出的。這個是英特爾 ? X710-DA4 上另外一個端口。Pod 內(nèi)的 VF 接口名稱為 north0。該接口綁定到 DPDK 驅(qū)動程序 vfio-pci
          Mutus networking Architecture overlay and SR-IOV

          Notes:術(shù)語

          • NIC:network interface card,網(wǎng)卡
          • SR-IOV:single root I/O virtualization,硬件實現(xiàn)的功能,允許各虛擬機間共享 PCIe 設(shè)備。
          • VF:Virtual Function,基于 PF,與 PF 或者其他 VF 共享一個物理資源。
          • PF:PCIe Physical Function,擁有完全控制 PCIe 資源的能力
          • DPDK:Data Plane Development Kit

          于此同時,也可以將主機接口直接移動到 Pod 的網(wǎng)絡(luò)名稱空間,當(dāng)然這個接口是必須存在,并且不能是與默認(rèn)網(wǎng)絡(luò)使用同一個接口。這種情況下,在普通網(wǎng)卡的環(huán)境中,就直接將 Pod 網(wǎng)絡(luò)與 Node 網(wǎng)絡(luò)處于同一個平面內(nèi)了。

          Mutus networking Architecture overlay and ipvlan

          danm

          DANM 是諾基亞開源的 CNI 項目,目的是將電信級網(wǎng)絡(luò)引入 kubernetes 中,與 multus 相同的是,也提供了 SR-IOV/DPDK 的硬件技術(shù),并且支持 IPVLAN.

          Overlay Network Model

          什么是 Overlay

          疊加網(wǎng)絡(luò)是使用網(wǎng)絡(luò)虛擬化技術(shù),在 underlay 網(wǎng)絡(luò)上構(gòu)建出的虛擬邏輯網(wǎng)絡(luò),而無需對物理網(wǎng)絡(luò)架構(gòu)進行更改。本質(zhì)上來說,overlay network 使用的是一種或多種隧道協(xié)議 (tunneling),通過將數(shù)據(jù)包封裝,實現(xiàn)一個網(wǎng)絡(luò)到另一個網(wǎng)絡(luò)中的傳輸,具體來說隧道協(xié)議關(guān)注的是數(shù)據(jù)包(幀)。

          overlay network topology

          常見的網(wǎng)絡(luò)隧道技術(shù)

          • 通用路由封裝 ( Generic Routing Encapsulation ) 用于將來自 IPv4/IPv6 的數(shù)據(jù)包封裝為另一個協(xié)議的數(shù)據(jù)包中,通常工作與 L3 網(wǎng)絡(luò)層中。
          • VxLAN (Virtual Extensible LAN),是一個簡單的隧道協(xié)議,本質(zhì)上是將 L2 的以太網(wǎng)幀封裝為 L4 中 UDP 數(shù)據(jù)包的方法,使用 4789 作為默認(rèn)端口。VxLAN 也是 VLAN 的擴展,對于 4096(VLAN ID) 擴展為 1600 萬(VN·ID )個邏輯網(wǎng)絡(luò)。

          這種工作在 overlay 模型下典型的有 flannelcalico 中的的 VxLAN, IPIP 模式。

          IPIP

          IP in IP 也是一種隧道協(xié)議,與 VxLAN 類似的是,IPIP 的實現(xiàn)也是通過 Linux 內(nèi)核功能進行的封裝。IPIP 需要內(nèi)核模塊 ipip.ko 使用命令查看內(nèi)核是否加載 IPIP 模塊lsmod | grep ipip ;使用命令modprobe ipip 加載。

          A simple IPIP network workflow

          Kubernetes 中 IPIPVxLAN 類似,也是通過網(wǎng)絡(luò)隧道技術(shù)實現(xiàn)的。與 VxLAN 差別就是,VxLAN 本質(zhì)上是一個 UDP 包,而 IPIP 則是將包封裝在本身的報文包上。

          IPIP in kubernetes
          IPIP packet with wireshark unpack

          Notes:公有云可能不允許 IPIP 流量,例如 Azure

          VxLAN

          kubernetes 中不管是 flannel 還是 calico VxLAN 的實現(xiàn)都是使用 Linux 內(nèi)核功能進行的封裝,Linux 對 vxlan 協(xié)議的支持時間并不久,2012 年 Stephen Hemminger 才把相關(guān)的工作合并到 kernel 中,并最終出現(xiàn)在 kernel 3.7.0 版本。為了穩(wěn)定性和很多的功能,你可以會看到某些軟件推薦在 3.9.0 或者 3.10.0 以后版本的 kernel 上使用 VxLAN

          A simple VxLAN network topology

          在 kubernetes 中 vxlan 網(wǎng)絡(luò),例如 flannel,守護進程會根據(jù) kubernetes 的 Node 而維護 VxLAN,名稱為 flannel.1 這是 VNID,并維護這個網(wǎng)絡(luò)的路由,當(dāng)發(fā)生跨節(jié)點的流量時,本地會維護對端 VxLAN 設(shè)備的 MAC 地址,通過這個地址可以知道發(fā)送的目的端,這樣就可以封包發(fā)送到對端,收到包的對端 VxLAN 設(shè)備 flannel.1 解包后得到真實的目的地址。

          查看 Forwarding database 列表

          $ bridge fdb
          26:5e:87:90:91:fc dev flannel.1 dst 10.0.0.3 self permanent
          VxLAN in kubernetes
          VxLAN packet with wireshark unpack

          Notes:VxLAN 使用的 4789 端口,wireshark 應(yīng)該是根據(jù)端口進行分析協(xié)議的,而 flannel 在 linux 中默認(rèn)端口是 8472,此時抓包僅能看到是一個 UDP 包。

          通過上述的架構(gòu)可以看出,隧道實際上是一個抽象的概念,并不是建立的真實的兩端的隧道,而是通過將數(shù)據(jù)包封裝成另一個數(shù)據(jù)包,通過物理設(shè)備傳輸后,經(jīng)由相同的設(shè)備(網(wǎng)絡(luò)隧道)進行解包實現(xiàn)網(wǎng)絡(luò)的疊加。

          weave vxlan

          weave 也是使用了 VxLAN 技術(shù)完成的包的封裝,這個技術(shù)在 weave 中稱之為 fastdp (fast data path),與 calicoflannel 中用到的技術(shù)不同的,這里使用的是 Linux 內(nèi)核中的 openvswitch datapath module,并且 weave 對網(wǎng)絡(luò)流量進行了加密。

          weave fastdp network topology

          Notes:fastdp 工作在 Linux 內(nèi)核版本 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


          瀏覽 44
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久午夜视频 | 国产亚洲精品精品精品 | 啪啪啪导航| 欧美日韩123区 | 国产中文字幕网站 |