上一篇讲提到的其中一个问题
问:为什么可以不需要实际的交换机路由器,也能弄出网络来?
答:是因为OpenStack中采用了网络虚拟化技术
先来说说为什么需要网络虚拟化技术,不要会怎么样?
假设一个互联网云计算中心的服务器有5000台,按照1:20的比例进行虚拟化,则有10万个虚拟机。
通常每个虚拟机会配置两个业务网口,这样这个云计算中心就有20万个虚拟网口,对应的就是需要20万个MAC地址和IP地址。云计算要求资源灵活调度,业务资源任意迁移。也就是说任意一个虚拟机可以在整个云计算网络中任意迁移。这就要求全网在一个统一的二层网络中。
全网任意交换机都有可能学习到全网所有的MAC表项。与此对应的则是,目前业界主流的接入交换机的MAC表项只有32K,基本无法满足互联网云计算的需求。
另外,网关需要记录全网所有主机、所有网口的ARP信息。这就需要网关设备的有效ARP表项超过20万。大部分的网关设备芯片都不具备这种能力。
传统的大二层网络支持任意VLAN的虚拟机迁移到网络的任意位置,一般有两种方式。
虚拟机迁移后,通过自动化网络管理平台动态的在虚拟机对应的所有端口上下发VLAN配置;
同时,还需要动态删除迁移前虚拟机对应所有端口上的VLAN配置。这种方式的缺点是实现非常复杂,同时自动化管理平台对多厂商设备还面临兼容性的问 题,所以很难实现。
在云计算网络上静态配置VLAN,在所有端口上配置VLAN trunk all。这种方式的优点是非常简单,是目前主流的应用方式。
但这也带来了巨大的问题:任一VLAN内如果出现广播风暴,则全网所有VLAN内的虚拟机都会受到风暴影响,出现业务中断。
云计算网络中有可能出现多租户需求。如果租户及业务的数量规模超出VLAN的上限(4K),则无法支撑客户的需求。
VM迁移需要在同一个二层域内,基于IP子网的区域划分限制了二层网络连通性的规模。
在OpenStack 是通过 Neutron 组件在物理网络环境之上提供满足多项目要求的虚拟网络和服务。
Neutron 提供的网络虚拟化能力包括:
(1)接收客户的操作请求
在上一篇中,我们创建一个网络时,我们发过去的请求,是由Neutron-Server的API进行接受处理的
(2)租户(项目)隔离性
在创建时,还可以选择一个对应项目,使它们同名不同项目间的网络互相不冲突
[root@controller /(keystone_admin)]# openstack user create ctf1 --project ctf --password 123456 --email ctf1@vip.com
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| default_project_id | 2c9ab6ba08b94b0cab0cb4407a073bee |
| domain_id | default |
| email | ctf1@vip.com |
| enabled | True |
| id | a24342d7e2834d6ea54426690226c7de |
| name | ctf1 |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
[root@controller /(keystone_admin)]# openstack role add --project ctf --user ctf1 _member_
[root@controller /(keystone_admin)]# openstack flavor create --vcpus 1 --ram 218 --disk 5 web.ciross
[root@controller opt(keystone_admin)]# ls -lh
总用量 13M
-rw-r--r-- 1 root root 13M 12月 18 20:17 cirros-0.3.4-x86_64-disk.img
drwxr-xr-x. 2 root root 6 6月 18 2018 rh
[root@controller opt(keystone_admin)]# openstack image create ciross --public --disk-format qcow2 --file /opt/cirros-0.3.4-x86_64-disk.img
[root@controller /(keystone_admin)]# openstack aggregate create cputer --zone cpu
[root@controller /(keystone_admin)]#openstack aggregate add host cputer computer
需求:现在要在CTF项目中创建2个云主机一个在控制节点,一个在计算节点,网络类型为Flat网络,测试连通性
先删除之前创建的ctf_net网络,配置flat网络
[root@controller /]# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
#网络驱动类型
type_drivers=flat,vlan,vxlan,gre,local
#这里写租户网络类型,可以写多种
tenant_network_types=flat
#neutron采用的虚拟交换机
mechanism_drivers=openvswitch
#上面写了flat,这里就要写flat对应的配置
[ml2_type_flat]
#flat物理网络类型,在创建的时候必须指定对应的这个名称
flat_networks=external
[root@controller network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@controller network-scripts]# cat ifcfg-ens38
TYPE="Ethernet"
BOOTPROTO="none"
NAME="ens38"
DEVICE="ens38"
ONBOOT="yes"
[root@controller network-scripts]# ifup ens38
[root@controller network-scripts]# ovs-vsctl add-br br-ens38
[root@controller network-scripts]# ovs-vsctl add-port br-ens38 ens38
[ovs]
tenant_network_type=flat
bridge_mappings=external:br-ens38
integration_bridge=br-int
tunnel_bridge=br-tun
local_ip=192.168.150.10
#生效的是ml2_conf.ini配置文件
[root@controller /]# systemctl restart neutron-server
#生效的是openvswitch_agent.ini配置文件
[root@controller /]# systemctl restart neutron-openvswitch-agent
注意:这个是以admi身份创建的flat类型网络
上面中的物理网络也就是刚刚写在ml2_conf.ini配置文件中的这一条
#flat物理网络类型
flat_networks=external
这个代表什么意思?
这种网络称为Provider Network 是由 OpenStack 管理员创建的,直接对应于真实物理机中的已有物理网络的一个网段。
为什么要这个东西?
如果云主机要访问其他计算节点的主机,数据包就必须通过自身的物理网卡走出去,所以它的作用是当云主机要访问外部网络时,走哪个物理网卡
Provider Network有三个属性
建议使用命令来创建,WEB界面中创建时遇到到的问题报错信息不是很明显
上面的操作相当于命令
[root@controller /(keystone_admin)]# openstack network create ctf_net --project ctf --provider-network-type flat --provider-physical-network external
指定子网
子网在openstack中它是一个ipv4或ipv6的一个地址池,它必须与一个网络相关联,可以给用户分配ip,指定网关、DNS。
分配一个地址池
现在已经创建成功
创建子网的操作相当于命令
openstack subnet create ctf_subnet --project ctf --allocation-pool start=172.16.199.10,end=172.16.199.100 --subnet-range 172.16.199.0/24 --network ctf_net
[root@controller ~(keystone_netuser1)]# cat keystonerc_ctf1
unset OS_SERVICE_TOKEN
export OS_USERNAME=ctf1
export OS_PASSWORD='123456'
export OS_REGION_NAME=RegionOne
export OS_AUTH_URL=http://192.168.150.10:5000/v3
export PS1='[\u@\h \W(keystone_ctf1)]\$ '
export OS_PROJECT_NAME=ctf
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_IDENTITY_API_VERSION=3
[root@controller ~(keystone_ctf1)]# openstack network list
[root@controller ml2(keystone_ctf1)]# openstack network list
+--------------------------------------+---------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+---------+--------------------------------------+
| 5892263b-fec8-4be0-ae86-f8e86ee5f311 | ctf_net | 6cb6193a-cb9c-47e3-99e5-d36a2747b0e2 |
+--------------------------------------+---------+--------------------------------------+
[root@controller ~(keystone_ctf1)]# openstack server create serverA --image ciross --flavor web.ciross --nic net-id=5892263b-fec8-4be0-ae86-f8e86ee5f311
[root@controller ~]# virsh domiflist instance-00000003
接口 类型 源 型号 MAC
-------------------------------------------------------
tap9f9c98cb-13 bridge qbr9f9c98cb-13 virtio fa:16:3e:66:e4:5b
[root@controller ~]# brctl show
bridge name bridge id STP enabled interfaces
qbr9f9c98cb-13 8000.aa908a6357a5 no qvb9f9c98cb-13
tap9f9c98cb-13
查看网络命名空间
[root@controller ~]# ip netns show
qdhcp-5892263b-fec8-4be0-ae86-f8e86ee5f311 (id: 0)
查看网络命名空间的网卡信息
[root@controller ~]# ip netns exec qdhcp-5892263b-fec8-4be0-ae86-f8e86ee5f311 ip add
36: tap91000a6c-33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether fa:16:3e:c6:53:03 brd ff:ff:ff:ff:ff:ff
inet 172.16.199.10/24 brd 172.16.199.255 scope global tap91000a6c-33
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fec6:5303/64 scope link
valid_lft forever preferred_lft forever
查看OVS交换机的信息
[root@controller opt(keystone_admin)]# ovs-vsctl show
Bridge br-int
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
#给子网分配dhcp的设备
Port "tap91000a6c-33"
tag: 3
Interface "tap91000a6c-33"
type: internal
#连接到ens38网卡的设备
Port "int-br-ens38"
Interface "int-br-ens38"
type: patch
options: {peer="phy-br-ens38"}
#linux虚拟交换机连接自己的设备
Port "qvo9f9c98cb-13"
tag: 3
Interface "qvo9f9c98cb-13"
Bridge "br-ens38"
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
#连接br-int的设备
Port "phy-br-ens38"
Interface "phy-br-ens38"
type: patch
options: {peer="int-br-ens38"}
Port "ens38"
Interface "ens38"
ovs_version: "2.11.0"
主机连接结构图
模拟一个二层的网络设备,可以接受和发送二层数据包
它是ServerA虚拟机连接到linux虚拟网桥间的一个中间设备
因为ovs没有数据包过滤的功能所以qbr的存在主要是为了辅助iptables来实现 security group功能,有时候也被称为安全网桥。
neutron veth, Linux Bridge-side,它是linux虚拟网桥连接,OVS交换机的一个接口设备
neutron veth, OVS-side,专门给inux虚拟网桥连接的一个接口设备
它是计算节点中专门用来给虚拟机内部通信的一个交换机
linux内核功能中用来实现隔离的一套机制,不同 namespace 中的资源之间彼此不可见。
上面创建的一个子网就是在一个namespace中,可以用ip netns show 查看到
[root@computer network-scripts]# cat ifcfg-ens38
TYPE="Ethernet"
BOOTPROTO="none"
NAME="ens38"
DEVICE="ens38"
ONBOOT="yes"
#启用网卡
[root@computer network-scripts]# ifup ens38
[root@computer /]# ovs-vsctl add-br br-ens38
[root@computer /]# ovs-vsctl add-port br-ens38 ens38
[root@computer ml2]# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
tenant_network_type=flat
bridge_mappings=external:br-ens38
[root@computer ml2]# systemctl restart neutron-openvswitch-agent.service
[root@controller /(keystone_netuser1)]# openstack server create ServerB --image ciross --flavor web.ciross --nic net-id=5892263b-fec8-4be0-ae86-f8e86ee5f311 --availability-zone cpu
如果发现云主机,dhcp获取半天,可以把接口
$ sudo ifconfig eth0 172.16.199.60 netmask 255.255.255.0 up
$ ifconfig
eth0 Link encap:Ethernet HWaddr FA:16:3E:66:E4:5B
inet addr:172.16.199.60 Bcast:172.16.199.255 Mask:255.255.255.0
inet6 addr: fe80::f816:3eff:fe66:e45b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:433 errors:0 dropped:0 overruns:0 frame:0
TX packets:127 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:56264 (54.9 KiB) TX bytes:11878 (11.5 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1020 (1020.0 B) TX bytes:1020 (1020.0 B)
$ ping 172.16.199.70
PING 172.16.199.70 (172.16.199.70): 56 data bytes
64 bytes from 172.16.199.70: seq=0 ttl=64 time=11.517 ms
64 bytes from 172.16.199.70: seq=1 ttl=64 time=1.633 ms
64 bytes from 172.16.199.70: seq=2 ttl=64 time=1.387 ms
--- 172.16.199.70 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 1.387/4.845/11.517 ms
$ sudo ifconfig eth0 172.16.199.70 netmask 255.255.255.0 up
$ ifconfig
eth0 Link encap:Ethernet HWaddr FA:16:3E:12:F3:D9
inet addr:172.16.199.70 Bcast:172.16.199.255 Mask:255.255.255.0
inet6 addr: fe80::f816:3eff:fe12:f3d9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3368 (3.2 KiB) TX bytes:1750 (1.7 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1020 (1020.0 B) TX bytes:1020 (1020.0 B)
$ ping 172.16.199.60
PING 172.16.199.60 (172.16.199.60): 56 data bytes
64 bytes from 172.16.199.60: seq=0 ttl=64 time=12.311 ms
64 bytes from 172.16.199.60: seq=1 ttl=64 time=2.079 ms
64 bytes from 172.16.199.60: seq=2 ttl=64 time=1.782 ms
--- 172.16.199.60 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 1.782/5.390/12.311 ms
ServerA要与ServerB能够相互通信,它的数据包就必须要走br-ens38,通过br-ens38到物理网卡ens38,再到对方的ens38物理网卡,逐层传递直到虚拟机。
为了简洁表示,上面省去了tab、qvb与qvo
Neutron-Server提供一个api接口负责接收其他组件发来的请求
Core Plugins主要负责二层交换
Service Plugins主要负责三层路由,二者大部分都是和数据库通讯
Plugins将和数据库通讯以后的数据做一层封装写入到缓存MQ队列
L2 agent负责二层交换的服务
L3 agent负责三层路由的服务
DHCP agent负责自动获取网络地址的服务
上面的网络是一个二层结构,没有通过路由器,在neutron中是由neutron-plugin里的l2来管理的
ml2插件是通过对接下面的驱动来实现各种网络虚拟化功能的
它的配置文件在/etc/neutron/plugins/ml2/ml2_conf.ini
云主机通过DHCP获取地址的过程
1.nova-compute向Neutron Server 发送一个请求虚拟机IP地址的请求
2.Neutron Server为虚拟机创建MAC地址和IP地址,将此信息存储到数据库当中
3.Neutron Server同时将这个信息异步发送给DHCP agent
4.DHCP agent收到对应信息以后再发送给dnsmasq,后者将它保存起来
5.nova创建虚拟机以后会初始化MAC地址
6.当虚拟机启动的时候,默认的ip地址是0.0.0.0,会发送一个广播,dnsmasq会监听到虚拟机发送的报文,对应的将对应MAC地址的IP地址返回给虚拟机,这样虚拟机启动完成以后就会有IP地址
这里提前讲了L3 agent,下节讲vlan网络
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。