ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

00 Packstack部署 Open Stack

零、packstack部署

参考链接:https://blog.51cto.com/u_14210294/2385696

节点规划:

  • controller 内存>4G

  • network 内存>2G

  • compute 内存>6G

内存不能低于以上配置,否则安装步骤可能会卡住。

网络规划:

  • eth0 ((NAT网络) 10.211.55.0/24 management管理网+API网络,需要配置IP
  • eth1 (HOST网络) 10.37.129.0/24 外部网络(provider网络:flat、vlan),不配置IP
  • eth2 (HOST网络) 10.37.132.0/24 隧道网络(data网络、vm网络),需要配置IP

网卡配置:如果是DHCP转换为静态配置

eth1网卡作为外部网络的网卡,虚拟化时,可以采用HOST网络或NAT网络,如果是NAT网络,可以实现虚机访问外网。即虚机能否上外网,取决于外部网络的网卡能否上外网。

时间同步、防火墙、selinux、hosts文件、packstack免密登录。

[root@controller ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.211.55.68 controller controller.localdomain
10.211.55.69 network network.localdomain
10.211.55.70 compute01 compute01.localdomain
10.211.55.71 compute02 compute02.localdomain
#所有节点配置类似:
[root@compute02 network-scripts]# cat ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
#UUID=8b13e7d9-4b18-4d9c-b68e-c1cf1d156b62
DEVICE=eth0
ONBOOT=yes
IPADDR=10.211.55.71
NETMASK=255.255.255.0
GATEWAY=10.211.55.1
DNS1=114.114.114.114

[root@compute02 network-scripts]# cat ifcfg-eth1  #不配置IP
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth1
DEVICE=eth1
ONBOOT=yes

[root@compute02 network-scripts]# cat ifcfg-eth2
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth2
DEVICE=eth2
ONBOOT=yes
IPADDR=10.37.132.8
NETMASK=255.255.255.0
systemctl stop NetworkManager
systemctl disable NetworkManager
cat > /etc/yum.repos.d/openstack-rocky.repo <<EOF
[openstack]
name=opentack
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
gpgcheck=0

[Virt]
name=CentOS-$releasever - Base
baseurl=https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
yum -y install openstack-packstack

#生成应答文件
packstack --gen-answer-file=openstack.answer

#修改应答文件openstack.answer
CONFIG_COMPUTE_HOSTS=10.211.55.70,10.211.55.71	#第97行需要更改计算节点的IP地址
CONFIG_NETWORK_HOSTS=10.211.55.69	#第101行 需要更改网络节点的IP地址'
# 禁用如下服务
CONFIG_SWIFT_INSTALL=n
CONFIG_CEILOMETER_INSTALL=n
CONFIG_AODH_INSTALL=n
CONFIG_RH_OPTIONAL=n
CONFIG_HEAT_CFN_INSTALL=n
CONFIG_PROVISION_DEMO=n

CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS=openvswitch,l2population #默认值为openvswitch
sed -i -r 's/(.+_PW)=.+/\1=111111/' openstack.answer	#密码是随机的,这里统一配置成111111

[root@controller ~]# diff openstack.answer openstack.answer.origin
41c41
< CONFIG_SWIFT_INSTALL=n
---
> CONFIG_SWIFT_INSTALL=y
46c46
< CONFIG_CEILOMETER_INSTALL=n
---
> CONFIG_CEILOMETER_INSTALL=y
50c50
< CONFIG_AODH_INSTALL=n
---
> CONFIG_AODH_INSTALL=y
97c97
< CONFIG_COMPUTE_HOSTS=10.211.55.70,10.211.55.71
---
> CONFIG_COMPUTE_HOSTS=10.211.55.68
101c101
< CONFIG_NETWORK_HOSTS=10.211.55.69
---
> CONFIG_NETWORK_HOSTS=10.211.55.68
173c173
< CONFIG_RH_OPTIONAL=n
---
> CONFIG_RH_OPTIONAL=y
812c812
< CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS=openvswitch,l2population
---
> CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS=openvswitch
1172c1172
< CONFIG_HEAT_CFN_INSTALL=n
---
> CONFIG_HEAT_CFN_INSTALL=y
1185c1185
< CONFIG_PROVISION_DEMO=n
---
> CONFIG_PROVISION_DEMO=y

修改密码部分省略

其他配置解释:

CONFIG_NEUTRON_ML2_TYPE_DRIVERS=vxlan,flat,vlan
CONFIG_NEUTRON_ML2_TENANT_NETWORK_TYPES=vxlan
CONFIG_NEUTRON_ML2_MECHANISM_DRIVERS=openvswitch,l2population
CONFIG_NEUTRON_ML2_VNI_RANGES=10:100   #租户网络VNI(vxlan id)

CONFIG_NEUTRON_L2_AGENT=openvswitch  #可选值:'linuxbridge', 'openvswitch', 'ovn'
CONFIG_NEUTRON_ML2_FLAT_NETWORKS=physnet1	#第817行,FLAT类型的物理网络名称
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS=physnet1:br-ex #第862行,配置物理网络使用的ovs桥。<physical_network>:<ovs_bridge>
CONFIG_NEUTRON_OVS_BRIDGE_IFACES=br-ex:eth0	#第873行,配置要桥接到br-ex的网卡,要配置成外部网络的网卡
#安装
[root@controller ~]# packstack --answer-file=openstack.answer
Welcome to the Packstack setup utility

The installation log file is available at: /var/tmp/packstack/20210713-084943-iAV5ph/openstack-setup.log

Installing:
Clean Up                                             [ DONE ]
Discovering ip protocol version                      [ DONE ]
Setting up ssh keys                                  [ DONE ]
Preparing servers                                    [ DONE ]
Pre installing Puppet and discovering hosts' details [ DONE ]
Preparing pre-install entries                        [ DONE ]
Setting up CACERT                                    [ DONE ]
Preparing AMQP entries                               [ DONE ]
Preparing MariaDB entries                            [ DONE ]
Fixing Keystone LDAP config parameters to be undef if empty[ DONE ]
Preparing Keystone entries                           [ DONE ]
Preparing Glance entries                             [ DONE ]
Checking if the Cinder server has a cinder-volumes vg[ DONE ]
Preparing Cinder entries                             [ DONE ]
Preparing Nova API entries                           [ DONE ]
Creating ssh keys for Nova migration                 [ DONE ]
Gathering ssh host keys for Nova migration           [ DONE ]
Preparing Nova Compute entries                       [ DONE ]
Preparing Nova Scheduler entries                     [ DONE ]
Preparing Nova VNC Proxy entries                     [ DONE ]
Preparing OpenStack Network-related Nova entries     [ DONE ]
Preparing Nova Common entries                        [ DONE ]
Preparing Neutron LBaaS Agent entries                [ DONE ]
Preparing Neutron API entries                        [ DONE ]
Preparing Neutron L3 entries                         [ DONE ]
Preparing Neutron L2 Agent entries                   [ DONE ]
Preparing Neutron DHCP Agent entries                 [ DONE ]
Preparing Neutron Metering Agent entries             [ DONE ]
Checking if NetworkManager is enabled and running    [ DONE ]
Preparing OpenStack Client entries                   [ DONE ]
Preparing Horizon entries                            [ DONE ]
Preparing Puppet manifests                           [ DONE ]
Copying Puppet modules and manifests                 [ DONE ]
Applying 10.37.129.16_controller.pp
10.37.129.16_controller.pp:                          [ DONE ]
Applying 10.37.129.17_network.pp
10.37.129.17_network.pp:                             [ DONE ]
Applying 10.37.129.18_compute.pp
Applying 10.37.129.19_compute.pp
10.37.129.18_compute.pp:                             [ DONE ]
10.37.129.19_compute.pp:                             [ DONE ]
Applying Puppet manifests                            [ DONE ]
Finalizing                                           [ DONE ]

 **** Installation completed successfully ******

Additional information:
 * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.
 * File /root/keystonerc_admin has been created on OpenStack client host 10.37.129.16. To use the command line tools you need to source the file.
 * To access the OpenStack Dashboard browse to http://10.37.129.16/dashboard .
Please, find your login credentials stored in the keystonerc_admin in your home directory.
 * The installation log file is available at: /var/tmp/packstack/20210713-084943-iAV5ph/openstack-setup.log
 * The generated manifests are available at: /var/tmp/packstack/20210713-084943-iAV5ph/manifests

创建问题

1、报错:facter: error while loading shared libraries: leatherman_curl.so.1.3.0 解决方式

查看相关服务

查看节点
# openstack compute service list
# openstack hypervisor list
# openstack compute agent list
# openstack host list

查看各种agnet:L3 agent、DHCP agent、Open vSwitch agent、Metadata agent
# openstack network agent list


查看已经注册到keystone中的endpoints
# openstack endpoint list
# openstack catalog list

# openstack region list
# openstack domain list

查看cinder相关的服务
# openstack volume service list

horizon访问

http://10.211.55.68/dashboard/ admin/111111

参考:

https://blog.csdn.net/CN_TangZheng/article/details/104543185

一、网络介绍

一、什么是外部网络与内部网络?

外部网络:不一定是internet网络,也可能数据中心网络intranet,一般将Provider网络设置为“外部网络”,fip在此分配。

外部网络和Provide网络是2个不同的划分维度(外部网络与内部网络、Provider网络与租户网络)。只是一般情况下,Provider网络就是使用的外部网络,要设置“外部网络”的属性。

二、Provider网络与租户网络

  • Provider网络(物理网络)

1、由管理员创建(因为Provider网络需要借助数据中心的物理网络才能实现,而普通的云终端租户无法接触到数据中心物理网络。)

2、**不存在租户私网,没有L3路由和FloatingIP。**在 Provider中,仅实现了二层网络的虚拟化,三层以上的功能不被虚拟化,而是借助物理网络设备来实现。

在 Provider网络中,由于二层网络直接接入物理设备,二层网络之间的通信也由物理设备进行转发,因此 Provider网络在实现过程中无须L3服务,控制节点只需部署APIServer、ML2 核心插件及 DHCP 和 Linux bridging 代理即可。计算节点中的实例通过虚拟二层交换机直接接人物理网络,因此计算节点只需部署如 Open vSwitch 或Linux bridging等代理软件即可。

3、**仅支持Flat网络和VLAN网络类型。**VLAN类型的Provider网络在创建时需要指定具体的物理网络VLAN ID,因为实例直接接人 VLAN 物理网络,因此从网络拓扑层面看,虚拟机就如同在 VLAN 网络中的物理机一样,都是通过VLAN ID 来进行网络隔离和通信,并且不存在如 GRE 或VxLAN 这样的 Overlay网络。

Provider网络拓扑架构很简单,只需在控制节点和计算节点中分别规划一块物理网卡,并将其接入物理网络即可。如果采用的是VLAN 网络,并将该网络作为Provider网络与其他类型租户私有网络搭配使用,则将物理交换机连接的交换机接口配置为Trunk模式,节点只需一块物理网卡便可通过多个VLAN ID来实现不同网络的隔离。**如果采用的是VLAN 网络,且直接分配Provider网络给虚机使用,则将物理交换机连接的交换机接口配置为Access模式。**如果采用的是Flat网络,由于Flat网络没有Tagging,如要配置多个Flat网络则需要节点提供同样数量的物理网卡。

Provider网络的IP一般作为floating IP绑定到租户虚机的fixed IP上,也可以直接分配给租户虚机作为fixed IP使用。

  • 租户私有网络

1、创建租户网络之前必须先由云管理员创建Provider网络,,否则无法与外部网络通信。

2、普通用户可以创建和管理

3、租户不同子网之间通过L3路由进行转发,租户私网与外部网络之间也通过L3路由进行转发

4、Self-Service网络的L3层功能采用虚拟技术来实现

5、除了Flat和VLAN网络,Self-Service还支持GRE和VxLAN等Overlay形式的租户网络隔离方式。

Provider网络和租户网络通过qrouter分隔,qrouter一侧是Provider网络(设置了“外部网络”属性),另一侧是租户网络。

对于vlan网络而言,即可以用于租户网络,也可以用于Provide网络。 vlan类型的租户网络体现在br-int桥的不同的内部VLAN ID;vlan类型的Provider网络,体现在br-ex桥的外部VLAN ID。

目前最主流的搭配方式:vxlan网络(租户)+vlan网络(Provider)。当然可以使用下面的方式任意组合:租户网络(flat、vlan、vxlan、gre)+ Provider网络(flat、vlan)。比如租户网络+Provider网络的组合:flat+flat、vlan+flat、vxlan+flat、flat+vlan、vlan+vlan、vxlan+vlan、……

无论哪种组合,其拓扑都是类似的:南北向和东西向流量走不同的ovs桥,南北向流量使用br-ex桥,东西向流量使用br-eth1桥(flat、vlan)或br-tun桥(vxlan、gre),然后这2类ovs桥连接至交换机。如果provider网络是vlan网络,南北向流量和东西向流量的桥可以连接同一个交换机的不同VLAN;如果provider网络是flat网络,因其没有隔离作用,所以南北向流量和东西向流量的桥需要连接至不同的交换机。

此外,无论哪种组合,br-int上都会打上内部vlan ID。需要注意的是:对于同一个network,在不同计算节点上br-int桥上的内部VLAN ID可能不一致。而对于br-ex、br-eth1或br-tun桥而言,如果是flat网络,则没有任何Tag;如果是vlan网络,则会打上VLAN tag;如果是vxlan隧道网络,则打上vxlan tag。

通用的拓扑:

image-20220312203330513

综上所述,OpenStack在设计东西向和南北向流量时,遵循了一定的规则,以下以ovs桥进行说明:

1、南北向和东西向流量分别使用不同的网桥,走不同的路线,例如南北向是br-ex,东西向是br-eth1/br-tun。

2、使用两层ovs桥:虚机流量先进入到第1层的br-int桥,然后再进入第2层的br-ex或br-eth1/br-tun。

3、br-int桥中port会打上内部的VLAN tag(无论是哪种网络)用于隔离当前节点上不同network的流量,第2层的ovs桥根据网络类型进行决定是否打tag(flat、vlan、vxlan、gre)。

4、同一个network的ovs的port,在不同计算节点上br-int桥上的内部VLAN ID可能不一致(不一致的原因是因为vlan ID只有4096个,不能为所有的network分配全局统一的VLAN ID)。

5、OpenStack中定义的网络分为2类:租户侧网络、Provider网络。两者中间使用qrouter关联。qourter–>br-ex–>eth2,qouter这一侧的网络属于外部网络,另一侧属于租户网络。

6、租户网络类型主要有flat、vlan、vxlan、gre等,Provider网络的类型主要有flat、vlan。租户网络4选1与Provider网络2选1进行组合使用,组合有:flat+flat、vlan+flat、vxlan+flat、gre+flat、flat+vlan、vlan+vlan、vxlan+vlan、gre+vlan……

二、local网络

ovs机制驱动:

  • local network不会与宿主机的任何物理网卡连接,流量只被限制在宿主机内,同时也不关联任何的外部VLAN ID。
  • 虽然不同的local network共用一个ovs桥(br-int),但是不同的local network通过内部vlanID实现隔离。所以local网络中不同网络不互通。
  • 因为ovs桥没有与物理网卡连接,所以instance无法与宿主机之外的网络通信。

local网络ovs机制

Linuxbridge机制驱动:

  • Local Network的特点是不会与宿主机的任何物理网卡相连,也不关联任何的外部VLAN ID.
  • 对于每个local netwrok, ML2 linux-bridge 会创建一个bridge, instance的tap设备会连接到bridge。 位于同一个local network的instance会连接到相同的bridge, 这样instance 之间就可以通信了。
  • 因为bridge没有与物理网卡连接,所以instance无法与宿主机之外的网络通信。
  • 同时因为每个local network有自己的bridge, bridge之间是没有连通的,所以两个local network之间也不能通信,即使它们位于同一宿主机上。

linuxbridge机制驱动

三、flat网络

0、概述

flat network(扁平网络)是不带tag 的网络,宿主机的物理网卡通过ovs网桥直接与flat network连接,每个flat network二层网络(ovs桥)都会占用一个物理网卡。如果要创建多个flat网络,就需要准备多个物理网卡。

flat网络的特点:

  • flat网络,没有使用任何网络隔离技术,大二层互通(network是二层的,flat网络二层上与物理网络直接互通)。flat网络内的虚机与真实物理网络内的虚机处于同一个二层网络(可以是不同的子网,即不同的三层网络)。

  • 被ovs网桥占用的物理网卡不能配置IP,作为ovs桥的上联端口使用(二层设备),如下图的eth1。

  • 因为flat网络需要与物理网卡一一对应,所以租户网络一般不会采用flat网络。

  • br-int上会打上内部的VLAN TAG,br-eth1上没有VLAN TAG。

  • flat类型的网络只能由管理员在管理权限下创建,管理员在项目权限或非管理员都无法创建,即flat网络只能创建成为Provider网络。

flat与vlan网络的区别:

  • flat网络,没有使用任何网络隔离技术,大二层互通。

  • vlan网络,基于vlan实现的虚拟网络。同一个物理网络中的多个vlan网络是相互隔离的,因此支持多租户这种应用场景。

flat网络最佳实践:

配置为flat Porvider网络:使用管理员创建,设置为外部网络(可选),只创建1个子网,且子网的cidr与真实的物理网络的cidr相同。然后将该网络的IP直接分配给租户虚机。

image-20211210153208056

多个flat网络的情形: 使用不同的物理网卡

image-20220310202519175

1、修改配置文件

控制节点:

#控制节点:/etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers=flat
tenant_network_types=flat  #如果要使用普通用户创建flat网络,此处必须指定为flat。管理员创建时,该配置无效,在创建时手动指定网络类型配置
mechanism_drivers=openvswitch,l2population
[ml2_type_flat]
flat_networks=*    #或flat_networks=flat1  定义flat网络(物理网络)的label。如果要创建多个flat网络,需要定义多个label, 用逗号隔开,当然此时也需要用到多个ovs bridge,例如"flat1,flat2"

完整配置:
[root@controller ~(keystone_admin)]# egrep -v '^$|^#' /etc/neutron/plugins/ml2/ml2_conf.ini
[DEFAULT]
[l2pop]
[ml2]
type_drivers=flat
tenant_network_types=flat
mechanism_drivers=openvswitch,l2population
extension_drivers=port_security,qos
path_mtu=0
[ml2_type_flat]
flat_networks=*    #或flat_networks=flat1。  
[ml2_type_geneve]
[ml2_type_gre]
[ml2_type_vlan]
[ml2_type_vxlan]
vni_ranges=10:100
vxlan_group=224.0.0.1
[securitygroup]
firewall_driver=neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group=True

#重启
[root@controller nova(keystone_admin)]# systemctl restart neutron-server

计算节点、网络节点:

# 计算节点、网络节点:/etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
bridge_mappings=flat1:br-eth1 #该配置同时适应于falt网络和vlan网络。将flat(或VLAN)网络名称(Label)映射到要用于flat(或VLAN)网络的当前agent节点特定的ovs网桥名称。此处,br-eth1桥使用物理网卡eth1。格式<physical_network>:<bridge>,如果是多个,多个值逗号分隔,例如“flat1:br-eth1,extnet:br-ex”。与linux bridge实现的flat网络不同,ml2中并不会直接指定label与物理网卡的对应关系,而是指定label与ovs bridge的对应关系。

完整配置:
[root@network ~]# egrep -v '^$|^#' /etc/neutron/plugins/ml2/openvswitch_agent.ini
[DEFAULT]
[agent]
tunnel_types=vxlan
vxlan_udp_port=4789
l2_population=True
drop_flows_on_start=False
[network_log]
[ovs]
integration_bridge=br-int
tunnel_bridge=br-tun
local_ip=10.211.55.69
bridge_mappings=flat1:br-eth1  
[securitygroup]
firewall_driver=neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[xenapi]

#计算节点和网络节点重启
systemctl restart neutron-openvswitch-agent

2、创建ovs桥:br-eth1

所有计算节点和网络节点

# ovs-vsctl add-br br-eth1
# ovs-vsctl add-port br-eth1 eth1
#查看配置结果
# ovs-vsctl show
08f718fb-d508-4890-8dd5-737ee9727ef9
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-tun
        Controller "tcp:127.0.0.1:6633"
        fail_mode: secure
        Port patch-int
            Interface patch-int
                type: patch
                options: {peer=patch-tun}
        Port br-tun
            Interface br-tun
                type: internal
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
        fail_mode: secure
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
    Bridge "br-eth1"
        Port "eth1"
            Interface "eth1"
        Port "br-eth1"
            Interface "br-eth1"
                type: internal
    ovs_version: "2.11.0"
    
[root@compute02 ~]# ip -d link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:1c:42:ef:c2:f0 brd ff:ff:ff:ff:ff:ff promiscuity 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UP mode DEFAULT group default qlen 1000
    link/ether 00:1c:42:72:a0:0b brd ff:ff:ff:ff:ff:ff promiscuity 1
    openvswitch_slave addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535  #openvswitch_slave
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:1c:42:e9:d7:6c brd ff:ff:ff:ff:ff:ff promiscuity 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
5: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether de:07:ae:6e:68:a0 brd ff:ff:ff:ff:ff:ff promiscuity 1
    openvswitch addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
6: br-tun: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 7a:c2:21:51:4b:4e brd ff:ff:ff:ff:ff:ff promiscuity 1
    openvswitch addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
7: br-int: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether ea:94:fd:ac:d1:45 brd ff:ff:ff:ff:ff:ff promiscuity 1
    openvswitch addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
8: br-eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:1c:42:72:a0:0b brd ff:ff:ff:ff:ff:ff promiscuity 1
    openvswitch addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535    #openvswitch
[root@network ~]# ovs-vsctl show
e389f847-7e44-4e41-bec2-3526884d4672
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
        Port br-int
            Interface br-int
                type: internal
        Port "int-br-eth1"  #自动添加
            Interface "int-br-eth1"
                type: patch
                options: {peer="phy-br-eth1"}

此时的网络结构:

image-20211210143655799

3、创建网络和子网

注意点:关于是否勾选“外部网络”?

勾选与否都不会影响flat网络的使用。如果不勾选,则无法用于分配floating IP。

对于租户网络为flat网络而言,一般其子网cidr与真实物理网络的cidr相同,是处于同一个二层网络并且在同一个子网中,虚机的fiexd IP可以直接与真实网络互通,无需使用Floating IP。

另一种情况是flat网络作为外部网络连入虚机router,此时就需要勾选“外部网络”,可以为虚机提供Floating IP。

注意:flat网络必须以管理员用户以管理员身份创建(“管理员” –> “网络”),普通用户创建、管理员用户在项目下创建都会报错。

“物理网络"如何取值:根据配置项bridge_mappings=flat1:br-eth1配置选择。此处为flat1。

image-20211210192202026

创建flat类型的子网时,cidr使用真实的物理网络的cidr,网关为真实的物理网络中网关,地址池为真实物理网络中的一段。

flat网络用作租户网络/Provider网络?

如果填写的不是真实的物理网络cidr(作为租户网络)或多个不同cidr的子网,则需要使用虚机路由器打通各个子网间通信,否则也不会进行跨子网互访。如果想访问外网,则需要再创建一个flat类型的Provider网络,作为qrouter的外部网关。此时,创建了个2个flat类型的网络,一个用作租户网络,一个用作Provider网络。(理论可行,未测试!)

image-20211210175942716

image-20211210182212198

说明:

1、子网地址池中的第1个IP会分给qdhcp名称空间下的网卡。如果不指定地址池,则使用cidr中所有的IP。

2、创建network时,qdhcp-xxx不会创建,创建第1个子网时,才会创建。之后创建第2、3…个子网时就不会再创建qdhcp了。所以网络和qdhcp是一对一的关系。一个qdhcp负责为整个二层网络分配地址。

创建完子网后,此时,会在网络节点上创建一个qdhcp名称空间,br-int桥上会创建一个port,该port是dhcp的tap设备。图如下:

image-20211210144944656

4、创建虚机vm1

使用管理员或普通用户都可以。

创建完vm1后:

[root@compute02 neutron]# brctl show
bridge name				bridge id					STP enabled			interfaces
qbr8200daaf-ad		8000.eeae40595fb9	no							qvb8200daaf-ad  #(qbr)
																										tap8200daaf-ad  #(dhcp)
																										
[root@compute02 neutron]# ovs-vsctl list-ports br-int
int-br-eth1
patch-tun
qvo8200daaf-ad																										

此时的网络结构如下:

image-20211210152809986

5、创建虚机vm2

因为计算节点上没有HDCP服务,所以没有相应的tap 设备。

此时,网络结构如下:

image-20211210153208056

注意:

测试之前,安全组要放通icmp。

openstack security group rule create –ingress –protocol icmp –remote-ip ‘0.0.0.0/0’ default

openstack security group rule create –ingress –protocol tcp –dst-port 22 –remote-ip ‘0.0.0.0/0’ default

vm1可以ping通vm2:

image-20220312104031193

物理也是可以ping通虚机:

image-20220312103451025

6、说明:关于flat租户网络

按理说,“flat租户网络+flat Provider网络”的组合是能跑的通的,(一个flat租户网络,也可以创建多个子网,子网不一定需要与物理网络具有相同是cidr,此时要借助qrouter打通不同的子网)。但是flat租户网络的模式一般只会在测试环境中使用,使用方式:创建一个Provider网络,cidr与真实的物理网络保持一致,然后直接为虚机分配flat Provider网络中的IP。

flat网络必须是管理员创建为Provider网络。普通用户创建报错,管理员创建租户网络也报错。

VLAN Provider网络

与flat网络结构类似,但vlan network是带tag 的网络。

特点:

  • 有独立的dhcp net namespace或使用物理网络的dhcp,用于dhcp分配
  • 使用物理网络的路由设备,实现路由功能
  • 虚机与外部网络的主机具体同等地位,类似桥接模式下,虚机和宿主机的地位。

实验前提:

物理交换机配置access口VLAN3004,连接宿主机;且在交换机配置VLAN的网关地址100.200.7.254。

# 三层交换机配置
R02-YW-41# configure terminal                                       #进入配置终端
R02-YW-41(config)# vlan 3004      																	#创建VLAN 3004

R02-YW-41(config)# interface fe0/1                 								 	#进入接口配置,该接口用于连接宿主机1
R02-YW-41(config-if)# switchport mode access        								#配置为access口(默认操作,可省略)
R02-YW-41(config-if)# switchport access vlan 3004   								#配置为VLANID为3004
								
R02-YW-41(config)# interface fe0/2                 								 	#进入接口配置,该接口用于连接宿主机2
R02-YW-41(config-if)# switchport mode access        								#配置为access口(默认操作,可省略)
R02-YW-41(config-if)# switchport access vlan 3004   								#配置为VLANID为3004

R02-YW-41(config)# interface vlan 3004    #创建一个vlan3004的虚拟接口,进入接口配置(此处不是虚拟子接口,是虚拟接口)
R02-YW-41(config-if)# ip address 100.200.7.254 255.255.252.0        #配置IP作为默认网关地址
R02-YW-41(config-if)# end                                           #退出配置终端

管理网网络vlan-3304,cidr:100.200.4.0/22 gw:100.200.7.254

步骤:

1、 创建network

openstack network create --provider-physical-network <physical_network_name>  --provider-network-type vlan --project <project> --provider-segment <provider-segment> --mtu 1500 <network_name>

示例:
openstack network create --provider-physical-network physnet1 --provider-network-type vlan --project inspurtest01 --provider-segment 3004 --mtu 1500 vlan-mgt

+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2022-05-19T01:40:47Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | cc14488a-c08f-4b14-9dbe-b519c6c7574c |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1500                                 |
| name                      | vlan-mgt                             |
| port_security_enabled     | True                                 |
| project_id                | 39c86602d08342a4abff1eeac37ff113     |
| provider:network_type     | vlan                                 |
| provider:physical_network | physnet1                             |
| provider:segmentation_id  | 3004                                 |
| qos_policy_id             | None                                 |
| revision_number           | 1                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| updated_at                | 2022-05-19T01:40:47Z                 |
+---------------------------+--------------------------------------+

说明:

  1. 配置<physical_network_name>,需要从配置文件中查询部署openstack时配置的物理网络的名称(一般是physnet1)
neutron@hci-001:/etc/neutron/plugins$ cat ml2/ml2_conf.ini
[ml2]
extension_drivers = port_security,qos
mechanism_drivers = l2population,openvswitch
path_mtu = 1550
physical_network_mtus = physnet1:1500,physnet2:1500
tenant_network_types = vxlan
type_drivers = flat,vlan,vxlan
[ml2_type_flat]
flat_networks = *
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:4000,physnet2:100:4000  #物理网络名称:physnet1
[ml2_type_vxlan]
vni_ranges = 2:5000
vxlan_group = 239.1.1.1
  1. <project>填写对应的project名称或者ID

  2. <provider-segment>填写该地址段的vlan号

2、创建subnet

openstack subnet create --subnet-range xxx.xxx.xxx.xxx/xx --gateway xxx.xxx.xxx.xxx --network <network_name> --project <project> <subnet_name>

示例:
openstack subnet create --subnet-range 100.200.4.0/22 --gateway 100.200.7.254  --dhcp --allocation-pool start=100.200.6.1,end=100.200.6.254 --network vlan-mgt --project inspurtest01 sub-vlan-mgt
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| allocation_pools  | 100.200.6.1-100.200.6.254            |
| cidr              | 100.200.4.0/22                       |
| created_at        | 2022-05-19T01:46:13Z                 |
| description       |                                      |
| dns_nameservers   |                                      |
| enable_dhcp       | True                                 |
| gateway_ip        | 100.200.7.254                        |
| host_routes       |                                      |
| id                | 5f4fb639-fb5a-4015-aa08-d6411f6086c8 |
| ip_version        | 4                                    |
| ipv6_address_mode | None                                 |
| ipv6_ra_mode      | None                                 |
| name              | sub-vlan-mgt                         |
| network_id        | cc14488a-c08f-4b14-9dbe-b519c6c7574c |
| project_id        | 39c86602d08342a4abff1eeac37ff113     |
| revision_number   | 0                                    |
| segment_id        | None                                 |
| service_types     |                                      |
| subnetpool_id     | None                                 |
| tags              |                                      |
| updated_at        | 2022-05-19T01:46:13Z                 |
+-------------------+--------------------------------------+

说明:

  1. subnet-range填写地址段,如100.200.4.0/22,该网段要与物理交换机上配置的网关的网段一致。

  2. gateway填写该地址段的网关(需要在物理机交换机上配置网关地址)

  3. <network_name>填写上一步创建的network名称或ID

  1. <project>填写对应的project名称或者ID

3、创建虚机,使用vlan网络

openstack server create --image cirros  --flavor m1.cirror  --network vlan-mgt vm1

此时的拓扑图如下:

image-20220312142418775

分析:

br-int桥:

    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        datapath_type: system
				.......
        Port tap7335a125-a4  #虚机
            tag: 11
            Interface tap7335a125-a4
				.......

br-eth1桥:

将内部VLAN11转换为外部的VLAN3004:

root@hci-001:~# ovs-ofctl dump-flows br-eth1|grep 3004
 cookie=0x8d631366d6c42724, duration=15832.978s, table=2, n_packets=109588, n_bytes=10752406, idle_age=64, priority=4,in_port=2,dl_vlan=11 actions=mod_vlan_vid:3004,NORMAL

物理交换机:

连接宿主机网卡的接口设置为Access口,VLAN ID为3004。

四、租户vlan网络+flat Provider网络

0、概述

vlan网络与flat网络结构类似,但vlan network是带tag 的网络。

在Open vSwitch实现方式下,不同vlan instance的虚拟网卡都接到br-int 上。这一点与Linux Bridge非常不同,Linux Bridge是不同vlan接到不同的网桥上。

在我们的实验环境中,收发vlan数据的物理网卡为eth1,上面可以走多个vlan, 所以物理交换机上与eth1(东西向流量使用的网卡)相连的port要设置成trunk 模式,而不是access 模式。

特点:

  • 结构图与flat网络类似,但是一个物理网卡可以配置多个VLAN类型的network,具有不同的VLAN ID。(flat类型只能配置1个network)。
  • 在br-int桥上,每个租户网络都会有不同的内部VLAN ID和DHCP。在br-ex桥上,每个租户网络都会有外部VLAN ID。注意:对于同一个vlan网络,比如VLAN100,在不同计算节点上br-int桥上的内部VLAN ID可能不一致,但br-ex桥上的外部VLAN ID是一致的,都是VLAN100。
  • 同一个网络上的不同子网间通信,必须借助于router,可以是物理router或者虚拟router。
  • 不同机制驱动的VLAN隔离实现方式不同:

Linux Bridge机制驱动实现的VLAN网络:

不同的vlan连接到不同的linux-bridge桥。

Linux Bridge机制驱动实现的VLAN网络

ovs机制驱动:

与Linux Bridge driver 不同,Open vSwitch driver 并不通过eth1.100、 eth1.101 等VLAN interface(网卡子接口)来隔离不同的VLAN。而是所有vlan的所有instance都连接到同一个网桥br-int, Open vSwitch通过flow rule (流规则)来指定如何对进出br-int 的数据进行转发。

ovs机制驱动实现的VLAN网络

上图中:vm1和vm2属于vlan100;vm3属于vlan101。他们都在同一个br-int桥上。

1、配置文件

试验:vlan网络(租户网络)+flat网络(Provider网络)

控制节点:

#控制节点:/etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers=vlan
tenant_network_types=vlan  #如果要使用普通用户创建vlan网络,此处必须指定为vlan。管理员创建时,该配置无效,在创建时手动指定网络类型
mechanism_drivers=openvswitch,l2population

[ml2_type_vlan]
network_vlan_ranges=vlan1:3001:4000

#重启
[root@controller nova(keystone_admin)]# systemctl restart neutron-server

网络节点、计算节点:

#网络节点、计算节点:/etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
bridge_mappings=vlan1:br-eth1  #指定vlan1网络对应的ovs桥br-eth1(vlan1网络在[ml2_type_vlan]中定义)

#计算节点和网络节点重启
systemctl restart neutron-openvswitch-agent

2、创建ovs桥:br-eth1

# 网络节点、计算节点:创建ovs桥
ovs-vsctl add-br br-eth1 
ovs-vsctl add-port br-eth1 eth1

3、创建网络、子网、虚机(租户)

省略,与flat网络类似。

image-20220312225957970

image-20220312230100001

经测试:vm1可以ping通vm3,但无法ping通vm2。即同子网内互通,跨子网不通。

此时的拓扑如下:

image-20220312142640920

4、vlan路由器

同一个网络上的不同子网间通信,必须借助于router,可以是物理router或者虚拟router。下图是通过虚拟路由器实现:

创建路由器,并添加2个子网的接口:

image-20220312230441815

经测试:vm1可以ping通vm2,即跨子网可以互通。

此时的拓扑图如下:

image-20220312142418775

5、vlan访问外网(flat类型)

通过router可以实现位于不同vlan的instance之间的通信。那instance如何与外部网络通信?这里的外部网络指的是租户网络以外的网络。租户网络是由Neutron创建和维护的网络。外部网络不由Neutron创建。如果是私有云,外部网络通常指的是公司intranet;如果是公有云,外部网络通常指的是internet。外部网络是已经存在的网络,一般都是flat网络或vlan网络。

5.1、配置文件

控制节点:

#控制节点:/etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers=vlan,flat  #添加flat网络
tenant_network_types=vlan  #如果要使用普通用户创建vlan网络,此处必须指定为vlan。管理员创建时,该配置无效,在创建时手动指定网络类型
mechanism_drivers=openvswitch,l2population

[ml2_type_flat]
flat_networks=extnet

#重启
[root@controller nova(keystone_admin)]# systemctl restart neutron-server

网络节点、计算节点:

#网络节点、计算节点:/etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
bridge_mappings=vlan1:br-eth1,extnet:br-ex  #添加extnet网络对应的ovs桥br-ex

#计算节点和网络节点重启
systemctl restart neutron-openvswitch-agent

5.2、创建ovs桥:br-ex

# 网络节点、计算节点:创建ovs桥
ovs-vsctl add-br br-ex 
ovs-vsctl add-port br-ex eth2

5.3、创建外部网络、子网(管理员)

image-20220312233051945

5.4、配置router的外部网关(租户)

image-20220312231432369

此时的拓扑图如下:

image-20220312142848785

说明:

1、br-eth1和eth1是租户vlan网络不通计算节点的东西向流量,br-ex和eth2是vlan网络的南北向流量。

2、(集中式路由)router连接qg-xx口,实际上是通过路线:router –> br-int –> br-ex –> qg口

5.5、分配Floating IP

image-20220312233318171

测试:外部网络可以ping通

image-20220312233410547

五、vxlan网络

概述

  • 隧道网卡需要配置IP

image-20211211114246263

配置文件

试验基于全新packstack部署的环境进行。

1、neutron-server配置核心插件

控制节点、网络节点、计算节点启用ML2核心插件

/etc/neutron/neutron.conf

	[DEFAULT]
	core_plugin=neutron.plugins.ml2.plugin.Ml2Plugin  #启用ML2核心插件
	service_plugins=qos,trunk,router,metering

2、控制节点配置ML2

控制节点:/etc/neutron/plugins/ml2/ml2_conf.ini(其他节点不存在该配置)

2.1、配置机制驱动

配置ML2使用openvswitch(或linuxbridge)机制驱动

说明:每个节点上的mechanism_drivers指明的是当前节点可以使用的机制驱动,可以指定多种驱动。

	[ml2]
	mechanism_drivers=openvswitch,l2population

2.2、配置类型驱动

	[ml2]
	type_drivers=vxlan,flat,vlan  #列表中要含有vxlan
	tenant_network_types=vxlan,flat

说明:

  • type_drivers:指定可以使用的类型驱动(告诉ML2去加载哪些type驱动),admin用户在创建网络时,可以从中选择。如果为*,表示任意名称
  • tenant_network_type:指定普通用户创建的网络类型。因为admin用户在创建网络时可以手动指定网络类型,而普通用户无法指定。该配置就是告诉ML2当普通用户创建网络时,默认创建哪种类型的网络。如果指定多个值,表示从前往后依次创建。当第1个网络无法创建时,则使用第2个网络类型进行创建,依次类推。

2.3、配置ml2类型驱动参数

配置ML2各种类型驱动的参数:

	[ml2_type_flat]
	flat_networks=falt1

	[ml2_type_vlan]
	network_vlan_ranges=vlan1:3001:4000

	[ml2_type_vxlan]
	vni_ranges=10:100      #配置vni范围
	vxlan_group=224.0.0.1

说明:

vni_ranges:定义了vxlan vni 的范围。这个范围是针对普通用户在自己的租户里创建vxlan network 的范围。因为普通用户创建network 时不能指定vni,Neutron 会按顺序自动从这个范围中取值。(对于admin用户没有vni范围的限制,在创建网络时可以指定1~16777216的任意值。)

3、配置agent参数

网络节点、计算节点

/etc/neutron/plugins/ml2/openvswitch_agent.ini
	[agent]
	tunnel_types=vxlan
	vxlan_udp_port=4789
	l2_population=True

	[ovs]
	integration_bridge=br-int
	tunnel_bridge=br-tun
	local_ip=10.37.132.6  					#local_ip指定当前节点的VTEP的IP地址。VTEP IP需要提前配置到节点的eth2上,Neutron并不会帮我们分配这个IP。

说明:

如果没有br-tun桥,则需要提前手动创建:ovs-vsctl add-br br-tun。

br-tun桥无需将eth2作为port,是通过VTEP的IP关联eth2网卡的,所有eth2网卡需要事先配置好IP。

此时的网络结构如下:

(该图中,eth1和eth2需要调换,即按照试验环境,eth2需要连入br-tun桥,而不是eth1)

image-20211211111734501

创建VXLAN网络和虚机

(管理员或普通用户,一般是普通用户创建租户网络)创建网络vxlan100和子网subnet_172_16_100_0,地址为172.16.100.0/24

image-20211211113746137

image-20211211113831018

image-20211211113920819

创建2台虚机连接到subnet_172_16_100_0:cirros-vm-1、cirros-vm-2

image-20211211113939687

虚机间可以ping通:

image-20211211114006317

当前的网络结构:

image-20211211114246263

vxlan数据包流表分析:

在网络vxlan100内,再创建第2个子网subnet_172_16_101_0,地址为172.16.101.0/24

image-20211211120517226

在该子网内创建2个虚机:cirros-vm-3、cirros-vm-4

image-20211211121511442

测试:不同子网,三层不通:

image-20211211121453580

但是二层是互通的:

image-20211211121643164

如果要实现不同子网三层互通,就需要通过使用router设备。

vxlan路由器

路由服务提供跨subnet互联互通的能力。

对于flat和vlan类型的网络,可以使用物理router或虚拟router。对于overlay网络,我们需要借助虚拟router实现路由功能。

创建路由:router1

image-20211211123438718

添加接口:将subnet_172_16_100_0和subnet_172_16_101_0两个子网的接口加入到router1

image-20211211123613918

image-20211211123659975

此时,两个子网都与router1连通。

image-20211211123848582

此时的网络结构:

(说明:下图使用的是vlan网络的图示,与vxlan稍有不同:br-eth1应为br-tun,eth1应配置IP)

vlan网络

image-20211211124152036

vxlan访问外网(FIP)

通过router可以实现位于不同子网的instance 之间的通信。

接下来要探讨的问题是instance 如何与外部网络通信。

这里的外部网络指的是租户网络以外的网络。租户网络是由Neutron创建和维护的网络。外部网络不由Neutron创建。如果是私有云,外部网络通常指的是公司intranet; 如果是公有云,外部网络通常指的是internet。

1、设置外部网络配置文件

为了连接外部网络,需要预先在配置文件中告诉Neutron 外部网络的类型以及对应的OpenvSwitch网桥。

外部网络是已经存在的物理网络,一般都是flat或者vlan类型。

在我们的网络环境中,外部网络是flat 类型。这里我们将外部网络的label 命名为“extnet”,网桥为br-ex。

[root@network ~]# egrep -v '^#|^$' /etc/neutron/plugins/ml2/openvswitch_agent.ini
[DEFAULT]
[agent]
tunnel_types=vxlan
vxlan_udp_port=4789
l2_population=True
drop_flows_on_start=False
[network_log]
[ovs]
integration_bridge=br-int
tunnel_bridge=br-tun
local_ip=10.211.55.69
bridge_mappings=extnet:br-ex  #外部网络label和对应的网桥(extnet可以flat网络或vlan网络,取决于物理网络使用哪种类型)
[securitygroup]
firewall_driver=neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[xenapi]

我们需要提前准备好br-ex, 将eth1 添加到br-ex:

[root@network ~]# ovs-vsctl add-br br-ex  #packstack安装的时候,br-ex桥已经创建,但是没有将eth2加入到该桥。所以本步骤省略,直接进行下一步
[root@network ~]# ovs-vsctl add-port br-ex eth1

对于传统的网络模式,该步骤只需要在network节点操作即可;

对于dvr模式,该步骤需要在network节点和所有的compute节点执行。

2、管理员身份创建外部网络(Flat网络)

其他创建细节参考flat网络创建

创建外部网络:external_net、子网:ext_subnet

image-20211211133906511

image-20211210193011114

image-20211210193308772

image-20211211134155677

3、设置router1的外部网关

即:将外网连接到router1虚拟路由器

image-20211211134656901

启用snat(只有设置为外部网络才能启用NAT功能,该网关IP会配置在该网络对应的snat名称空间下的qg口):

image-20211211134722363

此时的网络结构如下:

image-20211211134825234

(说明:)下图使用的是vlan网络的图示,与vxlan稍有不同:br-eth1应为br-tun,eth1应配置IP

vlan的网络结构

查看qrouter名称空间下的网卡:

[root@network ~]# ip net exec qrouter-85484a90-36d9-4bf0-8e81-f133bbc11aff ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
12: qr-b61b7e7f-7e: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:37:50:17 brd ff:ff:ff:ff:ff:ff
    inet 172.16.100.1/24 brd 172.16.100.255 scope global qr-b61b7e7f-7e
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe37:5017/64 scope link
       valid_lft forever preferred_lft forever
13: qr-814b98c1-9b: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:94:67:55 brd ff:ff:ff:ff:ff:ff
    inet 172.16.101.1/24 brd 172.16.101.255 scope global qr-814b98c1-9b
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe94:6755/64 scope link
       valid_lft forever preferred_lft forever
14: qg-ef38942f-39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:9c:72:f8 brd ff:ff:ff:ff:ff:ff
    inet 10.37.129.226/24 brd 10.37.129.255 scope global qg-ef38942f-39
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe9c:72f8/64 scope link
       valid_lft forever preferred_lft forever

router interface的命名规则如下:

  • 如果interface 用于连接租户网络,命名格式为qr-xxx
  • 如果interface 用于连接外部网络,命名格式为qg-xxx

此时,虚机就可以访问外网了,但是并不是使用的Floating IP:

image-20211211135539359

4、分配Floating IP

此时虚机能够访问外网,但是外网无法访问虚机,如果要实现访问虚机,可以通过Floating IP。

Open vSwitch driver环境中,floating IP的实现与Linux Bridge driver完全一样: 都是通过在router 提供网关的外网interface(qg-xxx)上配置iptables NAT规则实现。

分配FIP:

image-20211211135848278

关联FIP:

image-20211211135950128

可以发现虚机cirros-vm-3分配到了一个FIP:10.37.128.235

image-20211211140412382

测试:在真实的物理网络中访问虚机

[ Mac-mini:/Users/lijuzhang ]  ➜ ping 10.37.129.235 -c 2
PING 10.37.129.235 (10.37.129.235): 56 data bytes
64 bytes from 10.37.129.235: icmp_seq=0 ttl=63 time=1.320 ms
64 bytes from 10.37.129.235: icmp_seq=1 ttl=63 time=1.571 ms

--- 10.37.129.235 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.320/1.446/1.571/0.125 ms


[ Mac-mini:/Users/lijuzhang ]  ➜ ssh cirros@10.37.129.235
The authenticity of host '10.37.129.235 (10.37.129.235)' can't be established.
ECDSA key fingerprint is SHA256:bCeG2YwRilVZLsqKj6IloMjGg6gRRd7NyC+FTN4Q02Q.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.37.129.235' (ECDSA) to the list of known hosts.
cirros@10.37.129.235's password:
$
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
    link/ether fa:16:3e:e1:93:2a brd ff:ff:ff:ff:ff:ff
    inet 172.16.101.10/24 brd 172.16.101.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fee1:932a/64 scope link
       valid_lft forever preferred_lft forever

六、网络命令行配置

https://docs.openstack.org/neutron/latest/admin/deploy-ovs-provider.html

https://docs.openstack.org/neutron/rocky/admin/deploy-ovs-selfservice.html

创建provider网络及子网

用具有admin role的用户在Openstack Controller节点创建外网(external network)和相应子网,这里的外网是所谓的provider network,是不允许普通权限的租户创建的,普通的租户只能创建租户网络。

注意--router:external=true选项表示这是一个外网,网络类型选的是flat(如果外网是VLAN,就选VLAN),子网的CIDR是10.211.55.0/24。

[root@controller ~(keystone_admin)]# openstack network create --share --external --provider-physical-network physnet1 --provider-network-type flat provider1    #当--provider-network-type的值为flat时,--provider-physical-network指定值与配置文件flat_networks=physnet1的值一致。
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2021-08-08T11:01:54Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | 8d311349-6bb9-4e81-bfcc-e76986cae605 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1500                                 |
| name                      | provider1                            |
| port_security_enabled     | True                                 |
| project_id                | 6541d3fe95674ddfb577620c262c0367     |
| provider:network_type     | flat                                 |
| provider:physical_network | physnet1                             |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 2                                    |
| router:external           | External                             |
| segments                  | None                                 |
| shared                    | True                                 |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| updated_at                | 2021-08-08T11:01:54Z                 |
+---------------------------+--------------------------------------+


[root@controller ~(keystone_admin)]# openstack subnet create --network  provider1 --subnet-range 10.211.55.0/24 --allocation-pool start=10.211.55.200,end=10.211.55.250 fip-subnet
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| allocation_pools  | 10.37.129.200-10.37.129.254          |
| cidr              | 10.37.129.0/24                       |
| created_at        | 2021-08-08T11:03:10Z                 |
| description       |                                      |
| dns_nameservers   |                                      |
| enable_dhcp       | True                                 |
| gateway_ip        | 10.37.129.1                          |
| host_routes       |                                      |
| id                | 1e5aad39-a2d6-4fbe-bd32-4112dce5cee2 |
| ip_version        | 4                                    |
| ipv6_address_mode | None                                 |
| ipv6_ra_mode      | None                                 |
| name              | fip-subnet                           |
| network_id        | 8d311349-6bb9-4e81-bfcc-e76986cae605 |
| project_id        | 6541d3fe95674ddfb577620c262c0367     |
| revision_number   | 0                                    |
| segment_id        | None                                 |
| service_types     |                                      |
| subnetpool_id     | None                                 |
| tags              |                                      |
| updated_at        | 2021-08-08T11:03:10Z                 |
+-------------------+--------------------------------------+

至此,管理员的操作就已经完成了。后续由租户(普通用户)进行操作。普通用户需要创建自己的租户网络、子网、路由。

创建租户网络和子网

使用普通用户:ljzsudt

#创建一个租户的网络
openstack network create selfservice1
openstack subnet create --subnet-range 192.168.1.0/24 --network selfservice1 --dns-nameserver 114.114.114.114 selfservice1-v4
openstack router create router1
#添加子网作为路由器上的接口。(为路由添加子网)
openstack router add subnet router1 selfservice1-v4
#添加提供商网络作为路由器上的外部网关。
openstack router set --external-gateway provider1 router1

创建floating IP

# 格式:openstack floating ip create EXT_NET_ID
openstack floating ip create 8d311349-6bb9-4e81-bfcc-e76986cae605 #此处的id为provider1的id

fip创建、绑定、解绑

相关命令:https://docs.openstack.org/neutron/rocky/admin/archives/adv-features.html#basic-l3-operations

#创建fip
$ openstack floating ip create <EXT_network>
#绑定fip
$ openstack floating ip add port FLOATING_IP_ID --port-id INTERNAL_VM_PORT_ID
或:
$ openstack server add floating ip [--fixed-ip-address <ip-address>] <server> <ip-address>

或:

# 创建的同时绑定到PORT上
$ openstack floating ip create --port INTERNAL_VM_PORT_ID EXT_NET_ID

解绑fip:

$ openstack server remove floating ip <server> <ip-address>

https://zhidao.baidu.com/question/923886358003681779.html

创建虚机

# 镜像启动
openstack server create --image cirros  --flavor m1.cirror  --network flat_net vm1
nova boot --flavor m1.cirror --image cirros --nic net-name=flat_net vm2

nova force-delete vm1
nova force-delete vm2

修改安全组rule

openstack security group rule create --ingress --protocol icmp --remote-ip '0.0.0.0/0' default
openstack security group rule create --ingress --protocol tcp --dst-port 22 --remote-ip '0.0.0.0/0' default
# 查看安全组规则
openstack security group rule list default 
openstack security group show default

知识点

1、管理员创建网络和普通用户创建的网络,网络实现的功能相同。但是管理员创建网络时,例如网络类型、segmentID都是可以指定的,但是普通用户无法指定。此外,创建flat和vlan网络,要使用管理员配置,否则可能某些功能无法实现。如果要设置网络为“共享”、“外部网络”等参数也是需要使用管理员身份创建。

七、启用DVR

官方文档:https://docs.openstack.org/neutron/rocky/admin/deploy-ovs-ha-dvr.html#example-configuration

控制节点

[root@controller ~]# vim /etc/neutron/neutron.conf
[DEFAULT]
router_distributed = True
[root@controller ~]# systemctl restart neutron-server

网络节点

[root@network ~]# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
[DEFAULT]
enable_distributed_routing = True

[root@network ~]# vim /etc/neutron/l3_agent.ini
[DEFAULT]
agent_mode = dvr_snat

[root@network ~]# systemctl restart neutron-openvswitch-agent neutron-l3-agent

计算节点

[root@compute01 ~]# ovs-vsctl add-br br-ex ; ovs-vsctl add-port br-ex eth1

#安装 layer-3
[root@compute01 ~]# yum install -y openstack-neutron  #packstack部署的环境已经安装,该步骤省略

[root@compute01 ~]# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
[DEFAULT]
enable_distributed_routing = True

[ovs]
bridge_mappings=extnet:br-ex

[root@compute01 ~]# vim /etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver = openvswitch
external_network_bridge =
agent_mode = dvr

[root@compute01 ~]# systemctl restart neutron-openvswitch-agent neutron-l3-agent
[root@compute01 ~]# systemctl enable neutron-openvswitch-agent neutron-l3-agent

说明:

启用dvr后,创建路由器时,暂时只会在network节点上创建qrouter、fip和snat名称空间。只有当compute节点上创建虚机时,才会在该compute节点上创建qrouter和fip名称空间。

将集中式router转换为分布式router

[root@controller ~(keystone_admin)]# neutron router-update --admin_state_up=False router1
neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
Updated router: router1
[root@controller ~(keystone_admin)]# neutron router-update --distributed=True router1
neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
Updated router: router1
[root@controller ~(keystone_admin)]# neutron router-update --admin_state_up=True router1
neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
Updated router: router1

新建网络(dvrtest)和子网(dvrtest_subnet,cidr为172.16.1.0/24),并连接到路由器router1中,然后创建2台虚机。

此时结构图如下:

image-20211212213205464

此时,测试虚机直接的连通性:所有虚机间可以互通。

qrouter+snat两个名称空间共同组成一个路由器

#qrouter+snat两个名称空间共同组成一个路由器,每个network下有一个router。:
#fip名称空间的作用仅仅是arp欺骗,用了响应fip的mac地址。因为fip只是存在iptables规则中,无法响应arp请求。这也是老版本中,fip配置在具体的网卡上而不需要fip的原因。
[jinanlab]#root@mgt01:~# openstack port list --device-id 3682faea-db63-44ee-8638-4fbc53c8956f --long
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+-----------------+--------------------------------------+------+
| ID                                   | Name | MAC Address       | Fixed IP Addresses                                                           | Status | Security Groups | Device Owner                         | Tags |
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+-----------------+--------------------------------------+------+
| 065715c1-8997-4318-b6fc-43ad6a773dc8 |      | fa:16:3e:58:e0:19 | ip_address='172.31.0.1', subnet_id='cf98b9d2-bc97-4ecd-89a1-88cc8f4f806a'    | ACTIVE |                 | network:router_interface_distributed |      |    #qrouter名称空间下的子网网关,如果有多个子网,每个子网有一个该类型的port
| 065715c1-8997-4318-b6fc-43ad6a773dc8 |      | fa:16:3e:58:e0:19 | ip_address='172.31.0.1', subnet_id='cf98b9d2-bc97-4ecd-89a1-88cc8f4f806a'    | ACTIVE |                 | network:router_interface_distributed |      |    #qrouter名称空间下的子网网关,如果有多个子网,每个子网有一个gl类型的port
| 5e3f905d-73fa-4c9f-9480-22253055294f |      | fa:16:3e:4d:bf:50 | ip_address='172.31.1.36', subnet_id='cf98b9d2-bc97-4ecd-89a1-88cc8f4f806a'   | ACTIVE |                 | network:router_centralized_snat      |      |   #该port的IP在snat名称空间下的sg口上,如果有多个子网,每个子网有一个snat类型的port
| a3fae7fb-ea2c-49fc-a5fc-8284f9e2c3ba |      | fa:16:3e:f7:82:39 | ip_address='100.114.2.216', subnet_id='9f01629f-b873-473b-a33e-74c26bb697b5' | ACTIVE |                 | network:router_gateway               |      |   #该port的IP在snat名称空间下的qg口上,所有子网共用一个gw类型的port
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+-----------------+--------------------------------------+------+

从上图可以得知:

每个network中只有一个router,每个router对应一个snat名称空间(二者ID一致),每个router上有n个snat的port(每个subnet对应一个snat口),即network:route=1:1

image-20220303105228447

每个子网对应一个snat口。

cirros优化

由于cirros映像封装了busybox拥有linux的各项功能,具有体积小,功能全的特点,常常被用来做网络等方面功能的测试使用。但是官方提供的映像文件在使用过程中,因为加载了一些cloud、网络等模块,启动速度特别慢(约20分钟,显示如下)。所以使用起来很不方便,现在我们做一些系统调整加快启动速度(调整后10秒启动)。

#移除网络相关的服务
cd /etc/rc3.d
mv *cloud* /tmp
#移除cirros相关的服务(可选)
mv *cirros* /tmp
#调整用户密码
cd /etc/sudoers.d
cp 90-cirros-user 80-ljz-user
vi 80-ljz-user
ljz ALL=(ALL) NOPASSWD:ALL
vi /etc/issue