我理解K8集装箱网络的虚拟化

      最后更新:2021-12-02 05:23:11 手机定位技术交流文章

      本文假定读者熟悉以太网的基本概念和Linux系统的基本网络指令,以及TCP/IP协议界和传统网络模型和包件的流动原则,案文涉及Linux内核的实际现实,其中提到内核V4.Nineteen.Version 215。

      image.png

      作者 | 浅奕
      Ali Tech Public是来源。

      本文假定读者熟悉以太网的基本概念和Linux系统的基本网络指令,以及TCP/IP协议界和传统网络模型和包件的流动原则,案文涉及Linux内核的实际现实,其中提到内核V4.Nineteen.Version 215。

      一. 接收内核网络包件的程序

      1 从Netcard到内核

      image.png

      如图[1]所示,当净软件包到达NC(网络计算机,指物理机器)时,由NIC(网络接口控制器,网络接口控制器,通常称为网卡)处理,该控制器中断向内核发送信息。Linux内核的中断与上半部(Top half)和下半部(Bottom half)分离。

      具体到 NIC 的处理流程如下:当 NIC 收到数据时,会以 DMA 方式将数据拷贝到 Ring Buffer (接收队列) 里描述符指向的映射内存区域,拷贝完成后会触发中断通知 CPU 进行处理。这里可以使用 ethtool -g {设备名,如eth0} 命令查看 RX/TX (接收/发送)队列的大小。CPU 识别到中断后跳转到 NIC 的中断处理函数开始执行。此时要区分 NIC 的工作模式,在早先的非 NAPI(New API)[2]模式下,中断上半部更新相关的寄存器信息,查看接收队列并分配 sk_buff 结构指向接收到的数据,最后调用 netif_rx() 把 sk_buff 递交给内核处理。在 netif_rx() 的函数的流程中,这个分配的 sk_buff 结构被放入 input_pkt_queue队列后,会把一个虚拟设备加入poll_list 轮询队列并触发软中断 NET_RX_SOFTIRQ 激活中断下半部。此时中断上半部就结束了,详细的处理流程可以参见 net/core/dev.c 的 netif_rx() -> netif_rx_internal() -> enqueue_to_backlog() 过程。下半部 NET_RX_SOFTIRQ 软中断对应的处理函数是 net_rx_action(),这个函数会调用设备注册的 poll() 函数进行处理。非 NAPI 的情况下这个虚拟设备的 poll() 函数固定指向 process_backlog() 函数。这个函数将 sk_buff 从 input_pkt_queue 移动到 process_queue 中,调用 __netif_receive_skb() 函数将其投递给协议栈,最后协议栈相关代码会根据协议类型调用相应的接口进行后续的处理。特别地,这里的 enqueue_to_backlog() 以及 process_backlog() 函数也用于和启用了 RPS 机制后的相关逻辑。

      在非NAPI(新API)模式下,每个网络包的到达将触发一个中断过程,从而降低整个处理能力,而且已经过时。现在,大多数NICs都支持NAMI模式。NAMI模式在第一个软件包中触发NI中断。NAMI模式将在第一个软件包中触发NI中断,设备将被添加到询问队列中,以提高效率,在四舍五入过程中不会出现新的中断。为了支持NAPAI,每个CPU都维持一个称为软net_data的结构,并有一个所有审讯装置都放置的民意调查列表字段。在目前,中断的前一半是简单的,需要的是更新与NIC有关的存储信息,并将设备添加到民意调查队列中,触发一个软断裂 NET_RX_SOFTRQ。 进程第二半的破坏仍然在 Net_rx_ Action () 功能上调用设备驱动器提供的 POL 功能。由设备驱动的解答功能(而不是反内核流函数)在此端提供的解答功能上,由非NAPI_pt_promax orple ma mapal orpal_pal_prepal_f 该功能提供非NApal_pal_pal_pal_pal_pal_f) rocrepal_pal_pal_pal_pal_bxm_pal_pal_pal_pal_pal_pal_pal_pal_pal_pal_f) 函数提供的。

      以下是非国家适应计划和非国家适应计划模式(灰色背景由设备驱动,而灰色背景则由内核驱动)下的进程比较:

      image.png

      关于NAPAI模式网络装置驱动的实现和详细的NAPAI模式处理过程,本文提供了一篇文章及其译文作为参考[3](详细建议)。 文章详细描述了INTEL Ethernet Covernor I350的接收和处理细节、NIC装置(其姐姐的包装过程和翻译[4])。 包包还涵盖多网卡(可在/proc/net/bonding/bond0中查看)、网络Quee(sudo lspci-vv,其MI-X:Endable+ Count=10,由NIC支持,可在/proc/interrupts中查看)和其他。 这些文本不再重复,任何感兴趣的信息可在[5]中找到。

      网络一揽子程序程序由两个内核进行。

      如前所述,NIC从网络包中得到了一个 ssk_buff 结构, 最终由 netif_ receive_skb () 发送到内核协议解析进程。 此函数从 RPS [5] 相关进程开始, 数据包继续围绕队列旋转( 通常, RSS 网卡不需要在 RPS 上切换) 。

      最后,该软件包将在下一步由 _netif_ receive_skb_core () 处理。 此处理功能的主要功能是:

      • 处理ptype_all 上所有的 packet_type->func(),典型场景是 tcpdump 等工具的抓包回调(paket_type.type 为 ETH_P_ALL,libcap 使用 AF_PACKET Address Family)
      • 处理 VLAN(Virtual Local Area Network,虚拟局域网)报文 vlan_do_receive() 以及处理网桥的相关逻辑(skb->dev->rx_handler() 指向了 br_handle_frame())
      • 处理 ptype_base上所有的 packet_type->func() , 将数据包传递给上层协议层处理,例如指向 IP 层的回调 ip_rcv() 函数

      迄今为止,数据集仍在数据链层的处理过程中。

      image.png

      网络分层模型的后一级是第一个层的数据组成部分,即有效载荷(Payload)。

      image.png

      _netif_ receive_skb_core () 的处理逻辑要求注意对桥梁的处理以及随后的 IP 层和 TCP/UDP 层的处理。 首先, 查看 IP 层, _ netif_ receive_skb_ core () 调用 Felement_skb (), 调用 presponal. func () 接口。 对于 IP 协议, 此功能指的是 ip_ rcv () 功能。 在做一些统计和检查后, 软件包被转移到 Netfilter [7], 功能 ib_rcv_ finish () 被指定用于后续处理( 如果软件包不被 Netfilter 丢弃的话)。 在处理路由子子系统后, 如果软件包属于主机, i_ loclocal_ deliver () 会被调用到高级协议 。 此功能与先前的逻辑相似, 仍被提交 Netfilter 框架, 并指定用于后续处理, ip_ liver_ deliver_ fine_ finish () 的函数,, 以便最终检查和选择相应的高级协议界面。

      典型的高级协议程序,如TCP或UDP等,不属于本条的范围,只有TCP程序比整个纸张需要更多空间,这为TCP协议提供了输入功能(v4) tcp_v4_rcv () 和UDP协议 udp_rcv () 作为自我研究指南的输入功能,还可阅读更多信息[9]。

      NET(网络地址转换)和网过滤器/表格

      必须强调网络过滤器框架,因为网络战略和下文概述的许多服务将利用网络过滤器机制提供。

      网络过滤器是内核包过滤框架的成就。 简而言之,大量钩子点被纳入了协议柜台各级的组合处理功能,以便能够在这些点登记回声功能。

      image.png

      点击参考页[8]查看巨大的地图(可修改的Svg矢量地图,以说明百分比继续上升)。

      Linux上最常见的防火墙是基于 Netfilter (目录是新一代防火墙) 的最常用的防火墙。 防火墙是根据表格和链子的概念来组织规则的。 请注意, 这不会被“ 防火墙” 一词所误导, 防火墙不仅可以过滤软件包( Filterable), 还可以支持软件包的网络地址转换( NTable) 和对字段的修改( Manglebable)。 最常用的网络虚拟化是 NT 地址转换功能。 在网关设备或负载平衡设备方面, 此类功能十分常见。 当 NC 需要内部的网络虚拟化时, 它也是一个相似的网关和负载平衡装置 。

      在设置 iptables 的 NAT 规则前,还需要打开内核的包转发功能 echo "1" > /proc/sys/net/ipv4/ip_forward 才可以。另外建议也打开 echo "1" /proc/sys/net/bridge/bridge-nf-call-iptables 开关(可能需要 modprobe br_netfilter)。bridge-nf-call-iptables 从上面的源码分析就能理解,网桥的转发处理是在 Netfilter 规则之前的。所以默认情况下二层网桥的转发是不会受到三层 iptables 的限制的,但是很多虚拟化网络的实现需要 Netfilter 规则生效,所以内核也支持了让网桥的转发逻辑也调用一下 Netfilter 的规则。这个特性默认情况不开启,所以需要检查开关。至于具体的 iptables 命令,可以参考这篇文章和其译文[10]进行了解,本文不再讨论。

      在此强调, Netfilter的逻辑功能在内部核软件中受到了干扰。 如果Netfilter增加了许多规则,它肯定会导致某些CPU成本。 当下文讨论虚拟化网络的低效性能时,它占成本的很大一部分。

      二 虚拟网络设备

      根据传统的网络概念,网络由一组国家信息通报组成,一个或多个国家信息通报采用硬件媒介和交换器(交换)、路由器(路线)(图象来自[11]),其内容如下:

      image.png

      作为SDN(软件定义网络、软件定义网络)的实现之一,网络的虚拟化是VNIC(虚拟网络卡)、vSwitch(虚拟开关)和vRouter(虚拟路由器)等设备的虚拟化,同时附有数据包流程规则,其外部界面也必然符合其物理网络协议规范,如以太网和TCP/IP小组。

      image.png

      随着Linux网络虚拟化技术的发展,虚拟机器和虚拟容器网络广泛使用各种虚拟网络装置,例如Tap/Tun/Veth、Bridge等。

      • Tap/Tun是Linux内核安装的一对虚拟网络装置,在二楼/三楼运作。 Linux内核在Tap/Tun设备与用户空间之间交换数据,以捆绑设备。 虚拟 vNIC功能可以使用Tap驱动器完成,而Tun设备可执行另外几个继电器。
      • 织物装置总是配对成型,当一个装置从内核接收数据时,它会将其发送到另一个装置,因此,Veth Pair可被视为一对通过网络连接的VNIC装置。
      • 桥是二级运行的虚拟桥。 它是一个名为桥的虚拟设备, 但它的设计与 vSwitch 相似。 当桥与 Veth 设备结合使用时, 维特 设备的一端可以被连接到桥上, 这类似于NIC 连接到总机的真实环境 。

      虚拟机器和集装箱的传输程序略有不同,例如,虚拟机器和集装箱的传输程序与虚拟机器和集装箱的传输程序略有不同,前者一般通过Tap装置将VNIC与东道方的桥桥连接起来,集装箱的桥梁网络模式是将Veth Pair与桥梁连接起来,在不同的命名空间进行通信(下文详述其他技术)。

      与桥梁或NT模式相结合,Linux桥可以很容易地与主机或转机主虚拟机器/容器连接,而Bridge本身可以设置VLAN,允许某些三层开关。 然而,许多制造商正在创建一个功能更灵巧的虚拟交换台,其流行点为Cisco Nexus 100V,VMware虚拟开关,以及广泛使用的开放源(Open vSwitch ) [12]。

      image.png

      前边1 Linux 桥+ Veth Pair

      VRF(虚拟路途和前进,虚拟路由,虚拟路由,前进)是一个非常常见的术语。 从1990年代开始,许多二楼开关创建了一个4K VLAN广播场4K是因为VLAN标签的格式符合802.1q标准,该标准将VLANID定义为12位数(802.1q)中(802.2q)1q可以做4094*4094、0和4095个保留。 VRF概念现在分为三个层次,每个物理装置上有一些虚拟路由器/传输器的例子。 Linux的VRF实现了三层网络协议仓库的虚拟化,而网络名称空间(以下称为蚊帐)将整个网络仓库虚拟化。Anetn的网络仓库包括网络接口、 Loopback设备、Routing Table 和iptables 规则。本文本使用网络来演示(毕竟是讨论容器)和ip [14] 指令来创建和管理蚊帐和Veth Pair装置。

      创建、检查和删除网络命名空间

      图显示执行成果(如不执行,则删除):

      image.png

      如果您好奇的话, 您可以使用 Strace 命令观察 IP 命令是如何生成的( starce ip netns 加上 qianyi- test-1 ) 。

      在网里,执行命令。

      执行结果如下:

      图片

      这个新建的蚊帐状况非常糟糕,只有一张卡片或一个下层状态。要打开它,请采取以下行动:

      打开低带宽网络卡 这很重要

      ip netns exec qianyi-test-1 ip link set dev lo up
      ip netns exec qianyi-test-2 ip link set dev lo up

      image.png

      状态已更改为 UNKOWN, 这是正常的 。 此状态有电, 但 Lo 驱动器没有执行此动作 。

      制作一个对黄蜂设备。

      要查看以下信息,请使用 ip addr 命令:

      image.png

      8-9, 10-11是上述两套未分配IP地址且目前处于下层状态的Veth Pair装置。

      包括你的网里有蔬菜对子的装置

      在此点, 我们用两个网格运行 ip addr 命令, 以验证设备是否存在, 以及路线表( route 或 ip 路由命令) 是默认确定的 :

      image.png

      外壳的操作和查看设备必须基于 ip net exec.. 以某种方式,如果有许多命令, 您可以用 bah 替换执行的命令, 这样您就可以轻松运行此外壳中的网 。

      Veth Pair现在通过Veth-1-a/Veth-1-b与qianyi测试-1和qianyi测试-2网连接,这两个网可以通过这两个IP地址进行通信。

      image.png

      101号,平也抢了包,结果如下:

      image.png

      显然,Eth-1-a () 首次使用ARP(地址回应议定书、地址分割议定书)询问MAC地址。 作为回应,ICCMP(因特网控制服务议定书、因特网报告控制协议)请求和答复,这是在按键中使用的相同的协议。

      也可以使用 arp 命令查看 ARP 解析的缓存信息 :

      image.png

      目前,网络连接模式如下:

      image.png

      这种连接模式类似于将两个设备与NIC连接到网络线路上,然后将IP与网络的同一区域连接起来,并互相互动。 如果必须连接不止一个设备, 那么如何? 实际上, 需要一个网络开关 。 还记得我之前对 Linux 桥所说的话吗? 接下来, 您正在使用 Bridge 建立一个网络 。

      在进行以下测试之前,先运行Veth-1-a/Veth-1-b,将Veth-pair从qianyi测试-1和qianyi测试-2转到主机网网,以恢复起始环境。

      建一座Linux桥 建立网络

      执行后, 您可以看到生成的桥和配置的 IP, 而 brctl 显示命令的输出实际上更容易理解, 因为很明显, Veth-1-b 和 Veth-2-b 连接到桥的界面。 当 Veth Pair 的一端连接到桥上时, 它会从“ 网卡” 改为“ 切头 ” 。

      image.png

      目前模式抓取的结果是一样的,但网络连接是:

      image.png

      如果以同样的方式创建了更多的网络命名空间和对立方英尺, 它们可以在此模式下水平扩展 。

      然而,由于在访问主机网络方面没有网络规则,从 qianyi-stest-1 点火不起作用:

      image.png

      在以上照片中, 有一个 docker0 桥。 当 Docker 安装在系统上时, 桥将自动为 Docker 设置 。 您可能已经看到名为 docker0 的桥真的有一个IP 地址 。 实际上, 桥上没有 IP, 但 Linux 桥是一个可以建起的虚拟设备 。 当 Bridge 设置 IP 时, 它可能会被设置为进入这个内部网络( Gateway)的网关, 并且通过匹配路线规则, 也可以被设置为这个内部网络( Gateway) 的网关 。

      着手为 br0 桥建立地址,并将其指定为 Veth-1-a 和 Veth-2-a 默认网关地址:

      然后可以成功访问主机地址 。 (主机 IP 链接设置 br0 上的路径表会自动生成) :

      image.png

      网络模式在这方面走得更远:

      image.png

      如何在此点连接另一个网络桥和另一个主机上的一些网点? 最好在主机的两侧都有一个通往目的地的路径 。 如果另一个主机的IP 地址是 / 24, 那么必须在当前机器中添加一条规则 / 24 和规则 / 24 和规则 / 24 。 这是一个 N* N 规则。 这是一个简单易行模式的集装箱通信程序 。 这是很复杂 。 这是一个简单易行模式的集装箱通信程序 。 缺陷也是显而易见的, 需要调整主机的底端网络, 并且更难与底端网络脱钩 。 所以如果您可以在横跨所有主机的物理网络上建立一个虚拟网络桥, 并将相关网络中的所有设备连接起来, 您可以解除这些连接。 这是 Overlay 网络程序, 将在下文中解释 。 open vSwitch) 是相似的, 并且不会在此复制 ; 但是, 如果感兴趣, 材料可以自由检查和测试 。

      VXLAN是一个重叠网络程序。

      VXLAN(虚拟电子超强局局域网,虚拟可扩展局域网,RFC 7348 [16],VLAN的扩展协议是IETF(其他代表也是NVGREE,STT)定义的NVO3(图层虚拟化网络)标准技术之一。但VXLAN和VLAN正在试图解决各种问题。 VXLAN本质上是一种隧道封装技术,将数据链层(L2)的Ethernet框架封入UDP数据公报(Datagrams)的传输层(L4),然后将其传送到网络层(L3)。 数据链层(L2)的Ether框架(L2)等效应在广播区传播,即它跨越网络的三个层,但无法感觉到存在三个层。 因为VXLAN和VLAN是以UDP信封为基础的,所以只要IP网络可以建造一个巨大的虚拟二级网络。 而且由于这是一个高层次的协议,再次密封,其性能比传统网络低约20-30%。

      以下是两个最重要的VXLAN概念的快速衰落:

      • VTEP(VXLAN隧道端点,VXLAN隧道港)负责封装和砍掉VXLAN报纸的头章,该报纸隐藏了上层的链框传输信息。
      • VNI(VXLAN网络识别器,VXLAN网络识别器)无法直接在属于不同VNI的虚拟网络之间进行通信。

      图[17] 说明VXLAN显示格式:

      image.png

      但是,为了稳定和其他功能,请尝试使用 Kernel v3.Ten.0 和新版本。接下来,我们使用并建造了这两个工作站的VXLAN测试网络。

      如下图所示,这一系列延长的订单和先前行动与网络环境的建设完全一致:

      image.png

      在这种环境下,它工作,工作,工作,但交流显然是不可能的。

      然后使用四个网环境配置VXLAN环境:

      在 brcl 显示 br0 命令下, 连接了两个 VXLAN 设备 :

      image.png

      这样你就能从上面接线了

      image.png

      这就像袋子顶部的两层链接:

      image.png

      以与第二层相同的方式访问 rp 缓存 :

      image.png

      应使用 arp-d 来删除此缓存项, 回收并存储主机上的文件, 然后用 WireShark 打开它( 因为默认端口 VXLAN 以前没有配置过, 而 WireShark 也有必要将所记录的 UDP 解析为 VXLAN 协议 ):

      image.png

      现时的网络结构如下图所示:

      image.png

      因此,问题是,在这种情况下,是否可以使用 UDP 协议来提供可靠的通信? 当然, 可靠性不是一个概念, 但必须看一看内层的捆绑协议。 整个通信概念也不复杂。 每台计算机都包含 VTEP (VXLAN 隧道端点、 VXLAN 隧道端点) 设备, 以收听9527 号港口提供的 UDP 数据包。 因此, VETTP 接收数据包后, 通过 Bridge 解开选中的设备 。 因此, VETTP 接收数据包时, 这个虚拟设备如何知道VETTP 设备将发送到像这个传输计算机那样的机器上, 包括 VTEP (VXLAN 隧道端点、 VXLAN 隧道端点) 设备。 整个通信概念也不复杂 。 每个计算机都包含 VTEP 设备, 接收数据包后, 通过 Bridge 来解析取选定的设备。 因此, VTP 虚拟设备如何知道VTP 设备将发送到这样的机器上? 它是一个虚拟二级网络, 在底端网络上还不知道的 VDB 服务器上, 运行的F- drib 的FDODB 。

      上述简单实验是两台机器,它们通过命令直接指定对方的 VTEP 地址,并在fdb 表格找不到信息时将它们发送到对方,这是最简单的连接方式。 在大的 VXLAN 网络下,需要考虑如何在网络中找到其他 VETP 地址。 通常有两种方法解决这个问题: 使用 IGMP 、 Internet Group Management 协议, 节点是一个虚拟的整体, 并且如果软件包发送给谁并不明确, 则该软件包会被播放给整个组( 例如, 在上述实验中创建 VETH 设备的命令被更改为群/ 多功能地址, 远程关键词被更改为群, 更具体地看其他信息 ) 。 FDB 信息是通过外部分布式控制中心收集的, 并分发给同一 VXLAN 网络的所有节点 。 组合/ 由低层次的网络和大型性能问题支持, 例如许多不一定允许它发送的云网络。 因此, 在 K8s 网络的讨论中和研究中, 许多网络的后一种类似的方式被安装到后面的插件 。

      当然, 重叠网络程序比 VXLAN 还要多, 但这就是现在有多少主流应用程序。 重叠模型的其余部分似乎是一个纠结, 但它全部是关于L2对L4, L2对L3, L3对L3, L3对L3对L3,等等, 理解基本内容并非大困难。 网络虚拟化的装置和技术也很多 [18] 。

      三K8网络虚拟化

      一万八的网络模型

      因为每个波德都有自己的IP地址,所以没有必要在它们之间建立连接,而集装箱港和主机港之间的绘图也极少。 这导致了一个清洁的、与后向兼容的模式,在分配、命名、服务发现、负载平衡、应用设置和迁移方面,波德可被视为虚拟或物理主机。

      为了对所有网络设施实施Kubernetes,必须满足以下基本先决条件(除非有特定的网络部分战略):

      • 节点上的 Pods 不得在其他节点上或通过NT与 Pods 通信。
      • 节点上的代理(例如系统守护进程和立方体)可以与节点上的所有 Pods 进行通信。

      注:这仅适用于使在主机网络(如Linux)运行的波德人能够运作的平台:

      • 在节点主机网络上运作的波德人无法通过NT与波德人互动,所有节点也无法通过NT与波德人沟通。

      这种方法不仅简单,而且符合Kubernetes原初的目的,即廉价地从虚拟机器移动到容器,如果您的工作从虚拟机器开始,那么您的虚拟机器有一个IP地址,使您能够与其他虚拟机器连接,这基本上是相同的模型概念方法,不仅简单,而且也符合Kubernetes原初目的,即廉价地从虚拟机器移动到容器,如果您的工作从虚拟机器开始,您的虚拟机器有一个IP地址,使您能够与其他虚拟机器通信,而虚拟机器基本上是相同的模型。

      Kubernetes IP 地址存在于 Pod - 容器共享网络命名空间, 包括IP 和 MAC 地址。 这意味着波德集装箱可以通过本地主机到达港口。 这还意味着波德集装箱必须在协调的港口使用, 尽管这似乎与虚拟机器的流程不同, 虚拟机器被称为“ Pod One IP ” 模型 。

      这些术语取自正式的K8s文件[19],该文件基本上是一个Pod独立IP地址,所有Pod都可以在不需要NT的情况下进行互动。这个模式将Pod网络环境等同于VM网络环境。

      K8s 主网络插件实施 2 的原因

      K8s 中的网络由插件完成, 有两种网络插件 :

      • CNI 插件: 符合 CNI (集装箱网络接口) 的规格, 该规格意在兼容 。
      • 使用来自Kubenet 的 Bridge 和主机本地 CNI 插件的简单 cbr0 插件

      image.png

      图片来自 [20] 。 这里仅提及 CNI 接口插件 。 K8 网络主插件有这些 [21], 本文从数千项中选择 Github 恒星 :

      • Flannel: https://github.com/flannel-io/flannel
      • Calico: https://github.com/projectcalico/calico
      • Cilium: GitHub - cilium/cilium: eBPF-based Networking, Security, and Observability

      Flannel

      CNI是COREOS提出的标准,我们将首先研究COREOS自己的Flannel项目的结构。 Flannel将使用Kubernetes API/Etcd存储的网络段相关数据,对每个主机进行代用程序,名为Flanneld。 Flannel项目本身是一个真正为我们提供集装箱网络能力的框架,将在Flannel的后端实施。

      目前的Flannel 包括许多后端: VXLAN、 host-gw、 UDP、Ali Clouds和其他大工厂支持的后端(云生成者都是实验性支持),以及对各种隧道通信的实验性支持,如IPIP、 IPSec。 如正式文件所述,优先使用VXLAN模式,由主-gw向希望提高其性能的有经验的用户推荐(云环境一般为n)

      下文将对这些模型中的每一种模型作更多的审查。

      1)VXLAN

      使用 Linux 内核VXLAN 封装数据包的方法和理由已在上文详述。 1 VETH 装置。登记和更新新的VETH 设备关系的工作取决于是否有Flanneld 程序。 因此,似乎没有什么比这更多的了, 每一个新的 K8s 节点都会为这个 DeamonSet 模式建立一个 dmon 。

      2)host-gw

      从定义上看,主机gw 正在利用主机主机作为处理软件包流程的网关网关。 以上已表明了这一办法,节点的变化以及路线表的增删也由Flanneld完成。 这个方案的优缺点是显而易见的。 这个方案的优点和缺点是自然的性能,即实际直接传输(总体比主机级通信低10%,但从VXLAN开始为20%,甚至30%)。同样明显的是,这个办法需要主机之间的双层连接,以及基础设施的所有权(图表编辑),在云层服务环境中通常更难实现,从而导致图表的大小增加。这是更简单的办法。它已不再是绘制图。

      3)UDP

      每个主机的Flannel 进程将创建默认名称 Flannel 的 Tun 设备。 Tun 设备的功能非常简单, 用于在内核心应用程序和用户应用程序之间传输 IP 软件包。 当内核向 Tun 设备发送 IP 软件包时, 软件包将给创建该设备的应用程序。 程序会向 Tun 设备发送 IP 软件包, 这样 IP 软件包将显示在主机的网络机库中, 下一个跳跃将按路线列表处理 。 在由 Flannel 管理的集装箱网络中, 东道机机上的所有容器都属于指定给主机的“ 子网 ” 。 这个网络的范围信息将存储在主机 IP 地址的 Etcd 中。 Flanneld 程序将监控主机的 UDP 8285 端口, 并且通过将 IP IP IP IP 包包到目标主机主机主机主机。 这个模型不起作用。 区别在于什么? 这个软件是模拟在应用程序层( 与 VET 设备相似?) 中模拟的覆盖网络网络, 但是VXLAN 进入了一个更大的用户入口, 程序得到了更大的操作的支持。

      image.png

      Calico

      Calico是一个令人感兴趣的概念,它建立在完全将主机用作路由器的概念之上,不需要隧道或NT传输,将所有两层或三层交通变成三层交通,并通过主机的路线配置完成包件传输。

      Calico与所提到的Flannel主机-gw模式有什么区别? 首先, Calico不使用桥梁,而是根据路线规则在多个 vNICs之间传输数据。它也不使用Etcd存储和通知更新信息,而是直接与BGP(边境网关协议、边境网关协议)交换路线数据,就像现实世界那样。如果你感兴趣,请参看更多细节。返回Calico时,仍然有一个在主机上呼叫Felix的守护者,还有一个名为BIRD的 BGP客户端。

      如前所述, Flannel 主机- gw 模式需要主机的二级可互操作( 在一个子网中), 在 Calico 中仍然有必要。 但是, Calico 提供了非子网环境的 IPIP 模式。 当该模式生效时, 将会在主机上安装 Tun 设备, 在 IP 隧道中进行互动 。 当然, 有了这个模式, 该软件包是 L3 over L3 over L3 的重叠网络模式 。

      完整的线路表的通信方式同样缺乏其他组成部分,而实施伙伴的线路安排只能通过内核线路模块的流动来遵守传输规则,IPIP的示意图极为相似,不再绘制。

      Cilium

      eBPF-based Networking, Security, and Observability

      光从这个介绍上就看出来 Cilium 散发出的那种与众不同的气息。这个项目目前的 Github Star 数字快过万了,直接力压前面两位。Cilium 部署后会在宿主机上创建一个名为 cilium-agent 的守护进程,这个进程的作用就是维护和部署 eBPF 脚本来实现所有的流量转发、过滤、诊断的事情(都不依赖 Netfilter 机制,kenel > v4.19 版本)。从原理图的角度画出来的架构图很简单(配图来自 github 主页):

      image.png

      除了提供基本的网络连接、隔离和服务渗透外,Cilium还依靠eBPF来提高主机网络的观测和调试能力,这也是本文涉及的一个非常重要的问题。

      隔离3 K8 3 K8在护理服务

      网络插件的流程和认识在上文中讨论,这最终可能导致一个具有两/三级连接的虚拟网络。 默认情况下,波德之间的任何网络接入都是不受控制的,但内部网络经常需要各种访问控制(防火墙 ) 。

      K8 抽象了名为 网络政策 的方法, 以使此功能能够响应此需求。 网络战略由一个网络插件完成, 它需要使用网络解决方案来支持网络政策 。 您为什么说执行方法吸引了名为网络政策 的方法, 以响应此需求 。 网络战略由一个网络插件实现, 它需要使用网络解决方案来支持网络政策 。 您为什么这样说? 它们不是所有网络插件, 如 Flannel, 都实施网络政策机制 。 关于网络政策的核心原则, 使用ipables 配置网络过滤器规则过滤软件包是自然的。 网络政策设置技术和imptables/Netfilter 的逻辑特性不属于此篇文章的范围 。 更多信息请参见 。

      4K8s 收到集装箱服务

      K8s 集群内的所有容器/处理程序都可以通过网络插件相互连接。 但是,作为服务供应商是不够的,因为在许多情况下,服务用户将不在同一 K8s 集群内。 因此,有必要采用A 方法将服务引入该集群内。 K8s 利用服务来抽象地实现这一能力。在 K8s 中,服务是一个非常重要的对象,即使在 K8s 内部访问时,它也是一种非常重要的目标。

      当服务成立时, K8s 将指派给它一个 Croup IP 地址。 这个地址本质上是一个VIP 地址, 没有真正的互联网对象 。 此 IP 将只存在于 ipable 规则中, 根据该规则, VPort 访问点的随机模式规则, 将iPort 访问点用于一个或一个以上真实的pod 地址( DNATs), 这是服务的核心工作基础 。 Kube- proxy 监视 Pod 的更改, 并负责在主机上设置这些 NAT 规则 。 在这个模式中, kube- proxy 不转发流量; 相反, kube- proxy 仅管理管道 。

      K8s 官方文件对由 kube- proxy [26] 支持的各种模型和原理提供了更好的描述。 早期的用户空间模型基本上被废弃, 上面描述的ibable 随机规则没有被推荐大规模使用( 想想原因 ) 。 IPVS 模型现在是最推荐的, 比前两个大尺寸的版本更好。 如果 IPVS 是一个陌生的单词, LVS 的单词可能为我们熟悉。 在这个模式中, kube- proxy 创建了一个虚拟网络卡, 名为 kube- ipvs0 给主机, 并指派服务处的要人作为IP地址 。 最后, kube- proxy 设置了使用 IPVS 模块( ibsadm 命令可以查看 ) 的此地址的 POD 后端端点 。 事实上, IPVS 在内核中执行 IPVS 也使用 Netfilter 的 NAT 机制 。 区别在于 IPVS 没有为每个地址设定 NT 规则, 而是将这些规则的处理方式放到内核状态,, 而是将这些规则的处理方式置于内核状态, 。

      所指明的只是解决负载平衡问题,更不用说服务渗透问题。 K8s 服务的形式有:NodePort、loadBalancer-type Service(与ClaudeProvider联系,以便在公共云上为您建立一个负载平衡服务)和外部Name (kube-dns 添加CNAM)。对于第二种类型,即Intrace Service,这个服务,也可以用来消除服务[27]。

      image.png

      本文这一节不再完整,旨在限制NT入口的不是NT就是NAT,为了了解进一步情况,本文提供了非常坚实的Kube-proxy原则声明[30]。

      四 总结

      虽然该条力求澄清重要的知识节点,但可能有疏漏,甚至疏漏,受作者自身精力和认知限制的限制。

      参考文献

      1、TCP Implementation in Linux: A Brief Tutorial, Helali Bhuiyan, Mark McGinley, Tao Li, Malathi Veeraraghavan, University of Virginia: [PDF] TCP Implementation in Linux : A Brief Tutorial | Semantic Scholar
      2、NAPI, linuxfoundation, networking:napi [Wiki]
      3,监测和翻转Linux网络堆放:接收数据,Joe Damato,翻译:Linux网络锁定和检索:接收数据(2016年):[翻译]Linux网络定位和检索:接收数据(2016年):[翻译] Linux网络定位和检索:接收数据(2016年):[翻译] Linux网络定位和检索:接收数据(2016年):[翻译] Linux网络定位和检索:接收数据(2016年):[翻译] Linux网络定位和检索:接收数据(2016年):[翻译] Linux网络连接监测和检索:接收:
      4; 监测和翻转Linux网络堆放:发送数据,Joe Damato,翻译:Linux网络lodge监测和奖励:发送数据(2017年):[翻译]Linux网络lodge监测和奖励:发送数据(2017年)。
      5、Scaling in the Linux Networking Stack, https://github.com/torvalds/linux/blob/master/Documentation/networking/scaling.rst
      6、Understanding TCP internals step by step for Software Engineers and System Designers, Kousik Nath
      7、Netfilter, https://www.netfilter.org/
      8、Netfilter-packet-flow, https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg
      9、Analysis TCP in Linux, https://github.com/fzyz999/Analysis_TCP_in_Linux
      NAT - 网络地址运输,翻译:NAT - 网络地址转换(1986年):[翻译] NAT - 网络地址转换(2016年)
      11、Virtual networking in Linux, By M. Jones, IBM Developer: Virtual networking in Linux – IBM Developer
      12、Open vSwitch, Open vSwitch
      13、Linux Namespace, namespaces(7) - Linux manual page
      14、ip, ip(8) - Linux manual page
      15、Veth, veth(4) - Linux manual page
      16、VxLAN, https://en.wikipedia.org/wiki/Virtual_Extensible_LAN
      17、QinQ vs VLAN vs VXLAN, John, https://community.fs.com/blog/qinq-vs-vlan-vs-vxlan.htm
      18、Introduction to Linux interfaces for virtual networking, Hangbin Liu: Introduction to Linux interfaces for virtual networking | Red Hat Developer
      Kubernetes集群网络系统,英文地址19,集群网网更新
      20、THE CONTAINER NETWORKING LANDSCAPE: CNI FROM COREOS AND CNM FROM DOCKER, Lee Calcote: The Container Networking Landscape: CNI from CoreOS and CNM from Docker – The New Stack
      21、CNI - the Container Network Interface, https://github.com/containernetworking/cni
      22. 与eBPF建立Kubernetes服务管理系统,[翻译]利用eBPF处理大型K8服务(LPC,2019年):Linux Plümbers 2019年会议(2019年10月9日至11日):利用eBPF编辑创建Kubernetes服务管理系统
      23、基于 BPF/XDP 实现 K8s Service 负载均衡 (LPC, 2020) Linux Plumbers Conference 2020 (24-28 August 2020): Kubernetes service load-balancing at scale with BPF & XDP · Indico

      24、A Deep Dive into Iptables and Netfilter Architecture, Justin Ellingwood: A Deep Dive into Iptables and Netfilter Architecture | DigitalOcean

      25、Iptables Tutorial 1.2.2, Oskar Andreasson: Iptables Tutorial 1.2.2

      26. 虚拟IPIP地址和服务协议,英文地址:Kubernetes服务

      Ingress Kubernetes 27,英文地址:Ingress Kubernetes

      28、NGINX Ingress Controller, F5 NGINX Ingress Controller - Production-Grade Kubernetes

      29,入侵 Contractors Kubernetes,英文地址:29 入侵 Contractors Kubernetes, 英文地址:29 入侵 Contractors Kubernetes

      30, cracking kubenetes 节点代理(aka kube- proxy),[翻译] 深入理解Kubernetes 网络模式: 自实现 kube- proxy 社区

      原文链接
      这种材料是独一无二的,未经许可不得复制。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/13975.html

          热门文章

          文章分类