深入理解NeutronOpenStack网络实现.pdf
《深入理解NeutronOpenStack网络实现.pdf》由会员分享,可在线阅读,更多相关《深入理解NeutronOpenStack网络实现.pdf(94页珍藏版)》请在冰豆网上搜索。
1.前言2.概述3.基本概念4.GRE模式i.计算节点ii.网络节点5.VLAN模式i.计算节点ii.网络节点6.VXLAN模式i.计算节点i.br-intii.br-tunii.网络节点i.br-tunii.br-intiii.br-ex7.网络命名空间i.DHCP服务ii.路由服务8.安全组i.INPUTii.OUTPUTiii.FORWARDiv.整体逻辑v.快速查找安全组规则vi.其它9.LBaaS(负载均衡即服务)i.典型场景ii.实现细节iii.其它问题10.FWaaS(防火墙即服务)i.典型场景ii.实现细节iii.其它问题11.DVR(分布式路由)i.典型场景ii.网络节点iii.计算节点iv.配置v.工作流程vi.实现细节目錄深入理解Neutron-OpenStack网络实现212.工具i.easyOVS13.参考14.附:
安装配置深入理解Neutron-OpenStack网络实现3Neutron是OpenStack项目中负责提供网络服务的组件,它基于软件定义网络的思想,实现了网络虚拟化下的资源管理。
本书将剖析Neutron组件的原理和实现。
最新版本在线阅读:
GitBook。
本书源码在Github上维护,欢迎参与:
https:
/fork到自己的仓库,如user/openstack_understand_Neutron,然后clone到本地,并设置用户信息。
深入理解Neutron-OpenStack网络实现更新历史:
参加步骤深入理解Neutron-OpenStack网络实现4前言$:
user/openstack_understand_Neutron.git$cdopenstack_understand_Neutron$gitconfiguser.nameUser$修改代码后提交,并推送到自己的仓库。
$#dosomechangeonthecontent$gitcommit-amFixissue#1:
changehelotohello$gitpush在GitHub网站上提交pullrequest。
定期使用项目仓库内容更新自己仓库内容。
$gitremoteaddupstreamhttps:
/安全网桥。
详见securitygroup部分的分析。
一个典型的br-int的端口如下所示:
#ovs-vsctlshowBridgebr-intPortqvo-XXXtag:
1Interfaceqvo-XXXPortpatch-tunInterfacepatch-tuntype:
patchoptions:
peer=patch-intPortbr-intInterfacebr-inttype:
internal其中,br-int为内部端口。
patch-tun(即端口E,端口号为1)连接到br-tun上,实现到外部网络的隧道。
qvo-XXX(即端口D,端口号为2)带有tag1,说明这个口是一个1号vlan的access端口。
虚拟机发出的从该端口到达br-int的网包将被自动带上vlantag1,而其他带有vlantag1的网包则可以在去掉vlantag后从该端口发出(即vlanaccess端口)。
这个vlantag是用来实现不同网络相互隔离的,比如租户创建一个网络(neutronnet-create),则会被分配一个唯一的vlantag。
br-int在GRE模式中作为一个NORMAL交换机使用,因此有效规则只有一条正常转发。
如果两个在同一计算节点qbrbr-int深入理解Neutron-OpenStack网络实现10计算节点主机上的vm属于同一个tenant的(同一个vlantag),则它们之间的通信只需要经过br-int即可。
#ovs-ofctldump-flowsbr-intNXST_FLOWreply(xid=0x4):
cookie=0x0,duration=10727.864s,table=0,n_packets=198,n_bytes=17288,idle_age=13,priority=一个典型的br-tun上的端口类似:
Bridgebr-tunPortpatch-intInterfacepatch-inttype:
patchoptions:
peer=patch-tunPortgre-1Interfacegre-1type:
greoptions:
in_key=flow,local_ip=10.0.0.101,out_key=flow,remote_ip=10.0.0.100Portbr-tunInterfacebr-tuntype:
internal其中,patch-int(即端口F,端口号为1)是连接到br-int上的vethpair的端口gre-1端口(即端口G,端口号为2)对应vm到外面的隧道。
gre-1端口是虚拟gre端口,当网包发送到这个端口的时候,会经过内核封包,然后从10.0.0.101发送到10.0.0.100,即从本地的物理网卡(10.0.0.101)发出。
br-tun将带有vlantag的vm跟外部通信的流量转换到对应的gre隧道,这上面要实现主要的转换逻辑,规则要复杂,一般通过多张表来实现。
典型的转发规则为:
#ovs-ofctldump-flowsbr-tunNXST_FLOWreply(xid=0x4):
cookie=0x0,duration=10970.064s,table=0,n_packets=189,n_bytes=16232,idle_age=16,priority=cookie=0x0,duration=10906.954s,table=0,n_packets=29,n_bytes=5736,idle_age=16,priority=cookie=0x0,duration=10969.922s,table=0,n_packets=3,n_bytes=230,idle_age=10962,priority=cookie=0x0,duration=10969.777s,table=1,n_packets=26,n_bytes=5266,idle_age=16,priority=cookie=0x0,duration=10969.631s,table=1,n_packets=163,n_bytes=10966,idle_age=21,priority=cookie=0x0,duration=688.456s,table=2,n_packets=29,n_bytes=5736,idle_age=16,priority=cookie=0x0,duration=10969.488s,table=2,n_packets=0,n_bytes=0,idle_age=10969,priority=cookie=0x0,duration=10969.343s,table=3,n_packets=0,n_bytes=0,idle_age=10969,priority=cookie=0x0,duration=10969.2s,table=10,n_packets=29,n_bytes=5736,idle_age=16,priority=cookie=0x0,duration=682.603s,table=20,n_packets=26,n_bytes=5266,hard_timeout=300,idle_age=cookie=0x0,duration=10969.057s,table=20,n_packets=0,n_bytes=0,idle_age=10969,priority=cookie=0x0,duration=688.6s,table=21,n_packets=161,n_bytes=10818,idle_age=21,priority=br-tun深入理解Neutron-OpenStack网络实现11计算节点cookie=0x0,duration=10968.912s,table=21,n_packets=2,n_bytes=148,idle_age=689,priority=其中,表0中有3条规则:
从内部端口1(即patch-int)来的,扔到表1,从外部端口2(即gre-1)来的,扔到表2。
cookie=0x0,duration=10970.064s,table=0,n_packets=189,n_bytes=16232,idle_age=16,priority=cookie=0x0,duration=10906.954s,table=0,n_packets=29,n_bytes=5736,idle_age=16,priority=cookie=0x0,duration=10969.922s,table=0,n_packets=3,n_bytes=230,idle_age=10962,priority=表1处理内部过来的网包,有2条规则:
如果是单播(00:
00:
00:
00:
00:
00/01:
00:
00:
00:
00:
00),则扔到表20;如果是多播等(01:
00:
00:
00:
00:
00/01:
00:
00:
00:
00:
00),则扔到表21。
cookie=0x0,duration=10969.777s,table=1,n_packets=26,n_bytes=5266,idle_age=16,priority=0,dl_dst=00:
00:
00:
00:
00:
00/01:
00:
00:
00:
00:
00actions=resubmit(,20)cookie=0x0,duration=10969.631s,table=1,n_packets=163,n_bytes=10966,idle_age=21,priority=0,dl_dst=01:
00:
00:
00:
00:
00/01:
00:
00:
00:
00:
00actions=resubmit(,21)表2处理外部过来的包。
有2条规则:
如果是tunnel1(合法的tunnelid)的网包,则修改其vlanid为1,并扔到表10学习记录来源;非tunnel1(非法的tunnelid)的网包,则丢弃。
cookie=0x0,duration=688.456s,table=2,n_packets=29,n_bytes=5736,idle_age=16,priority=cookie=0x0,duration=10969.488s,table=2,n_packets=0,n_bytes=0,idle_age=10969,priority=表3只有1条规则:
丢弃。
表10负责学习。
有一条规则,基于learn行动来创建反向(内部网包从gre端口发出去)的规则。
learn行动并非标准的openflow行动,是openvswitch自身的扩展行动,这个行动可以根据流内容动态来修改流表内容。
这条规则首先创建了一条新的流(该流对应vm从br-tun的gre端口发出的规则):
其中table=20表示规则添加在表20;NXM_OF_VLAN_TCI0.11表示匹配包自带的vlanid;NXM_OF_ETH_DST=NXM_OF_ETH_SRC表示L2目标地址需要匹配当前包的L2源地址;load:
0-NXM_OF_VLAN_TCI,去掉vlan,load:
NXM_NX_TUN_ID-NXM_NX_TUN_ID,添加tunnel号为原始tunnel号;output:
NXM_OF_IN_PORT,发出端口为原始包抵达的端口。
表0表1表2表3表10深入理解Neutron-OpenStack网络实现12计算节点向表20添加完规则后,最后将匹配的当前网包从端口1(即patch-int)发出。
cookie=0x0,duration=10969.2s,table=10,n_packets=29,n_bytes=5736,idle_age=16,priority=表20中有两条规则,其中第一条即表10中规则利用learn行动创建的内部向外部发包的