<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ò)

          共 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í)路由條目從而實(shí)現(xiàn)跨節(jié)點(diǎn)通訊。

          underlay network topology in kubernetes

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

          flannel host-gw

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

          layer2 ethernet topology

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

          Calico BGP

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

          BGP network topology

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

          Calico Network Architecture

          IPVLAN & MACVLAN

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

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

          Virtual networking modes: bridging, multiplexing and SR-IOV
          • 虛擬網(wǎng)橋:創(chuàng)建一個(gè)虛擬網(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ù)用:使用一個(gè)中間網(wǎng)絡(luò)設(shè)備,暴露多個(gè)虛擬網(wǎng)卡接口,容器網(wǎng)卡都可以介入這個(gè)中間設(shè)備,并通過 MAC/IP 地址來區(qū)分 packet 應(yīng)該發(fā)往哪個(gè)容器設(shè)備。
          • 硬件交換,為每個(gè) Pod 分配一個(gè)虛擬網(wǎng)卡,這樣一來,Pod 與 Pod 之間的連接關(guān)系就會(huì)變得非常清晰,因?yàn)榻跷锢頇C(jī)之間的通信基礎(chǔ)。如今大多數(shù)網(wǎng)卡都支持 SR-IOV 功能,該功能將單一的物理網(wǎng)卡虛擬成多個(gè) VF 接口,每個(gè) 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 將被移動(dòng)到新的 CNI 名稱空間。該插件根據(jù) CNI 配置文件中的 “name” 選項(xiàng)設(shè)置接口名稱。最后將 VF 狀態(tài)設(shè)置為 UP。

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

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

          Notes:術(shù)語

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

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

          Mutus networking Architecture overlay and ipvlan

          danm

          DANM 是諾基亞開源的 CNI 項(xiàng)目,目的是將電信級(jí)網(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ù)包封裝,實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)到另一個(gè)網(wǎng)絡(luò)中的傳輸,具體來說隧道協(xié)議關(guān)注的是數(shù)據(jù)包(幀)。

          overlay network topology

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

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

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

          IPIP

          IP in IP 也是一種隧道協(xié)議,與 VxLAN 類似的是,IPIP 的實(shí)現(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ù)實(shí)現(xiàn)的。與 VxLAN 差別就是,VxLAN 本質(zhì)上是一個(gè) UDP 包,而 IPIP 則是將包封裝在本身的報(bào)文包上。

          IPIP in kubernetes
          IPIP packet with wireshark unpack

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

          VxLAN

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

          A simple VxLAN network topology

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

          查看 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,此時(shí)抓包僅能看到是一個(gè) UDP 包。

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

          weave vxlan

          weave 也是使用了 VxLAN 技術(shù)完成的包的封裝,這個(gè)技術(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)個(gè)在看 

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  99re在线视频免费观看 | 亚洲高清无码免费观看 | 国产三级高清在线 | 亚洲乱码国产乱码午夜 | 午夜性爱视频在线播放 |