1.二十分钟了解K8S网络模型原理
2.深入理解kubernetes(k8s)网络原理之五-flannel原理
3.基于openstack网络模式的vlan分析
4.Trex--高性能压测的dream tools
5.OvS-vsctl与ovsdb交互源码分析
二十分钟了解K8S网络模型原理
掌握K8S网络模型无需神秘,只需分钟,本文将带你轻松理解。首先,让我们预习一些基础网络知识:Linux网络命名空间:虚拟化网络栈,如同登录Linux服务器时的java表白代码源码默认Host网络栈。
网桥设备:内核中的虚拟端口,用于转发网络数据。
Veth Pair:一对虚拟网卡,常用于连接不同网络命名空间。
VXLAN:扩展局域网,将L2数据包封装到UDP报文中,用于跨主机通信。
BGP:边界网关协议,实现自治系统间的路由可达性。
理解了这些,我们转向单机容器网络模型,这是Docker的基本架构。然后,我们进入K8S网络模型的探索,包括Flannel和Calico两种常见模型:Flannel:两种实现(UDP和VXLAN),分别涉及TUN设备或VXLAN隧道,以及Host-gw的三层解决方案。
Calico:非IPIP模式利用BGP维护路由,无网桥的直接路由规则;IPIP模式通过IP隧道解决跨子网通信问题。
最后,CNI网络插件是K8S的核心组件,负责在Pod创建时设置网络环境,仿智玩源码如网络命名空间的配置和路由规则的设定。 通过本文,你将对K8S网络模型有深入理解,进一步实践将使理论更加扎实。详细教程和源代码可以参考相关资源。现在,你已经准备好了深入研究K8S网络的旅程。深入理解kubernetes(k8s)网络原理之五-flannel原理
flannel在Kubernetes(k8s)网络架构中扮演着关键角色,其提供多种网络模式,其中最为广泛应用的是VXLAN模式。本文旨在深入探讨VXLAN模式下flannel的运作原理,同时对UDP模式进行简要介绍。
VXLAN模式下的flannel依赖于VXLAN协议,实现跨主机Pod间的通信。这种模式下,flannel的组件工作流程涉及多个关键步骤。首先,flannel-cni文件作为CNI规范下的二进制文件,负责生成配置文件并调用其它CNI插件(如bridge和host-local),从而实现主机到主机的网络互通。flannel-cni文件并非flannel项目源码,而是位于CNI的plugins中。
在flannel-cni工作流程中,kubelet在创建Pod时,会启动一个pause容器,并获取网络命名空间。随后,c aes加密源码它调用配置文件指定的CNI插件(即flannel),以加载相关参数。flannel读取从/subnet.env文件获取的节点子网信息,生成符合CNI标准的配置文件。接着,flannel利用此配置文件调用bridge插件,完成Pod到主机、同主机Pod间的数据通信。
kube-flannel作为Kubernetes的daemonset运行,主要负责跨节点Pod通信的编织工作。它完成的主要任务包括为每个节点创建VXLAN设备,并更新主机路由。当节点添加或移除时,kube-flannel会相应地调整网络配置。在VXLAN模式下,每个节点上的kube-flannel会与flanneld守护进程进行通信,以同步路由信息。
在UDP模式下,每个节点运行flanneld守护进程,参与数据包转发。flanneld通过Unix域套接字与本地flanneld通信,而非通过fdb表和邻居表同步路由信息。当节点新增时,kube-flannel会在节点间建立路由条目,并调整网络配置以确保通信的连续性。
flannel在0.9.0版本前,使用不同策略处理VXLAN封包过程中可能缺少的vpay数字币源码ARP记录和fdb记录。从0.9.0版本开始,flannel不再监听netlink消息,优化了内核态与用户态的交互,从而提升性能。
通过理解flannel的运行机制,可以发现它在VXLAN模式下实现了高效的跨节点Pod通信。flannel挂载情况不影响现有Pod的通信,但新节点或新Pod的加入需flannel参与网络配置。本文最后提示读者,了解flannel原理后,可尝试自行开发CNI插件。
基于openstack网络模式的vlan分析
OpenStack概念OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Apache许可证授权,并且是一个自由软件和开放源代码项目。、
OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它的社区拥有超过家企业及位开发者,这些机构与个人都将OpenStack作为基础设施即服务(简称IaaS)资源的通用前端。OpenStack项目的首要任务是简化云的部署过程并为其带来良好的可扩展性。本文希望通过提供必要的指导信息,帮助大家利用OpenStack前端来设置及管理自己的公共云或私有云。
openstack neutron中定义了四种网络模式:
# tenant_network_type = local
# tenant_network_type = vlan
# Example: tenant_network_type = gre
# Example: tenant_network_type = vxlan
本文主要以vlan为例,并结合local来详细的分析下openstack的网络模式。
1. local模式
此模式主要用来做测试,只能做单节点的部署(all-in-one),这是因为此网络模式下流量并不能通过真实的物理网卡流出,即neutron的php jsapi支付源码integration bridge并没有与真实的物理网卡做mapping,只能保证同一主机上的vm是连通的,具体参见RDO和neutron的配置文件。
(1)RDO配置文件(answer.conf)
主要看下面红色的配置项,默认为空。
复制代码
代码如下:
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS
openswitch默认的网桥的映射到哪,即br-int映射到哪。 正式由于br-int没有映射到任何bridge或interface,所以只能br-int上的虚拟机之间是连通的。
复制代码
代码如下:
CONFIG_NEUTRON_OVS_BRIDGE_IFACES
流量最后从哪块物理网卡流出配置项
复制代码
代码如下:
# Type of network to allocate for tenant networks (eg. vlan, local,
# gre)
CONFIG_NEUTRON_OVS_TENANT_NETWORK_TYPE=local
# A comma separated list of VLAN ranges for the Neutron openvswitch
# plugin (eg. physnet1:1:,physnet2,physnet3::)
CONFIG_NEUTRON_OVS_VLAN_RANGES=
# A comma separated list of bridge mappings for the Neutron
# openvswitch plugin (eg. physnet1:br-eth1,physnet2:br-eth2,physnet3
# :br-eth3)
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS=
# A comma separated list of colon-separated OVS bridge:interface
# pairs. The interface will be added to the associated bridge.
CONFIG_NEUTRON_OVS_BRIDGE_IFACES=
(2)neutron配置文件(/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini)
复制代码
代码如下:
[ovs]
# (StrOpt) Type of network to allocate for tenant networks. The
# default value 'local' is useful only for single-box testing and
# provides no connectivity between hosts. You MUST either change this
# to 'vlan' and configure network_vlan_ranges below or change this to
# 'gre' or 'vxlan' and configure tunnel_id_ranges below in order for
# tenant networks to provide connectivity between hosts. Set to 'none'
# to disable creation of tenant networks.
#
tenant_network_type = local
RDO会根据answer.conf中local的配置将neutron中open vswitch配置文件中配置为local
2. vlan模式
大家对vlan可能比较熟悉,就不再赘述,直接看RDO和neutron的配置文件。
(1)RDO配置文件
复制代码
代码如下:
# Type of network to allocate for tenant networks (eg. vlan, local,
# gre)
CONFIG_NEUTRON_OVS_TENANT_NETWORK_TYPE=vlan //指定网络模式为vlan
# A comma separated list of VLAN ranges for the Neutron openvswitch
# plugin (eg. physnet1:1:,physnet2,physnet3::)
CONFIG_NEUTRON_OVS_VLAN_RANGES=physnet1:: //设置vlan ID value为~
# A comma separated list of bridge mappings for the Neutron
# openvswitch plugin (eg. physnet1:br-eth1,physnet2:br-eth2,physnet3
# :br-eth3)
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS=physnet1:br-eth1 //设置将br-int映射到桥br-eth1(会自动创建phy-br-eth1和int-br-eth1来连接br-int和br-eth1)
# A comma separated list of colon-separated OVS bridge:interface
# pairs. The interface will be added to the associated bridge.
CONFIG_NEUTRON_OVS_BRIDGE_IFACES=br-eth1:eth1 //设置eth0桥接到br-eth1上,即最后的网络流量从eth1流出 (会自动执行ovs-vsctl add br-eth1 eth1)
此配置描述的网桥与网桥之间,网桥与网卡之间的映射和连接关系具体可结合 《图1 vlan模式下计算节点的网络设备拓扑结构图》和 《图2 vlan模式下网络节点的网络设备拓扑结构图 》来理解。
思考:很多同学可能会碰到一场景:物理机只有一块网卡,或有两块网卡但只有一块网卡连接有网线
此时,可以做如下配置
(2)单网卡:
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS=physnet1:br-eth0 //设置将br-int映射到桥br-eth
复制代码
代码如下:
# A comma separated list of colon-separated OVS bridge:interface
# pairs. The interface will be added to the associated bridge
CONFIG_NEUTRON_OVS_BRIDGE_IFACES= //配置为空
这个配置的含义是将br-int映射到br-eth0,但是br-eth0并没有与真正的物理网卡绑定,这就需要你事先在所有的计算节点(或网络节点)上事先创建好br-eth0桥,并将eth0添加到br-eth0上,然后在br-eth0上配置好ip,那么RDO在安装的时候,只要建立好br-int与br-eth0之间的连接,整个网络就通了。
此时如果网络节点也是单网卡的话,可能就不能使用float ip的功能了。
(3)双网卡,单网线
复制代码
代码如下:
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS=physnet1:br-eth1 //设置将br-int映射到桥br-eth1
/pp# A comma separated list of colon-separated OVS bridge:interface
/pp# pairs. The interface will be added to the associated bridge.
/ppCONFIG_NEUTRON_OVS_BRIDGE_IFACES=eth1 //配置为空
还是默认都配置到eth1上,然后通过iptables将eth1的流量forward到eth0(没有试验过,不确定是否可行)
3. vlan网络模式详解
图1 vlan模式下计算节点的网络设备拓扑结构图
首先来分析下vlan网络模式下,计算节点上虚拟网络设备的拓扑结构。
(1)qbrXXX 等设备
前面已经讲过,主要是因为不能再tap设备vnet0上配置network ACL rules而增加的
(2)qvbXXX/qvoXXX等设备
这是一对veth pair devices,用来连接bridge device和switch,从名字猜测下:q-quantum, v-veth, b-bridge, o-open vswitch(quantum年代的遗留)。
(3) int-br-eth1和phy-br-eth1
这也是一对veth pair devices,用来连接br-int和br-eth1, 另外,vlan ID的转化也是在这执行的,比如从int-br-eth1进来的packets,其vlan id=会被转化成1,同理,从phy-br-eth1出去的packets,其vlan id会从1转化成
(4)br-eth1和eth1
packets要想进入physical network最后还得到真正的物理网卡eth1,所以add eth1 to br-eth1上,整个链路才完全打通
图2 vlan模式下网络节点的网络设备拓扑结构图
网络节点与计算节点相比,就是多了external network,L3 agent和dhcp agent。
(1)network namespace
每个L3 router对应一个private network,但是怎么保证每个private的ip address可以overlapping而又不相互影响呢,这就利用了linux kernel的network namespace
(2)qr-YYY和qg-VVV等设备 (q-quantum, r-router, g-gateway)
qr-YYY获得了一个internal的ip,qg-VVV是一个external的ip,通过iptables rules进行NAT映射。
思考:phy-br-ex和int-br-ex是干啥的?
坚持"所有packets必须经过物理的线路才能通"的思想,虽然 qr-YYY和qg-VVV之间建立的NAT的映射,归根到底还得通过一条物理链路,那么phy-br-ex和int-br-ex就建立了这条物理链路。
Trex--高性能压测的dream tools
在高性能转发设备的测试中,选择一款合适的高性能压测工具显得至关重要。传统工具如iperf、wrk、ab等在性能方面并不足够,尤其是当设备基于dpdk实现时,它们的性能往往无法充分挖掘设备潜力。在这样的需求下,dpdk-pktgen成为了一个基本能满足性能要求的选项,然而,它在灵活性方面存在显著不足,无法在不修改源码的情况下调整如TCP标志等特性。
这时,Cisco在年开源的trex脱颖而出,成为高性能压测的理想工具。trex不仅基于dpdk实现,确保了高性能,而且提供了高度自由的包编辑能力,满足了在不修改源码的情况下调整各种参数的需要。相较于dpdk-pktgen,trex更显优势。
为理解trex,不妨先探讨scapy,一个强大的Python数据包操纵库。scapy允许按层次逐级构建数据包,以代码为例,可以轻松创建一个基于vxlan的ipv6 syn包。通过自定义层次,scapy支持构建任意所需的包,包括插入自定义协议,如自定义的TCP选项、代理协议或nsh等。
trex通过Python SDK中的STLPktBuilder接口,与scapy无缝集成,使得构建复杂数据包成为可能。trex的数据面基于dpdk实现,通过json-rpc接口对外提供控制,支持CLI、PYTHON SDK和GUI三种方式,对于开发者而言,PYTHON SDK无疑是首选。基于此SDK,自动化构建性能测试工具,为每个版本提供全面的测试数据,无疑是一种高效且便捷的方法。
整体架构方面,trex官网提供了详尽的帮助文档和实例,清晰展示了其工作原理和配置步骤。针对负载均衡(LB)测试,关注的关键指标包括CPS(每秒处理请求数)、BPS(每秒字节传输量)、PPS(每秒包传输量)以及特殊报文处理能力,如会话同步、NAT等。
trex的无状态模式提供了一系列优势,包括自动化框架、流编排和报文变量设置等。通过例如stl_bi_dir_flows.py、burst_3st_loop_x_times.py和syn_attack_fix_cs_hw.py等脚本,可以实现高效且精确的测试流程,从而深入挖掘设备性能。
OvS-vsctl与ovsdb交互源码分析
本文深入解析了ovs-vsctl与ovsdb交互的源码细节,旨在帮助初学者更好地理解配置过程。具体以ovs-vsctl add-port s1 vxlan为例,揭示了其在ovs基础命令框架下的执行流程。
首先,处理命令行并更新事务。主体代码位于utilities/ovs-vsctl.c文件中,其主函数do_vsctl负责解析命令行,并将需要更新的信息同步到ovsdb。vsctl_cmd_init函数注册了vsctl的命令参数选项,并存储了各命令及回调函数等相关信息。例如,add-port命令的执行会调用cmd_add_port函数。
在执行命令过程中,ovs利用生成的python代码(如ovsrec_port_set_name)对数据库事务(txn)进行封装。该过程涉及将datum的n、key、val信息存入row结构体中,以便后续更新。ovsrec_port_columns_init注册了column的解析和反解析函数,name字符串通过ovsdb_datum_clone调用parse函数解析到row->new中。最后,ovsdb_idl_txn_commit_block将更新后的txn同步到ovsdb。
接着,ovs-vsctl通过默认的unix sock与ovsdb通信。Open vSwitch Database Interface Definition Language (OVSDB IDL) 描述了通信接口。stream_lookup_class用于检查stream的name为unix。stream在挂接了unix_stream_class后,进一步挂接stream_fd_class。
对于深入学习和交流,相关资源和链接提供了一定的指导,如yuque.com/lishuhuakai/d...等,涵盖了dpdk/spdk/网络协议栈/存储/网关开发/网络安全/虚拟化/0vS/TRex/dpvs公开课程。此外,dpdk/spdk/网络协议栈的学习资料、教学视频和学习路线图可在特定学习交流群中找到,为开发者提供了丰富的学习资源和社区支持。