常见三网络划分
External Network/API Network:连接外网,用于调用 openstack 的 API,虚拟机访问外网,外部ssh到虚拟机
Data Network:数据网络,虚拟机之间的数据传输
Management Network:管理网络,openstack 内部各个模块之间的交互,连接数据库,连接 Message Queue
Neutron中的网桥
br-int 综合网桥,实现内部网络功能
br-ex 外部网桥,与外部网络通信
单节点是 openstack 的测试环境,对于复杂环境的多节点,每个机器都有自己的 br-int
对于多节点结构,可以想象 br-int 是一个大的,横跨所有节点的二层 switch
然而 br-int 在实际环境中是物理的分隔开了,需要有一种方式将它们串联起来,openstack 提供了多种方式,例如 GRE,VLAN,VxLAN
不同机器上的 br-int 通过 br-int 下面的网卡连接
对于虚拟机和虚拟 router,它们仍然觉得是连接到了一个大的 L2 的 br-int 上,通过这个 br-int 相互通信,它们感受不到 br-int 下面的虚拟网卡 br-tun
如果有不同的 tenant,创建了不同的 private network,为了在 Data Network 上对数据进行隔离,创建 private network 的时候,需要指定 vlanid
不同的 tenant 的 private network 上创建的虚拟机,连接到 br-int 上的时候都是带 tag 的,所以不同 tenant 的虚拟机,即使连接到同一个 br-int 上,因为 tag 不同,也是不能相互通信
同一个机器上的 tag 计数仅在本机有效,并不使用我们创建 private network 指定的全局唯一的 vlanid
全局唯一的 vlanid 仅在 br-int 以下的虚拟网卡和物理网络中使用
虚拟机仅能感知 br-int 以上的网络,看不到打通 br-int 所要使用的 vlanid
neutron 组件的简单流程图
neutron-server:接受 api 调用,发送到对应的 neutron-plugin 上
neutron-plugin:实现网络功能,交给对应的 neutron-agent
neutron-agent:模拟出具体设备
neutron-L2-agent:二层代理,用于管理 vlan 的插件,实现二层网络通信的代理
neutron-L3-agent:租户网络和 floating ip 之间的转换
neutron-metadata-agent:运行在网络节点,用于响应 nova 的 metadata 请求
LBaaS agent:为多台实例和 ovs agent 提供负载均衡服务
Linux虚拟网络基础
虚拟网络设备 tap/tun
tap/tun 虚拟了一套网络接口,与物理网络几乎无区别
tap/tun 虚拟网络设备的原理:
在 linux 内核中添加了一共 tap/tun 虚拟设备的驱动程序,和与之关联的字符设备文件 /dev/tunX,协议栈可以像操作普通网卡一样操作(read/write 设备文件) tunX 代表的虚拟网卡
tap位于数据链路层,与以太网协议对应
##检查linux系统是否有tun模块 modinfo tun ##检查tun模块是否已经加载 lsmod | grep tun ##如果没有加载则执行以下命令加载 modprobe tun ##检查是否有tun/tap的命令行操作工具tunctl tunctl help yum install tunctl
##创建一个tap设备 tunctl -f tap_test ##给tap设备配置IP地址 ip addr add 192.168.12.3/24 dev tap_test ifconfig 192.168.12.3/24 tap_test
tun是一个网络层的点对点设备,它启用了IP层隧道功能,Linux原生支持的三层隧道,可以通过命令行ip tunnel help查看
lsmod | grep gre modprobe gre ##加载gre模块
##在ns1上创建tun1和gre tunnel ip netns exec ns1 ip tunnel add tun1 mode gre remote 192.168.200.2 local 192.168.100.2 ttl 255 ip netns exec ns1 ip link set tun1 up ip netns exec ns1 ip addr add 192.168.50.10 peer 192.168.60.10 dev tun1 ##在ns2上创建tun2和gre tunnel ip netns exec ns2 ip tunnel add tun2 mode gre remote 192.168.100.2 local 192.168.200.2 ttl 255 ip netns exec ns2 ip link set tun2 up ip netns exec ns2 ip addr add 192.168.60.10 peer 192.168.50.10 dev tun2
tap 和 tun 的区别:
1.tap 工作在二层,可以配置 mac 和 ip 地址
tun 工作在点对点三层,无 mac 地址
2.tap 子网掩码为 /24,对应以太网设备
tun 子网掩码为 /30,对应点对点设备
3.tap 用于创建网桥
tun 一般用于路由
namespace
linux namespace隔离的资源
uts_ns UTS为Unix Timesharing System的简称,包含内存名称、版本、底层体系结构等信息 ipc_ns 所有与进程间通信(IPC)有关的信息 mnt_ns 当前装载的文件系统 pid_ns 有关进程ID的信息 user_ns 资源配额的信息 net_ns 网络信息
ip netns ##创建一个namespace ip netns add ns_test ##把虚拟设备tap_test迁移到这个namespace ip link set tap_test netns ns_test ##在ns_test里执行配置IP地址 ip netns exec ns_test ifconfig tap_test 192.168.12.3/24 up
veth pair
veth-pair 是成对出现的一种虚拟网络设备,一端连接协议栈,一端互联
常用于连接虚拟网络组件,例如 linux bridge,ovs
##创建veth pair ip link add tap1 type veth peer name tap2 ##创建namespace:ns1、ns2 ip netns add ns1 ip netns add ns2
##把两个tap分别迁移到对应的namespace中 ip link set tap1 netns ns1 ip link set tap2 netns ns2
##分别给两个tap绑定IP地址 ip netns exec ns1 ip addr add local 192.168.50.1/24 dev tap1 ip netns exec ns2 ip addr add local 192.168.50.2/24 dev tap2
##将两个tap设置为up ip netns exec ns1 ifconfig tap1 up ip netns exec ns2 ifconfig tap2 up
##ping ip netns exec ns2 ping 192.168.50.1 ip netns exec ns1 ping 192.168.50.2
Bridge
如果多个namespace之间需要互通,veth pair只有一对tap,无法满足需求,这就需要用的Bridge/Switch
##Linux实现Bridge功能的是brctl模块 yum install bridge-utils brctl
实现4个namespace通过veth pair、Bridge互联
##创建veth pair ip link add tap1 veth peer name tap1_peer ip link add tap2 veth peer name tap2_peer ip link add tap3 veth peer name tap3_peer ip link add tap4 veth peer name tap4_peer ##创建namespace ip netns add ns1 ip netns add ns2 ip netns add ns3 ip netns add ns4 ##把tap迁移到相应namespace中 ip link set tap1 netns ns1 ip link set tap2 netns ns2 ip link set tap3 netns ns3 ip link set tap4 netns ns4 ##创建bridge brctl addbr br1 ##把相应tap添加到bridge中 brctl addif br1 tap1_peer brctl addif br1 tap2_peer brctl addif br1 tap3_peer brctl addif br1 tap4_peer ##配置相应tap的ip地址 ip netns exec ns1 ip addr add local 192.168.50.1/24 dev tap1 ip netns exec ns2 ip addr add local 192.168.50.2/24 dev tap2 ip netns exec ns3 ip addr add local 192.168.50.3/24 dev tap3 ip netns exec ns4 ip addr add local 192.168.50.4/24 dev tap4 ##将bridge及所有tap状态设置为up ip link set br1 up ip link set tap1_peer up ip link set tap2_peer up ip link set tap3_peer up ip link set tap4_peer up ip netns exec ns1 ip link set tap1 up ip netns exec ns2 ip link set tap2 up ip netns exec ns3 ip link set tap3 up ip netns exec ns4 ip link set tap4 up ##ping测试 ip netns exec ns1 ping 192.168.50.4
Neutron的网络实现模型
计算节点的实现模型
VLAN实现模型
qbr (quantum bridge)
常见实现载体linux bridge,引入qbr主要是利用iptables实现security group功能
br-int (integration bridge)
常见实现载体openvswitch,综合网桥,qbr与br-int之间通过vethpair连接,vm与qbr之间通过tap连接
br-ex (bridge-ethernet-external)
常见实现载体openvswitch,负责外部通信,br-ex与br-int之间通过vethpair连接
内外VLAN ID的转换
参考链接:
https://www.cnblogs.com/fish001/articles/5619132.html
https://blog.csdn.net/controllerha/article/details/78881018
https://blog.csdn.net/liuxiaoxueer/article/details/89163433
https://www.cnblogs.com/tongxiaoda/p/8862789.html
https://www.cnblogs.com/wyzhou/p/9286864.html