1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5439字,需瀏覽 11分鐘

         ·

        2022-11-22 20:00

        Overview

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

        Underlay Network Model

        什么是 Underlay Network

        底層網(wǎng)絡(luò) Underlay Network 顧名思義是指網(wǎng)絡(luò)設(shè)備基礎(chǔ)設(shè)施,如交換機(jī),路由器, 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 中比較典型的例子是通過將宿主機(jī)作為路由器設(shè)備,Pod 的網(wǎng)絡(luò)則通過學(xué)習(xí)路由條目從而實現(xiàn)跨節(jié)點(diǎn)通訊。

        underlay network topology in kubernetes

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

        flannel host-gw

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

        layer2 ethernet topology

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

        Calico BGP

        BGP(Border Gateway Protocol)是去中心化自治路由協(xié)議。它是通過維護(hù) 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 進(jìn)程來維護(hù)路由信息;而 Calico 是包含多個守護(hù)進(jìn)程的,其中 Brid 進(jìn)程是一個 BGP 客戶端與路由反射器(Router Reflector),BGP 客戶端負(fù)責(zé)從 Felix 中獲取路由并分發(fā)到其他 BGP Peer,而反射器在 BGP 中起了優(yōu)化的作用。在同一個 IBGP 中,BGP 客戶端僅需要和一個 RR 相連,這樣減少了AS內(nèi)部維護(hù)的大量的 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 相比最大的特點(diǎn)就是可以將 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),一頭在宿主機(jī)的 root namespaces 內(nèi)。這樣一來容器內(nèi)發(fā)出的數(shù)據(jù)包可以通過網(wǎng)橋直接進(jìn)入宿主機(jī)網(wǎng)絡(luò)棧,而發(fā)往容器的數(shù)據(jù)包也可以經(jīng)過網(wǎng)橋進(jìn)入容器。
        • 多路復(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)系就會變得非常清晰,因為近乎物理機(jī)之間的通信基礎(chǔ)。如今大多數(shù)網(wǎng)卡都支持 SR-IOV 功能,該功能將單一的物理網(wǎng)卡虛擬成多個 VF 接口,每個 VF 接口都有單獨(dú)的虛擬 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 是主機(jī)的物理端口 ens2f0 的實例化。這是英特爾 X710-DA4 上的一個端口。在 Pod 端的 VF 接口名稱為 south0
        • 這個 VF 使用了 DPDK 驅(qū)動程序,此 VF 是從主機(jī)的物理端口 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)的功能,允許各虛擬機(jī)間共享 PCIe 設(shè)備。
        • VF:Virtual Function,基于 PF,與 PF 或者其他 VF 共享一個物理資源。
        • PF:PCIe Physical Function,擁有完全控制 PCIe 資源的能力
        • DPDK:Data Plane Development Kit

        于此同時,也可以將主機(jī)接口直接移動到 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)進(jìn)行更改。本質(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 的擴(kuò)展,對于 4096(VLAN ID) 擴(kuò)展為 1600 萬(VN·ID )個邏輯網(wǎng)絡(luò)。

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

        IPIP

        IP in IP 也是一種隧道協(xié)議,與 VxLAN 類似的是,IPIP 的實現(xiàn)也是通過 Linux 內(nèi)核功能進(jìn)行的封裝。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)核功能進(jìn)行的封裝,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,守護(hù)進(jìn)程會根據(jù) kubernetes 的 Node 而維護(hù) VxLAN,名稱為 flannel.1 這是 VNID,并維護(hù)這個網(wǎng)絡(luò)的路由,當(dāng)發(fā)生跨節(jié)點(diǎn)的流量時,本地會維護(hù)對端 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ù)端口進(jìn)行分析協(xié)議的,而 flannel 在 linux 中默認(rèn)端口是 8472,此時抓包僅能看到是一個 UDP 包。

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

        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

        Linux學(xué)習(xí)指南

        有收獲,點(diǎn)個在看 

        瀏覽 75
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日韩一级高清 | 人人草人人爱 | 国产乱婬AⅤ片免费 | 最近中文字幕av 欧美乱视频 | 97黄色网 | 亚洲人成免费电影 | 中日韩欧美一级A片免费 | 豆花视频成人网站入口 | 亲嘴还扔衣服亲脖子 | 宅男666 |