00 Packstack部署 Open Stack
参考链接: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
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。
通用的拓扑:

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

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之间也不能通信,即使它们位于同一宿主机上。

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直接分配给租户虚机。

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

控制节点:
#控制节点:/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
所有计算节点和网络节点
# 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"}
此时的网络结构:

注意点:关于是否勾选“外部网络”?
勾选与否都不会影响flat网络的使用。如果不勾选,则无法用于分配floating IP。
对于租户网络为flat网络而言,一般其子网cidr与真实物理网络的cidr相同,是处于同一个二层网络并且在同一个子网中,虚机的fiexd IP可以直接与真实网络互通,无需使用Floating IP。
另一种情况是flat网络作为外部网络连入虚机router,此时就需要勾选“外部网络”,可以为虚机提供Floating IP。
注意:flat网络必须以管理员用户以管理员身份创建(“管理员” –> “网络”),普通用户创建、管理员用户在项目下创建都会报错。
“物理网络"如何取值:根据配置项bridge_mappings=flat1:br-eth1配置选择。此处为flat1。

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


说明:
1、子网地址池中的第1个IP会分给qdhcp名称空间下的网卡。如果不指定地址池,则使用cidr中所有的IP。
2、创建network时,qdhcp-xxx不会创建,创建第1个子网时,才会创建。之后创建第2、3…个子网时就不会再创建qdhcp了。所以网络和qdhcp是一对一的关系。一个qdhcp负责为整个二层网络分配地址。
创建完子网后,此时,会在网络节点上创建一个qdhcp名称空间,br-int桥上会创建一个port,该port是dhcp的tap设备。图如下:

使用管理员或普通用户都可以。
创建完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
此时的网络结构如下:

因为计算节点上没有HDCP服务,所以没有相应的tap 设备。
此时,网络结构如下:

注意:
测试之前,安全组要放通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:

物理也是可以ping通虚机:

按理说,“flat租户网络+flat Provider网络”的组合是能跑的通的,(一个flat租户网络,也可以创建多个子网,子网不一定需要与物理网络具有相同是cidr,此时要借助qrouter打通不同的子网)。但是flat租户网络的模式一般只会在测试环境中使用,使用方式:创建一个Provider网络,cidr与真实的物理网络保持一致,然后直接为虚机分配flat Provider网络中的IP。
flat网络必须是管理员创建为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
步骤:
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 |
+---------------------------+--------------------------------------+
说明:
- 配置<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
<project>填写对应的project名称或者ID
<provider-segment>填写该地址段的vlan号
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 |
+-------------------+--------------------------------------+
说明:
subnet-range填写地址段,如100.200.4.0/22,该网段要与物理交换机上配置的网关的网段一致。
gateway填写该地址段的网关(需要在物理机交换机上配置网关地址)
<network_name>填写上一步创建的network名称或ID
<project>填写对应的project名称或者ID
openstack server create --image cirros --flavor m1.cirror --network vlan-mgt vm1
此时的拓扑图如下:

分析:
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网络结构类似,但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桥。

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

上图中:vm1和vm2属于vlan100;vm3属于vlan101。他们都在同一个br-int桥上。
试验: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
# 网络节点、计算节点:创建ovs桥
ovs-vsctl add-br br-eth1
ovs-vsctl add-port br-eth1 eth1
省略,与flat网络类似。


经测试:vm1可以ping通vm3,但无法ping通vm2。即同子网内互通,跨子网不通。
此时的拓扑如下:

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

经测试:vm1可以ping通vm2,即跨子网可以互通。
此时的拓扑图如下:

通过router可以实现位于不同vlan的instance之间的通信。那instance如何与外部网络通信?这里的外部网络指的是租户网络以外的网络。租户网络是由Neutron创建和维护的网络。外部网络不由Neutron创建。如果是私有云,外部网络通常指的是公司intranet;如果是公有云,外部网络通常指的是internet。外部网络是已经存在的网络,一般都是flat网络或vlan网络。
控制节点:
#控制节点:/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
# 网络节点、计算节点:创建ovs桥
ovs-vsctl add-br br-ex
ovs-vsctl add-port br-ex eth2


此时的拓扑图如下:

说明:
1、br-eth1和eth1是租户vlan网络不通计算节点的东西向流量,br-ex和eth2是vlan网络的南北向流量。
2、(集中式路由)router连接qg-xx口,实际上是通过路线:router –> br-int –> br-ex –> qg口

测试:外部网络可以ping通

- 隧道网卡需要配置IP

试验基于全新packstack部署的环境进行。
控制节点、网络节点、计算节点启用ML2核心插件
/etc/neutron/neutron.conf
[DEFAULT]
core_plugin=neutron.plugins.ml2.plugin.Ml2Plugin #启用ML2核心插件
service_plugins=qos,trunk,router,metering
控制节点:/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的任意值。)
网络节点、计算节点
/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)

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



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

虚机间可以ping通:

当前的网络结构:

vxlan数据包流表分析:
在网络vxlan100内,再创建第2个子网subnet_172_16_101_0,地址为172.16.101.0/24

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

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

但是二层是互通的:

如果要实现不同子网三层互通,就需要通过使用router设备。
路由服务提供跨subnet互联互通的能力。
对于flat和vlan类型的网络,可以使用物理router或虚拟router。对于overlay网络,我们需要借助虚拟router实现路由功能。
创建路由:router1

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


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

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


通过router可以实现位于不同子网的instance 之间的通信。
接下来要探讨的问题是instance 如何与外部网络通信。
这里的外部网络指的是租户网络以外的网络。租户网络是由Neutron创建和维护的网络。外部网络不由Neutron创建。如果是私有云,外部网络通常指的是公司intranet; 如果是公有云,外部网络通常指的是internet。
为了连接外部网络,需要预先在配置文件中告诉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节点执行。
其他创建细节参考flat网络创建
创建外部网络:external_net、子网:ext_subnet




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

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

此时的网络结构如下:

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

查看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:

此时虚机能够访问外网,但是外网无法访问虚机,如果要实现访问虚机,可以通过Floating IP。
Open vSwitch driver环境中,floating IP的实现与Linux Bridge driver完全一样: 都是通过在router 提供网关的外网interface(qg-xxx)上配置iptables NAT规则实现。
分配FIP:

关联FIP:

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

测试:在真实的物理网络中访问虚机
[ 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
用具有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
# 格式:openstack floating ip create EXT_NET_ID
openstack floating ip create 8d311349-6bb9-4e81-bfcc-e76986cae605 #此处的id为provider1的id
相关命令: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
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网络,要使用管理员配置,否则可能某些功能无法实现。如果要设置网络为“共享”、“外部网络”等参数也是需要使用管理员身份创建。
官方文档: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台虚机。
此时结构图如下:

此时,测试虚机直接的连通性:所有虚机间可以互通。
#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

每个子网对应一个snat口。
由于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