一个计算机技术爱好者与学习者

0%

好好学OpenStack:Ubuntu16手动安装OpenStack——vxlan网络

1. 目标

完成了《Ubuntu16手动安装OpenStack——swift篇》,openstack的核心组件就全部安装好了。

之前的配置中,使用了简单的flatdhcp网络模式配置。本文,我们来把网络模式修改为vxlan,主要参考OpenStack Queens : Neutron Network (VXLAN)

2. 网络模式

参考OpenStack 网络:Neutron 初探深入理解 Neutron – OpenStack 网络实现,openstack的网络模式可以分为五种,分别是Flat、FlatDHCP、VLAN、GRE和VxLAN。

2.1. Flat

Flat模式使用一个网桥实现OpenStack的网络,由于所有虚拟机都属于同一个网段,所以称之为扁平化flat。缺点是虚拟机的IP需要手动注入,而且只支持linux操作系统。
Flat 网络拓扑

在 Flat 模式下工作流程如下:

(1)为所有租户创建一个 IP 池
(2)创建租户
(3)租户创建虚拟机,为虚拟机分配 IP 池中的可用 IP

2.2. FlatDHCP

FlatDHCP 与 Flat 的不同在于有一个 DHCP 进程,虚拟机启动时会发送 dhcpdiscover 以获取 IP 地址。

2.3. VLAN

VLAN(Virtual Local Area Network)的中文名为”虚拟局域网”。VLAN 是一种将局域网设备从逻辑上划分成一个个网段,从而实现虚拟工作组的新兴数据交换技术。

在 VLAN 模式下工作流程如下:

(1)创建新的租户,并记下租户的标识
(2)为该租户创建独占的私有IP段
(3)租户创建虚拟机,从租户的私有IP段内分配IP给虚拟机

与 Flat 模式相比,VLAN 模式为网络增加了:将网络与租户关联和为网络分配一个 VLAN 号。

更多内容参考Neutron Vlan Network 原理- 每天5分钟玩转 OpenStack(92)

2.4. GRE

GRE(General Routing Encapsulation)是点对点的IP隧道技术,可以用于虚拟网络互连。GRE和VLAN相比,最大的不同在于VLAN的tag转换方式。

在VLAN模式下,虚拟机集群内部网络与外部网络通信时,内部网络的int-VLAN:tag会转换为外部网络的ex-VLAN:tag;外部网络与虚拟机内部网络通信时,外部网络的ex-VLAN:tag会转换为内部网络的int-VLAN:tag。

而GRE模式下,虚拟机集群内部网络与外部网络通信时,内部网络的int-VLAN:tag会转换为外部网络的tunnul:tag;外部网络与虚拟机内部网络通信时,外部网络的tunnel:tag会转换为内部网络的int-VLAN:tag。

2.5. VxLAN

VxLAN(Virtual Extensible LAN)一般认为是 VLAN 技术的延伸或替代者。相较于采用物理VLAN实现的网络虚拟化,VxLAN是UDP隧道,可以穿越IP网络,使得两个VLAN可以实现二层联通,并且突破4095的VLAN ID限制,提供多达1600万的虚拟网络容量。

VxLAN 模式下,网络的架构跟 GRE 模式类似,所不同的是,不同节点之间通过 VxLAN 隧道互通,即虚拟化层是采用的 VxLAN 协议。

3. VxLAN配置

3.1. root用户

为了避免权限问题,建议切换到root用户进行操作(否则要加很多sudo)。
sudo -i

3.2. 控制节点

1、vi /etc/neutron/plugins/ml2/ml2_conf.ini,如下修改:

1
2
3
4
5
6
7
8
# line 130: add a value to tenant_network_types
tenant_network_types = vxlan
# line 181: add
[ml2_type_flat]
flat_networks = physnet1
# line 235: add
[ml2_type_vxlan]
vni_ranges = 1:1000

2、重启neutron-server
systemctl restart neutron-server

3.3. 网络节点

这里我们的网络节点和控制节点是同一个节点。

1、vi /etc/neutron/plugins/ml2/ml2_conf.ini,如下修改:

1
2
3
4
5
6
7
8
# line 130: add a value to tenant_network_types
tenant_network_types = vxlan
# line 181: add
[ml2_type_flat]
flat_networks = physnet1
# line 235: add
[ml2_type_vxlan]
vni_ranges = 1:1000

2、vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini,如下修改:

1
2
3
4
5
6
7
8
9
10
# line 118: add
[agent]
prevent_arp_spoofing = True
# line 147: add
[linux_bridge]
physical_interface_mappings = physnet1:eth2
# line 201: add
[vxlan]
enable_vxlan = True
l2_population = True

3、vi /etc/neutron/dhcp_agent.ini,如下修改:

1
2
# line 63: add
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf

4、vi /etc/neutron/dnsmasq-neutron.conf,新建dnsmasq-neutron.conf内容如下:

1
2
# create new
dhcp-option-force=26,1450

5、重启服务

1
2
3
for service in l3-agent dhcp-agent metadata-agent linuxbridge-agent; do
systemctl restart neutron-$service
done

3.4. 计算节点

1、vi /etc/neutron/plugins/ml2/ml2_conf.ini,如下修改:

1
2
3
4
5
6
7
8
# line 130: add a value to tenant_network_types
tenant_network_types = vxlan
# line 181: add
[ml2_type_flat]
flat_networks = physnet1
# line 235: add
[ml2_type_vxlan]
vni_ranges = 1:1000

2、vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini,如下修改:

1
2
3
4
5
6
7
# line 118: add
[agent]
prevent_arp_spoofing = True
# line 201: add
[vxlan]
enable_vxlan = True
l2_population = True

3、重启neutron-linuxbridge-agent
systemctl restart neutron-linuxbridge-agent

4. 使用

4.1. 清除flat网络

《Ubuntu16手动安装OpenStack——创建实例》一文中,已经使用flat网络创建了sharednet1,并在网络中创建了一个实例cirros0。在使用新的网络之前,删除它们。
1、使admin环境生效
. admin-openrc

2、查看实例
openstack server list

3、删除实例
openstack server delete cirros0

4、查看网络
openstack network list

5、删除sharednet1
openstack network delete sharednet1

4.2. 创建vxlan网络

在控制节点测试使用vxlan,实际上可以在任意节点使用。

1、使admin环境生效
. admin-openrc

2、创建路由router01
openstack router create router01

3、创建内部网络int_net
openstack network create int_net --provider-network-type vxlan

4、在内部网络中创建子网

1
2
3
openstack subnet create subnet1 --network int_net \
--subnet-range 192.168.100.0/24 --gateway 192.168.100.1 \
--dns-nameserver 10.0.0.10

5、把内部网络int_net连接到路由router01上
openstack router add subnet router01 subnet1

6、创建外部网络ext_net

1
2
3
openstack network create \
--provider-physical-network physnet1 \
--provider-network-type flat --external ext_net

7、在外部网络中创建子网subnet2

1
2
3
4
openstack subnet create subnet2 \
--network ext_net --subnet-range 10.0.0.0/24 \
--allocation-pool start=10.0.0.200,end=10.0.0.254 \
--gateway 10.0.0.1 --dns-nameserver 10.0.0.10 --no-dhcp

8、把ext_net的网关设置为router01
openstack router set router01 --external-gateway ext_net

此时,在horizon控制台看到的网络拓扑如下:

4.3. 授权网络

默认情况下,所有项目都可以访问到外部网络,但对于内部网络,只有管理项目可以访问它。因此需要对其他项目进行授权,使项目中的用户可以使用内部网络。

1、查看rbac网络
openstack network rbac list

2、查看rbac网络细节
openstack network rbac show a5c4db79-f467-4b58-892b-b9cc56c3e317

3、查看网络
openstack network list

4、查看项目
openstack project list

5、授权int_net给siat项目,权限为access_as_shared

1
2
3
netID=$(openstack network list | grep int_net | awk '{ print $2 }') 
prjID=$(openstack project list | grep siat | awk '{ print $2 }')
openstack network rbac create --target-project $prjID --type network --action access_as_shared $netID

4.4. 使用vxlan网络

1、切换到siat项目的voidking用户环境
. voidkingrc

2、查看实例模板、镜像、网络

1
2
3
openstack flavor list
openstack image list
openstack network list

3、安全组和密钥使用《Ubuntu16手动安装OpenStack——创建实例》一文中创建的secgroup01和vkkey。

4、创建实例

1
2
netID=$(openstack network list | grep int_net | awk '{ print $2 }') 
openstack server create --flavor m1.tiny --image cirros --security-group secgroup01 --nic net-id=$netID --key-name vkkey cirros1

5、查看实例
openstack server list

6、给实例添加浮动IP

1
2
openstack floating ip create ext_net
openstack server add floating ip cirros1 10.0.0.201

7、查看浮动IP
openstack floating ip show 10.0.0.201

8、再次查看实例
openstack server list

可以发现,cirros1已经有了两个IP地址。

9、测试连通

1
2
ping 10.0.0.201
ssh cirros@10.0.0.201

顺利登录,nice。

PS:ping 192.168.100.6是不通的,因为那是openstack内部网络。