简要介绍:本文需要熟悉以太网(以太网)和Linux系统的基本网络命令以及TCP/IP协议系列的基本原理,并了解传统网络模型和协议软件包的发行原理。当文章中涉及的Linux内核的具体实现时,内核v4.19.215版本将受到约束。
作者|Qianyi来源|阿里技术公共帐户
本文需要熟悉以太网(以太网)的基本原理和Linux系统的基本网络命令以及TCP/IP协议系列,并了解传统网络模型和协议软件包的发行原理。文章中涉及的Linux内核的实现,内核v4.19.215版本应受到约束。
1从网卡到内核协议堆栈
如图[1]所示,当网络软件包到达NC(网络计算机,本文指的是物理计算机)时,NIC(网络接口控制器,网络接口控制器,通常称为网络卡)设备处理设备处理,NIC Transmits在中断的方式向内核的消息。Linux内核的中断处理分为上半部分和下半部分。上半部分需要尽快处理与硬件相关的工作并返回。下半部分被上半部分激活,以处理时间累积的时间。
特定NIC的处理过程如下:当NIC接收到数据时,将在DMA模式下在Ring Buffer(接收队列)中的描述符号中复制到描述符方向的图形内存区域。您可以使用ethTool -g {设备名称,例如eth0}命令来查看rx/tx(接收/发送)queue.cpu识别跳转到NIC之后的中断功能的大小。NIC的工作模式应区分。在较早的非-NAPI(新API)[2]模式下,中断相关寄存器信息的上半部分,检查接收队列并将SK_Buff结构分配给接收到的数据,最后致电Netif_rx()提交SK_BUFFnetif_rx()函数的过程中的内核processing。在输入_pkt_queue队列中放置了该分配的sk_buff结构之后,将添加一个虚拟设备,将虚拟设备添加到poll_list旋转队列中,并触发软中断net_rx_softirq以激活下半部。时间,上半部分结束了。有关详细的处理过程,请参阅NetIf_rx() - > netif_rx_internal() - > enqueue_backlog()process。下半部net_rx_softirq软中断的相应处理功能是net_rx_action()。此函数调用由设备注册的PORL()函数。调用__netif_receive_skb()函数将其提交给协议stack..在尤其是eNqueue_to_backlog()和proces_backlog()函数也用于在RPS机制后启用并启用相关逻辑。
每个网络软件包在非NAPI(新API)模式下的到达将一次触发中断处理过程,从而降低整体处理能力。它已经过时了。大多数NIC现在支持NAPI模式。纳皮模式触发了第一个软件包中的NIC中断后,该设备将被添加到旋转队列中以进行旋转操作以提高效率。在旋转过程中不会生成新的中断。为了支持NAPI,每个CPU都保持一个称为SoftNet_data的结构,并且放置了所有旋转设备的Poll_list字段之一。这次,中断的上部非常简单。它只需要更新与NIC相关的寄存器信息,然后将设备添加到Poll_list旋转队列并触发软中断net_rx_softirq。下半部的处理仍然是net_rx_action(),以调用设备提供的poll()函数驱动器。此时,设备提供的旋转处理函数为(而不是内核函数process_backlog())。此设备驱动程序提供的poll()函数也将调用__netif_receive_skb()函数将SK_BUFF提交给协议堆栈处理。
非NAPI模式的过程和NAPI模式下的过程如下(灰色背景由设备驱动程序实现,其他驱动程序由内核本身实现):
关于NAPI模式网络设备驱动程序的实现以及详细的NAPI模式的处理过程,提供了一篇文章作为参考[3](强建议)。本文介绍了英特尔以太网控制器i350的包装和处理详细信息(其它的包装和处理详细信息)姐妹的数据包处理过程和翻译过程[4])。此外,此处的包装还涉及多网络卡的键合模式(您可以在/proc/proc/net/net/bonding/bond0中查看模式)和网络队列(sudo lspci -vvv查看以太网控制器的功能信息具有msi -x:enable+ count的计数。= 10个单词表示NIC支持,您可以检查/proc/proc/necrupts中的中断绑定情况)和其他机制。描述。如果您有兴趣,请参考相关信息[5]。
2内核协议堆栈网络包的处理过程
如前所述,NIC接收到网络包的SK_BUFF结构最终由__NETIF_RECEIVE_SKB()提交给内核协议堆栈。此功能首先由RPS [5]处理,数据包将继续在排队中循环循环。(通常不需要打开RSS网络卡的RPS)。如果您需要将软件包分配到其他CPU进行处理,则将使用eNqueue_to_backlog()提交给其他CPU队列,并触发IPI(Inter--处理器中断Process_backLog()),在处理器之间传输并在APIC总线上传输,并将其传输到APIC总线上,并且不通过IRQ将其传输到其他CPU,以发送通知(net_rps_send_ipi()函数)。
最后,数据包将通过__netif_receive_skb_core()处理。此处理功能的主要功能是:
截至目前,数据数据包仍在数据链路层的处理过程中。重新查看OSI七层模型和TCP/IP五层模型:
在网络分层模型中,后一层是上一层的数据部分,称为有效载荷。完整的TCP/IP应用程序层数据包的格式如下[6]:
__netif_reeive_skb_core()的处理逻辑需要注意Net Bridge的处理逻辑,下一个IP层和TCP/UDP layer.first查看IP层,__ NETIF_RECEIVE_SKB_CORE()调用the druvery_skb(),以及lastater the druvery_skb(),以及落后调用特定协议的.func()接口。对于IP协议,IP_RCV()函数在此处引入。此功能执行了一些统计信息和检查后,将软件包转换为NetFilter [7]框架并指定了函数IP_RCV_FINISH()用于后续处理(如果NetFilter未丢弃该软件包)。在检查路由子系统后,如果软件包属于该计算机,则将调用IP_LOCAL_DELIVER()将数据包转发到上层协议。此功能类似于先前的逻辑,该逻辑仍将其传递到NetFilter框架并指定函数IP_LOCAL_DELIVER_FINISH()以进行后续处理。此功能最终将检查并选择用于处理的相应上层协议接口。
常见的上层协议(例如TCP或UDP协议)不在本文讨论的范围之内。TCP进程的长度足以超过本文的所有内容。此处,TCP协议(V4)的输入函数TCP_V4_RCV()和UDP协议的udp_rcv()的intlet函数UDP_RCV()也可以读取其他信息以进一步理解[9]。
3 NetFilter/Iptables和NAT(网络地址转换)
关于NetFilter框架,有必要强调一点重点,因为稍后将要提及的网络策略和NetFilter提供了许多服务。
NetFilter是数据包过滤框架的实现。简而言之,该协议堆栈的包装处理功能内置了许多挂钩点,以支持这些点的注册回调功能。
图片来自Wikimedia,您可以打开参考[8]查看大图(SVG矢量图,您可以调整大型网页显示百分比以继续放大)。
Linux上最常用的防火墙Iptables是基于NetFilter(Nftables是新一代的防火墙)。Iptables根据表和链条的概念组织规则。注意“防火墙”一词在这里误导了。所有的iptables不仅可以过滤软件包(过滤表),还可以支持软件包的软件包和修改后的软件包(mangle Tabter)的字段。Essencein网络虚拟化,最常用的是NAT地址转换函数。通常在网关网络设备或负载平衡设备中常见。当NC需要在内部执行与网络相关的虚拟化时,它也是类似的网关和负载平衡设备。
在设置iPtables的NAT规则之前,您还需要打开内核回声“ 1”>/proc/proc/sys/net/ipv4/ip_forward.it.it也建议打开echo“ 1”/proc“ 1”/proc/sys/net/bridge/bridge nf-nf-call-ippables开关(可能需要modprobe br_netfilter).bridge-nf-call-ippables可以从上面的源代码分析中理解。桥梁的重新处理是在NetFilter规则之前进行的。因此,默认情况下,第二层网络桥梁的转发不会受到iptables的三层的限制,但是许多虚拟化网络的实现需要NetFilter规则才能生效,因此内核还支持网络桥的重新发布逻辑,还调用了NetFilter的规则。默认情况下未打开essencethis功能,因此请检查switch.s for特定iptables命令,您可以参考本文及其翻译[10]理解。本文将不会讨论。
在这里,NetFilter的逻辑是在核心软中断的背景下。如果NetFilter添加了很多规则,则不可避免地会导致某些CPU开销。当虚拟化网络的性能降低时,很大一部分费用是从这里得出。
在传统的网络认知中,网络是一组通信集,由一个或多个NIC组成,使用一个或多个NIC(交换机)和路由器(路由器)(图片中的图片),下面是相同的),:
网络虚拟化作为SDN(软件定义网络(软件定义网络))的实现无非是虚拟VNIC(虚拟网络卡),VSWITCH(虚拟开关),Vrouter(Virtual Router)和其他设备。还必须遵守其物理网络协议的标准,例如以太网和TCP/IP协议。
随着Linux网络虚拟化技术的发展,使用了几种虚拟网络设备,它已被广泛用于虚拟机和虚拟容器网络中。
在传输过程中,虚拟机和容器的网络不同。例如,前者(例如KVM)使用TAP设备连接虚拟机的VNIC和主机的网络桥梁。容器的桥梁网络模式是将不同名称空间的VETH对连接到网络桥实现沟通的桥梁(以下讨论的其他方法)。
Linux Bridge与桥梁或NAT模式合作可以轻松实现主机或交叉主机虚拟机/容器之间的通信,并且桥梁本身还支持VLAN配置,以实现大约三个层次开关的能力。虚拟开关具有更丰富的研发功能。它们在Cisco Nexus 1000V,VMware Virtual Switch中很受欢迎,并且使用了广泛使用的开源vswitch [12]。使用VSWITCH,您可以构建一个虚拟网络,该虚拟网络支持更多的包装协议,并且更高级:
1个Linux桥 + VETH对转发
VRF(虚拟路由和转发)是网络字段中的一个常见术语。在1990年代开始,许多两个层次交换机可以创建一个4K VLAN广播域。4K是因为VLAN标签的格式遵循802.1q标准,并且定义的VLAN ID为12 -bit(802.1q中的802.1q可以实现4094*4094、0和4095)。现在,介绍了VRF概念三层,并且可以在单个物理设备上提供多个虚拟路由/转发示例。Linux的VRF意识到了三个 - 莱默网络协议堆栈的虚拟,以及网络名称空间(以下称为Netns)虚拟网络堆栈。netns要演示(毕竟在讨论容器中),并且以下使用IP [14]命令来创建和管理Netn和Veth Pair Pair设备。
创建,查看,删除网络名称空间
执行结果如图所示(首先删除):
如果您有兴趣,则可以使用strace命令跟踪此创建过程,以查看如何创建IP命令(Strace IP Netns添加Qianyi-Test-)。
在网络中执行命令
执行结果如下:
图片
这个新创建的网络和洗涤一样贫穷,只有一张孤独的网卡,它是倒下的。让它在下面打开:
打开网卡,这非常重要
IP NETNS EXEC QIANYI-TEST-IP链接SET dev lo Up Netnec Qianyi-Test-2 IP链接SET DEV LO UP
状态变得不合理,这是正常的。该状态由驾驶员提供,但LO的驾驶员没有这样做。
创建VETH对设备
您可以使用IP Addr命令查看:
8-9,10-11是上面创建的2对VETH对设备。目前,他们还没有分配IP地址,也没有分配。
将VTTH对设备添加到网络
目前,我们在两个NETN中执行IP ADDR命令,并且可以看到设备已经存在,并且默认情况下还创建了路由表(路由或IP路由命令):
在这里,必须在IP NetnSec {...}的方法中执行操作和查看设备。如果有很多命令,您也可以用bash替换执行命令,该命令可以轻松地操作此外壳中的netn。
现在,通过Veth-A/Veth-1-B,Veth Pai将Qianyi-Test-1和Qianyi-Test-2连接。在这两个Netnsvisit之间。
ping时101的包裹的结果如下:
可以清楚地看出,ETH-A(10.0.0.101)首先通过ARP询问10.0.0.102 MAC地址(地址解析协议)。在获得响应后,您将使用ICMP(Internet Control Message Message Message Message协议,Internet消息控制协议)请求和答复,这也是Ping使用的协议。
也可以通过ARP命令查看ARP解析的缓存信息:
网络连接模式目前是这样的:
这种连接模式与将两个设备与NIC连接到现实中非常相似,然后可以连接相同的网络IP以相互通信。如果多个设备需要建立互连?需要开关等设备。您还记得新娘带有前面提到的Linux吗?接下来,使用桥梁机制来建立网络。
在进行以下测试之前,您需要制作Qianyi-Test-1和Qianyi-Test-2的Veth-A/Veth-1-B,Veth Pair,以移回主机以恢复初始环境。
创建Linux桥并配置网络
执行后,您可以查看创建的桥梁和配置的IP。实际上,BRCTL SHOW命令显示的结果更易于理解。Superorior。当Veth对的结尾连接到网络桥时,它将从“网卡”退化为“ Crystal Head”。
当前模式捕获的结果之间没有区别,但是网络连接模式不同:
根据此模式,如果有更多的网络名称空间和VETH对,则可以水平扩展相同的方式。
但是,从Qianyi-Test-1尝试主机自然没有连接,因为没有网络规则可以访问主机:
上面的屏幕截图中有一个Docker0网络桥。在计算机上安装了Docker后,该桥将自动设置为Docker使用。也许您注意到您注意到名为Docker0的网桥实际上具有IP地址。不是IP,但是可以设置Linux桥的虚拟设备。当桥设置IP时,您可以将其设置为此内部网络网关(网关),然后与路由规则合作以实现最简单的虚拟网络交叉-Machine通信(类似于现实中的三个层次开关)。
以下将继续为BR0网络桥创建一个地址,并在Veth-A和Veth-2-A上设置其默认网关地址:
目前,您可以成功访问主机地址(主机上的路由表是在IP链接SET SET BR0 UP的步骤中自动创建的):
网络模型已成为这种方式:
如果此时,另一个主机的另一个主机上还有一个网络桥和几个netn。仅将路由规则配置为双方目标主机的路由规则。确定另一个主机的IP地址为10.97.212.160,并且子网IS是10.0.1.0/24,然后您需要向当前机器添加10.0.1.0/24的规则,将1.97.212.160添加到10.97.212.16010.0.0.0.0.0.0.0.0.0.0.0.0.0.0.24 via 10.97.212.159规则足够(或足够(或足够)iptables配置snat/dnat规则)。如果有n?它将是n * n的规则,这将是复杂的。这是一个简单的底层模式容器通信解决方案。缺点也很明显。需要有权修改主机的基础网络,并且更难与基础网络解密更困难。netns设备,您可以决定是否不这样做。这是覆盖网络(封面网络)解决方案,将在下面解释。作为本节中其他虚拟网络设备的安装和配置(例如Open Vswitch),IT也相对相似。我不会在这里详细介绍。如果您有兴趣,可以查看文档并亲自测试。
2覆盖网络解决方案VXLAN
VXLAN(虚拟可扩展的局部网络,虚拟扩展LAN,RFC7348)[16],VLAN扩展协议,IETF定义的标准技术之一(第3层网络虚拟化)(其他代表性的NVGRE,STT)。Vlan想要解决的问题不同。VXLAN本质上是一种隧道包装技术。它将数据链路层(L2)的以太网帧封装到传输层(L4)的UDP数据报纸(数据报)中,然后在网络层(L3)传输中。效果就像数据的以太网框架一样链接层(l2)在无线电域中传输,即未感知三层网络的三层的存在。b.gat the是基于UDP包装,只要它是IP网络路由,它就可以建立一个巨大的虚拟第二层网络。这也是因为高级协议再次封装,并且性能将比传统网络低约20%至30%(性能数据将随着技术开发而变化,这仅代表当前级别)。
这是对VXLAN的两个重要概念的简要介绍:
VXLAN的消息格式如图[17]:
Linux内核v3.7.0版本开始支持VXLAN网络。但要进行稳定性和其他功能,请尝试选择内核v3.10.0和后续版本。BELOW我们使用的两台机器使用10.97.212.159和11.238.151.74来创建A测试VXLAN网络。
这一系列命令与以前的步骤完全相同,如下图所示的网络环境:
在这种环境中,10.0.0.101和10.0.0.102很常见,10.0.0.103和10.0.0.104也很常见,但显然是10.0.0.0.101/10.0.0.102和10.0.0.0.0.103/10.0.0.0.104是无关紧要的。
接下来,配置VXLAN环境以打开这四个NetN环境:
使用BRCTL SHOW BR0命令查看两个VXLAN设备已连接:
然后,您可以从10.0.0.101:10.0.0.103 ping:
在10.0.0.101上查看袋子,就像第二层的互操作性:
直接查看ARP缓存与互操作性的两层完全相同:
使用ARP -D 10.0.0.103删除此缓存项目,抓住软件包并将文件保存在主机上,然后使用Wireshark打开它以查看(因为以上不是VXLAN默认端口4789,您需要设置Wireshark捕获的UDP设置了您捕获的捕获的UDP,您可以捕获到VXLAN协议):
我们得到了预期的结果。此时的网络体系结构如图所示:
因此,问题出现了,这里的UDP协议可以实现可靠的通信吗?当然,可靠性不是考虑这一层的问题,而是需要考虑内层包裹的协议。完整的通信原理并不复杂。这两台机器有自己的VXLAN隧道端点,VXLAN隧道端点)设备,监视在端口9527上发送的UDP数据包。接收到数据包后,拆卸到通过桥梁传递的指定设备。因此,您如何知道将哪个VETP设备发送到发送给哪个VETP设备VETP虚拟设备的地址如10.0.0.3?这是一个虚拟的两个层网络,此地址不知道基础网络。Linux Bridge上的数据库条目,用于保留远程虚拟机/容器的MAC地址,远程VTEP的IP以及VNI.bridge FDB命令的映射关系以操作FDB表:
以上简单的实验是两台机器。这些命令用于直接指定彼此的VTEP地址。仅当找不到FDB表时,只有将其发送给另一方。这是最简单的互连模式。在大型VXLAN网络下,您需要考虑如何在网络中找到其他VETP地址。通常有两种解决此问题的方法:首先,使用传输/多范围(IGMP)(IGMP),Internet组管理协议)要形成一个虚拟整体。中国VETH设备的命令可以修改为广播/多路广播地址,例如224.1.1.1,并且必须更改远程关键字,请参阅组,请参阅获得其他信息);第二个是通过外部分布式控制中心收集FDB信息,以收集FDB信息。并分配给同一VXLAN网络的所有节点。广播/多路广播的支持受到基础网络和大型性能问题的限制。- 规模,例如许多云网络可能不允许这样做。因此,在讨论和研究K8S的网络方案时,您会看到许多网络插件实现使用后者类似-like的实现方法。
本节在此处介绍。当然,覆盖网络解决方案不仅是VXLAN的方式,而且许多主流解决方案目前都采用了此方法。其他覆盖模式看起来令人眼花azz乱。实际上,它不过是各种包装方法,例如L2超过L4,L3超过L3,L3等,并且在理解基本原理后,这也不是一件大事。也有许多设备和机制网络虚拟化[18]。它不能一天完成,但是在掌握了基本网络原则之后,它不过是各种协议软件包的发行。
1 K8S网络模型
每个POD都有其自己的IP地址,这意味着您无需在每个POD之间签署链接,并且几乎不需要处理容器端口之间的映射到主机端口。这将创建一个干净的,向后的兼容性模型。在此模型中,从端口分布,命名,服务发现,负载平衡,应用程序配置和迁移的角度,可以将POD视为虚拟机或物理主机。
Kubernetes对所有网络设施的实施都需要满足以下基本要求(除非有一些特定的网络分割策略):
备注:对于支持主机网络中POD的那些平台(例如:Linux):
该模型不仅不复杂,而且与Kubernetes的原始意图兼容,即从虚拟机到容器。如果您的工作开始在虚拟机中运行,则虚拟机具有IP,因此您可以并且可以进行。其他虚拟机通信,这基本上是相同的模型。
Kubernetes的IP地址在POD范围内 - 包含他们的网络命名空间 - 包括其IP地址和MAC地址。这意味着POD中的容器可以通过LocalHost到达各种端口。这也意味着Pod中的容器需要需要协调端口的使用,但这与虚拟机中的过程没有什么不同,该过程也称为“ POD和一个IP”模型。
这些段落是从K8的官方文件中引用的[19]。在简短摘要下,它是一个吊舱和一个独立的IP地址。所有POD都无法通过NAT通信。该模型处理类似于VM网络环境的POD的网络环境。
2 K8S主流网络插头 - 原理
K8中的网络通过插件实现。网络插头有两种类型:
图片来自[20],本文仅着眼于CNI接口插件-in。主流K8S网络插件具有这些[21]。在本文中,GitHub星数计算了一千多个项目:
绒布
CNI是CoreOS提出的规范,然后首先查看CoreOS自己的法兰绒项目的设计。Flannel将在每个主机上部署称为Flanneld的代理过程。与网络段相关的数据使用Kubernetes API/ETCD存储。法牌项目本身是一个真正为我们提供容器网络功能的框架,是法兰绒的后端。
当前的法牌具有以下后端实现:VXLAN,HOST-GW,UDP和Alibaba Cloud的后端和其他大型制造商(云制造商都是实验性支持),以及一些隧道通信,例如IPIP和IPSECECEXEXECEXECEXECEXECEXECEXECEXECEXECECEXEXTIMERIMEL支持。根据官方文档,首选VXLAN模式。建议使用经验丰富并希望进一步提高性能的用户(通常不可用的云环境,原因是较晚的)。UDP是法兰绒支持性能不佳的最早表现。该计划基本上已经被放弃了。
分析以下三种模式。
1)VXLAN
上面已经介绍了使用Linux内核VXLAN包装数据包的方法和原理。法兰诺尔创建了一个称为绒布的VETH设备。1。由于存在Flanneld过程的存在,注册和更新新的VETH设备之间关系的任务依赖于此过程。因此,似乎没有什么可说的,也就是说,每个新的K8S节点将创建Flanneld的后卫进程,DeamonSet模式。然后注册并更新新的VETH设备以变得非常自然,并且全局数据自然存储在ETCD中。此方法已绘制,无非是设备名称是不同的(VETH称为法兰纳尔。1,净桥称为CNI0)。
2)主机GW
顾名思义,主机GW将主机视为处理协议软件包流的网关网关。实际上,此方法也已被证明。至于节点的变化以及路由表的添加和删除,它们也是由弗内尔德(Flanneld)完成的。该方案的优势和缺点是显而易见的。最大的优势是自然的性能。真实和直接的转发(总体绩效比沟通水平低10%,VXLAN的启动20%,甚至30%)。缺点也很明显。此方法要求主机连接在二楼,并且还需要控制基础架构(编辑路由表)。这通常在云服务环境中很难实现。路由表的尺度也将增加。此方法在原则上相对简单,并且不会绘制图片。
3)UDP
每个主机上的Flanneld进程将创建一个默认情况下的TUN设备,名为Flannel0。TUN设备的功能非常简单,并且用于在内核和用户应用程序之间传递IP软件包。当内核将IP软件包发送到该内核后TUN设备,该软件包将被移交给设备的应用。该过程将IP软件包发送到TUN设备,然后该IP软件包将出现在主机的网络堆栈中,然后根据路由表处理下一个跳跃。通过UDP协议通过UDP协议进行的通信。我之前已经说过该模型,区别在哪里?该方案是模拟应用程序层的覆盖网络(例如实现用户模式的VETH设备吗?),d内核支持的VXLAN协议一旦进出用户态度(Flanneld Process Pack/ pack/拆卸软件包的过程),因此性能损失更大。
印花布
印花布是一个非常有趣的项目。基本思想是将主机完全视为路由器。它不使用隧道或NAT来实现转发。所有两层流量都转换为三层流量。
Calico和前面提到的绒布的主体GW模式有什么区别?首先,Calico不使用桥梁,而是通过路由规则在不同的VNIC之间重新张贴数据。此外,路由器未通过ETCD Storage和ETCD存储和通知,但使用BGP(边界网关协议,边界门协议),例如路由表数据交换的真实环境。BGP非常复杂,并且该协议有点艰巨(而且我不知道)。在本文中,您只需要知道该协议允许路由设备发送和学习对方的路由信息以丰富自己。如果您有兴趣检查其他信息以获取进一步的理解。回到印花布,则在主机上仍然有一个名为Felix的后卫进程和一个名为Bird的BGP客户端。
如上所述,法兰绒的主机GW模式需要主机的二楼进行通信(在子网上),该模式仍然在Calico上有此要求。但是Calico在没有子网环境的情况下为IPIP模型提供了支持。模式,主机将创建一个TUN设备与IP隧道进行通信。当然,使用此模式后,该袋是L3超过L3的覆盖网络模式,并且性能等同于VXLAN模式。
完整路由表的通信方法没有其他组件。在配置了IP路由转发规则后,它取决于内核路由模块的循环。IPIP的架构图也相似,并且不绘制。
纤毛
基于EBPF的网络,安全性和可观察性
从这次引言中,它显示了纤毛的不同气氛。该项目的当前GitHub星数大于10,000,它们直接向前两次施加压力。纤毛部署后,它将创建一个名为Cilium-agent on of Cilium-Encent on主人。该过程的作用是维护和部署EBPF脚本以实现所有交通转发,过滤和诊断(NetFilter机制没有,Kenel> v4.19版本)。从示意图的角度绘制的体系结构非常非常简单(带有GitHub主页的图片):
除了支持基本的网络连接,隔离和服务外,Cilium还依靠EBPF,因此它具有更好的观察和对主机网络的故障检查功能。此主题也很大,本文已关闭。书面文章。他可以了解更多有关22的信息。
3 k8s容器访问隔离
上面介绍了网络插头的机制和实施原理。最后,可以构建连接两个层级/三层连接的虚拟网络。默认情况下,POD之间的任何网络访问都是无限的,但是通常需要在内部网络中设置某些访问规则(防火墙)。
为了应对这一需求,K8S摘要一种称为NetworkPolicy的机制来支持此功能。网络策略是通过网络插件实现的。要使用网络策略,我们必须使用支持NetworkPolicy的网络解决方案。您是为什么这么说?因为并非所有网络插件都支持网络上的机制,例如法兰绒不支持它。自然使用iptables配置NetFilter规则以实现数据包的过滤。网络配置的原理和Iptables/NetFilter的原理详细信息不在本文的范围内。请参考其他信息以学习24。
4 k8s的集装箱服务揭示
在K8S群集中,借助网络插件 - 所有容器/流程都可以相互通信。相同的K8S群集。然后,机制需要一种机制来揭示该群集中的服务。K8S使用服务对象来完成此功能的抽象。服务是K8S中非常重要的对象。即使在K8S内访问它,通常也需要通过服务打包(首先,POD地址并不总是固定,并且总会有负载平衡的需求)。
总而言之,服务原理是:service = kube-proxy + iptables规则。创建服务时,K8S将为其分配一个集群IP地址。此地址实际上是VIP,并且没有真实的网络对象。此IP仅在iPtables规则中存在。对此VIP的访问:使用此VIP的随机模式规则:VPORT使用Iptables是最基本的服务原理。Kube-Proxy有什么操作?Kube-Proxy听到了什么?对于POD的更改,并负责在主机上生成这些NAT规则。在这种模式下,Kube-Proxy没有转发流量,而Kube-Proxy只是负责挖出管道的责任。
K8S官方文档介绍了Kube-Proxy [26]支持的各种模式和基本原则。不建议在大规模下使用上述iPtables随机规则(考虑到为什么)。现在,最推荐的IPVS模型比大规模性能中的前两个更好。如果IPV一词相对不熟悉,则该词LVS一词。在这种模式下,Kube-Proxy将在主机上创建一个名为Kube-ipvs0的虚拟网络卡,然后将服务VIP分配为其IP地址。本文,Kube-Proxy使用kernel ipvs模块来设置该模块此地址的后端POD地址(可以查看IPVSADM命令)。实际上,内核中IPV的实现还使用了NetFilter的NAT机制。区别在于IPV没有为每个地址设置NAT规则,但是,将这些规则处理到内核状态,确保iPtables规则的数量基本上是恒定的,并且最好解决以前的问题。
以上只是解决负载平衡问题,并且尚未提及服务。K8S服务的方式主要是nodeport,loadbarancer(CloudProvider在公共云上创建负载平衡服务)和Exrtnalname(在Kube-dns中添加CNAME。转发层)。从这个角度来看,猜猜如何获得入口?来看[28](当然,还有许多其他控制器[29]):
对于这一部分,本文将不会详细解释。它不过是Nat。如果您有更多的NAT,您可以找到一种融合NAT条目的方法。根据《公约》,此处提供了一篇特别好的Kube-proxy原则所解释的文章以了解更多信息[30]。
网络虚拟化是一个很大的话题,很难在文章中清楚地表明。甚至是错误。如果您遇到了这样的问题,请在评论区域中讨论/正确。参考文献中提供了许多好的信息。值得进一步学习(地址的一部分受网络环境的限制,并且可以访问一种特定的方式)。
参考
堆栈监视和调整:接收数据(2016):http://arthurchiao.art/blog/blog/tuning-stack-rx-zh/ 4,监视和调整Linux网络堆栈:Joe Damato:Translation:Linux网络:Linux网络:Linux网络:NetworkStack监视和调整:发送数据(2017):http://arthurchiao.art/blog/tuning-stack-tx-zh/ 5,在Linux网络堆栈中缩放,https://github.com/torvalds/linuxx,https://upload.wikimedia.org/wikipedia/commons/3/37/netfilter-packet-flow.svg 9,Linux,https://github.com/fzyz999999/analysis_tcp_inux 10,nattps://github.com/natsy_tcp_inux 10,nattps in linux in tcp,翻译:nat -p.//arthurchiao.art/blog/nat-zh/ 11,linux中的虚拟网络,由m。琼斯,IBM开发人员:https://developer..ibm.com/tutorials/l--virtual-1tworking/12,Open Vswitach,Open Vswitach,Open VSWITACH,OPEN VSWIES,OPEN VSWITIT,OPEN VSWITIE,OPEN VSWITIE,OPEN VSWITIE,OPEN VSETITION,OPEN VSETITION,OPEN VSTIES,OPEN VSTIES,IPN VSHITACH,IPN VSHITACH,http:// http:// http://www.oppevswitch.org/ 13,linux名称空间,https://man7.org/linux/man-pages/man7/namespaces.7.html 14,ip,ip,https://man7.org/linux/linux/linux/linux/linux/linux/linux/linux/linux/linux/linux/linux/man-pages/man8/ip.8.html 15,veth,https://man7.org/linux/man-pages/man4/veth.html 16,vxlan,https://en.wikipedia.org/:///Develoders.redhat.com/blog/2018/10/10/22/introduction-to-linux-interfaces-for-virtual-networking#19,群集网络,集群网络/7/贡献/674 //
25. iptables教程1.2.2,Oskar Andreasson:https://www.frozentux.net/iptables-tutorial/iptablial.html
26.虚拟IPS和服务代理,英文地址:https://kubernetes.io/concepts/services-networking/service/service/ser/ips-ad-ad-service-proxies
27,入口,英语地址:https://kubernetes.io/docs/concepts/services-networking/ingress/
28. Nginx Ingress Controller,https://www.nginx.com/products/nginx-ngress- Controller/
29.入口控制器,英语地址:https://kubernetes.io/docs/concepts/services-networking/ingress- Controller/
30.破解kubernetes节点代理(又名kube-proxy),[翻译]对kubernetes网络模型的深入了解:实施kube-party函数:https://cloudnative.to/blog/k8s-node-proxy//