Ubuntu16手动安装OpenStack——vxlan网络

文章目录
  1. 1. 目标
  2. 2. 网络模式
    1. 2.1. Flat
    2. 2.2. FlatDHCP
    3. 2.3. VLAN
    4. 2.4. GRE
    5. 2.5. VxLAN
  3. 3. VxLAN配置
    1. 3.1. root用户
    2. 3.2. 控制节点
    3. 3.3. 网络节点
    4. 3.4. 计算节点
  4. 4. 使用
    1. 4.1. 清除flat网络
    2. 4.2. 创建vxlan网络
    3. 4.3. 授权网络
    4. 4.4. 使用vxlan网络

目标

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

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

网络模式

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

Flat

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

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

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

FlatDHCP

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

VLAN

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

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

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

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

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

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。

VxLAN

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

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

VxLAN配置

root用户

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

控制节点

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

网络节点

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

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

计算节点

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

使用

清除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

创建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控制台看到的网络拓扑如下:

授权网络

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

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

使用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内部网络。