此场景描述了使用带有Open vSwitch(OVS)的ML2插件的OpenStack网络服务的提供者网络实现。
在OpenStack网络引入分布式虚拟路由器之前,所有网络通信都通过一个或多个专门的网络节点,这些节点的性能和可靠性都很有限。物理网络基础设施通常比在软件中处理各种网络操作的通用主机提供更好的性能和可靠性。
总的来说,OpenStack网络软件组件最能处理三层操作的影响性能和可靠性。为了提高性能和可靠性,提供商网络将第3层操作转移到物理网络基础设施上。
在一个特定的用例中,OpenStack部署驻留在一个混合环境中,其中使用了大量的物理网络基础设施。在OpenStack部署中运行的应用程序可能需要直接的2层访问,通常使用VLANs来访问部署之外的应用程序。
示例配置创建了一个VLAN提供者网络。然而,它也支持Flat(未标记的或本地的)提供者网络。
先决条件
这些先决条件定义了部署此场景所需的最小物理基础设施和立即的OpenStack服务依赖关系。
例如,网络服务直接依赖于身份服务,而计算服务直接依赖于网络服务。而像镜像服务没有依赖性的服务,是因为网络服务没有直接依赖它。
然而,计算服务依赖于镜像服务来启动一个实例。本场景中的示例配置假定了网络服务组件的基本配置知识。
为了便于说明,管理网络使用10.0.0 / 24,供应商网络使用192.0.2.0 / 24,198.51.100.24,和203.0.113.0 / 24。
基础设施
1.一个具有两个网络接口的控制节点:管理和provider。provider接口连接到物理网络基础设施交换机/路由到外部网络(通常是Internet)的通用网络。Open vSwitch网桥br-provider必须在provider网络接口上包含一个端口。
2.至少两个计算节点有两个网络接口:管理和供应商。
提供商接口连接到物理网络基础设施切换到外部网络(通常是因特网)的通用网络。Open vSwitch网桥br-provider必须在供应商网络含一个接口。
硬件要求
网络布局
服务布局
控制节点的OpenStack服务
在neutron.conf文件中具有数据库服务器的合适配置
在neutron.conf文件中具有消息队列服务的合适配置。
在neutron.conf文件中具有openstack keystone服务的合适配置
在nova.conf文件中具有openstack计算 控制/管理服务的合适配置去使用neutron
neutron服务器服务、Open vSwitch服务、ML2插件、Open vSwitch代理、DHCP代理和任何依赖关系。
计算节点的Openstack服务
在neutron.conf文件中具有openstack keystone服务的合适配置
在nova.conf文件中具有openstack计算 控制/管理服务的合适配置去使用neutron
Open vSwitch服务,ML2插件,Open vSwitch代理,以及任何依赖项。
架构
一般的供应商网络架构使用物理网络基础设施来处理网络流量的交换和路由。
一般的体系架构
控制节点包含以下网络组件:
1.OpenvSwitch代理管理虚拟交换机之间的连接,以及通过虚拟端口与其他网络组件(如名称空间和底层接口)进行交互。
2.管理qdhcp名称空间的DHCP代理。qdhcp名称空间为使用提供者网络的实例提供DHCP服务。
控制节点组件回顾
控制节点组件连接
注意:为了便于说明,该图包含两个不同的供应商网络。
计算节点包含以下网络组件:
1.Open vSwitch代理管理虚拟交换机之间的连接,以及通过虚拟端口与其他网络组件(如Linux网桥接和底层接口)进行交互。
2.Linux网桥处理安全组。
注意:由于Open vSwitch和iptables的限制,网络服务使用Linux桥来管理实例的安全组。
计算节点组件回顾
计算节点组件连接
为了便于说明,该图包含两个不同的提供者网络。
Packet flow
南北网络流量在一个实例和外部网络之间传输,通常是互联网。东西网络流量在实例之间传播。
Open vSwitch在内部使用vlan来隔离网桥的网络。VLAN ID通常与虚拟网络的分割ID不同。
案例1:南北向流量
物理网络基础架构处理供应商和外部网络之间的路由和潜在的其他服务
在这种情况下,提供商和外部简单地区分可用于实例的网络和仅可经由路由器访问的网络,以说明物理网络基础设施处理路由
然而,供应商网络支持直接连接到外部网络,如因特网。
外部网络
网络203.0.113.0/24
供应商网络(VLAN)
网络192.0.2.0/24 带有MAC地址TG网关192.0.2.1
计算节点1
带有MAC地址I1和192.0.2.11的实例1
实例1驻留在计算节点1上,并使用供应商网络。
实例向外部网络的主机发送一个包。
下面的步骤涉及计算节点1。
1.实例1的tap接口(1)将包转发到Linux网桥qbr。该包包含目标MAC地址TG,因为目的地驻留在另一个网络上。
2.安全组规则(2)在Linux网桥qbr上处理数据包的防火墙和状态跟踪。
3.Linux桥qbr将数据包转发到Open vSwitch集成网桥br-int。
4.Open vSwitch集成网桥为供应商网络添加了内部标记。
5.Open vSwitch集成网桥br-int将包转发给Open vSwitch供应商网桥br-provider。
6.Open vSwitch供应商网桥br-provider将使用提供者网络的实际VLAN标记(分段ID)替换内部标记。
7.Open vSwitch供应商网桥br-provider通过提供者网络接口将数据包转发到物理网络。
以下步骤涉及物理网络基础设施:
1.交换机(3)处理供应商网络1与路由器(4)之间的任何VLAN标记操作。
2.路由器(4)将数据包从供应商网络1路由到外部网络。
3.交换机(3)处理路由器(4)和外部网络之间的任何VLAN标记操作。
4.交换机(3)将数据包转发到外部网络。
注意:返回的流量也遵循类似的步骤。
南北网络流量流向
案例2:在不同网络上的实例的东西向流量
物理网络基础设施处理提供者网络之间的路由。
供应商网络1
网络:192.0.2.0/24 带有MAC地址TG1的网关:192.0.2.1
供应商网络2
网络:198.51.100.0/24 网关:带MAC地址TG2的198.51.100.1
计算节点1
带有192.0.2.11 和MAC地址为I1的实例1
计算节点2
带有MAC地址为I2和198.51.100.11 的实例2
实例1驻留在计算节点1上,并使用提供者网络1。
实例2驻留在计算节点2上,并使用提供者网络2。
实例1发送一个包到实例2。
以下步骤涉及计算节点1:
1.实例1的tap接口(1)将包转发到Linux网桥qbr。该包包含目标MAC地址TG1,因为目的地驻留在另一个网络上。
2.安全组规则(2)在Linux网桥qbr上处理数据包的防火墙和状态跟踪。
3.Linux网桥qbr将数据包转发到Open vSwitch集成网桥br-int。
4.Open vSwitch集成网桥br-int为提供商网络1添加了内部标记。
5.Open vSwitch集成网桥br-int将包转发给Open vSwitch提供商网桥br-provider
6.Open vSwitch提供商bridge br-provider将内部标记替换为供应商网络1的实际VLAN标记(分段ID)。
7.Open vSwitch VLAN bridge br-provider通过提供者网络接口将数据包转发到物理网络基础设施。
以下步骤涉及物理网络基础设施:
1.交换机(3)处理供应商网络1与路由器(4)之间的任何VLAN标记操作。
2.路由器(4)将数据包从提供者网络1路由到提供者网络2。
3.交换机(3)处理路由器(4)和提供者网络2之间的任何VLAN标记操作。
4.交换机(3)将数据包转发到计算节点2。
以下步骤涉及计算节点2:
1.提供者网络接口将包转发给Open vSwitch供应商网桥br-provider.。
2.Open vSwitch供应商网桥br-provider将数据包转发到Open vSwitch集成网桥br-int。
3.Open vSwitch集成网桥br-int使用内部标记替换了提供者网络2的实际VLAN标记(分段ID)
4.Open vSwitch集成网桥br-int将包转发到Linux网桥qbr。
5.安全组规则(5)在Linux网桥qbr上处理数据包的防火墙和状态跟踪。
6.Linux网桥qbr将数据包转发到实例2上的tap接口(6)。
注意:返回的流量也遵循类似的步骤。
在不同网络上的实例的东西向流量流向
案例3:在同一网络中实例的东西向流量
物理网络基础结构处理提供者网络中的交换。
供应商网络
网络:192.0.2.0/24
计算节点1
带有MAC地址为I1和192.0.2.11 的实例1
计算节点2
带有MAC地址为I2和192.0.2.12实例2
实例1驻留在compute节点1中。
实例2驻留在compute节点2中。
两个实例都使用相同的提供者网络。
实例1发送一个包到实例2。
以下步骤涉及计算节点1:
1.实例1的tap接口(1)将包转发到Linux网桥qbr。该包包含目标MAC地址I2,因为目的地位于同一网络。
2.安全组规则(2)在Linux网桥qbr上处理数据包的防火墙和状态跟踪。
3.Linux网桥qbr将数据包转发到Open vSwitch集成网桥br-int。
4.Open vSwitch集成网桥br-int为提供者网络添加了内部标记。
5.Open vSwitch集成网桥br-int将包转发给Open vSwitch提供商网桥br-provider。
6.Open vSwitch提供者网桥br-provider将使用提供者网络的实际VLAN标记(分段ID)替换内部标记。
7.Open vSwitch VLAN bridge br-provider通过提供者网络接口将数据包转发到物理网络基础设施。
以下步骤涉及物理网络基础设施:
1.交换机(3)将数据包从计算节点1转发到计算节点2。
以下步骤涉及计算节点2:
1.提供者网络接口将包转发给Open vSwitch供应商网桥br-provider。
2.Open vSwitch供应商网桥br-provider将数据包转发到OpenvSwitch集成网桥br-int。
3.Open vSwitch集成桥br-int使用内部标记替换了提供者网络1的实际VLAN标记(分段ID)
4.Open vSwitch集成网桥br-int将包转发到Linux网桥qbr。
5.安全组规则(4)在Linux网桥qbr上处理数据包的防火墙和状态跟踪。
6.Linux网桥qbr将数据包转发到实例2的tap接口(5)。
注意:返回的流量也遵循类似的步骤
在同一网络中实例的东西向流量流向
示例配置
使用下面的示例配置作为在您的环境中部署该场景的模板。
请注意:在此场景中缺少L3代理将阻止常规元数据代理的操作。您必须使用配置驱动来提供实例元数据。
控制器节点
1.配置内核以禁用反向路径过滤。编辑/etc/sysctl.配置文件:
net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.all.rp_filter=0
2.加载新内核配置:
$ sysctl -p
3.配置常见的选项。编辑/etc/neutron/neutron.配置文件:
[DEFAULT] verbose = True core_plugin = ml2 service_plugins =
注意:service_plugins选项不包含任何值,因为网络服务不提供像路由这样3层服务。
4.配置ML2插件和Open vSwitch代理。编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件:
[ml2] type_drivers = flat,vlan tenant_network_types = mechanism_drivers = openvswitch [ml2_type_flat] flat_networks = provider [ml2_type_vlan] network_vlan_ranges = provider [ovs] bridge_mappings = provider:br-provider [securitygroup] firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver enable_security_group = True enable_ipset = True
注意:
tenant_network_types选项不包含任何值,因为架构不支持项目(私有)网络。
network_vlan_range选项中的provider值缺乏VLAN ID范围,以支持使用任意VLAN ID。
5.配置DHCP代理。编辑/etc/neutron/dhcp_agent.ini文件:
[DEFAULT] verbose = True interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq dhcp_delete_namespaces = True
6.启动以下服务:
Open vSwitch
7.创建Open vSwitch供应商网桥br-provider:
$ ovs-vsctl add-br br-provider
8.将提供者网络接口添加为Open vSwitch供应商网桥br-provider的端口:
$ ovs-vsctl add-port br-provider PROVIDER_INTERFACE
将PROVIDER_INTERFACE替换为处理供应商网络的底层接口的名称。例如,eth1。
9.启动以下服务:
Server
Open vSwitch agent
DHCP agent
计算节点
1.配置内核以禁用反向路径过滤。编辑/etc/sysctl.配置文件:
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
2.加载新内核配置:
$ sysctl -p
3.配置常见的选项。编辑/etc/neutron/neutron.配置文件:
[DEFAULT]
verbose = True
4.配置Open vSwitch代理。编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件:
[ovs] bridge_mappings = provider:br-provider [securitygroup] firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver enable_security_group = True enable_ipset = True
5.启动以下服务:
Open vSwitch
6.创建Open vSwitch provider bridge br-provider:
$ ovs-vsctl add-br br-provider
7.将提供者网络接口添加为Open vSwitch供应商网桥br-provider的端口:
ovs-vsctl add-port br-provider PROVIDER_INTERFACE
将PROVIDER_INTERFACE替换为处理提供者网络的底层接口的名称。例如,eth1。
8.启动以下服务:
Open vSwitch agent
验证服务操作
1.提供管理项目凭据。
2.验证代理的存在和操作:
$ neutron agent-list +--------------------------------------+--------------------+------------+-------+----------------+---------------------------+ | id | agent_type | host | alive | admin_state_up | binary | +--------------------------------------+--------------------+------------+-------+----------------+---------------------------+ | 09de6af6-c5f1-4548-8b09-18801f068c57 | Open vSwitch agent | controller | :-) | True | neutron-openvswitch-agent | | 1c5eca1c-3672-40ae-93f1-6bde214fa303 | DHCP agent | controller | :-) | True | neutron-dhcp-agent | | 6129b1ec-9946-4ec5-a4bd-460ca83a40cb | Open vSwitch agent | compute1 | :-) | True | neutron-openvswitch-agent | | 8a3fc26a-9268-416d-9d29-6d44f0e4a24f | Open vSwitch agent | compute2 | :-) | True | neutron-openvswitch-agent | +--------------------------------------+--------------------+------------+-------+----------------+---------------------------+
创建初始网络
这个例子创建了一个VLAN提供者网络。将VLAN ID和IP地址范围更改为适合您的环境的值。
1.提供管理项目凭据。
2.创建一个提供者网络:
$ neutron net-create provider-101 --shared --provider:physical_network provider --provider:network_type vlan --provider:segmentation_id 101 Created a new network: +---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | admin_state_up | True | | id | 8b868082-e312-4110-8627-298109d4401c | | name | provider-101 | | provider:network_type | vlan | | provider:physical_network | provider | | provider:segmentation_id | 101 | | router:external | False | | shared | True | | status | ACTIVE | | subnets | | | tenant_id | e0bddbc9210d409795887175341b7098 | +---------------------------+--------------------------------------+
注意:share选项允许任何项目使用此网络。
3.在供应商网络上创建子网:
$ neutron subnet-create provider-101 203.0.113.0/24 --name provider-101-subnet --gateway 203.0.113.1 Created a new subnet: +-------------------+--------------------------------------------------+ | Field | Value | +-------------------+--------------------------------------------------+ | allocation_pools | {"start": "203.0.113.2", "end": "203.0.113.254"} | | cidr | 203.0.113.0/24 | | dns_nameservers | | | enable_dhcp | True | | gateway_ip | 203.0.113.1 | | host_routes | | | id | 0443aeb0-1c6b-4d95-a464-c551c47a0a80 | | ip_version | 4 | | ipv6_address_mode | | | ipv6_ra_mode | | | name | provider-101-subnet | | network_id | 8b868082-e312-4110-8627-298109d4401c | | tenant_id | e0bddbc9210d409795887175341b7098 | +-------------------+--------------------------------------------------+
验证网络操作
1.在控制节点上,验证qdhcp名称空间的创建:
$ ip netns qdhcp-8b868082-e312-4110-8627-298109d4401c
注意:在启动实例之前,qdhcp名称空间可能不存在。
2.提供常规项目凭证。下面的步骤使用demo项目。
3.创建适当的安全组规则,允许ping和SSH访问实例。例如:
$ nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | icmp | -1 | -1 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+ $ nova secgroup-add-rule default tcp 22 22 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 22 | 22 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
4.在供应商网络上启动一个具有接口的实例。
$ nova boot --flavor m1.tiny --image cirros-0.3.3-x86_64-disk test_server +--------------------------------------+-----------------------------------------------------------------+ | Property | Value | +--------------------------------------+-----------------------------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | nova | | OS-EXT-SRV-ATTR:host | - | | OS-EXT-SRV-ATTR:hypervisor_hostname | - | | OS-EXT-SRV-ATTR:instance_name | instance-00000001 | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | - | | OS-SRV-USG:terminated_at | - | | accessIPv4 | | | accessIPv6 | | | adminPass | h7CkMdkRXuuh | | config_drive | | | created | 2015-07-22T20:40:16Z | | flavor | m1.tiny (1) | | hostId | | | id | dee2a9f4-e24c-444d-8c94-386f11f74af5 | | image | cirros-0.3.3-x86_64-disk (2b6bb38f-f69f-493c-a1c0-264dfd4188d8) | | key_name | - | | metadata | {} | | name | test_server | | os-extended-volumes:volumes_attached | [] | | progress | 0 | | security_groups | default | | status | BUILD | | tenant_id | 5f2db133e98e4bc2999ac2850ce2acd1 | | updated | 2015-07-22T20:40:16Z | | user_id | ea417ebfa86741af86f84a5dbcc97cd2 | +--------------------------------------+-----------------------------------------------------------------+
5.确定实例的IP地址。下面的步骤使用203.0.113.3。
$ nova list +--------------------------------------+-------------+--------+------------+-------------+--------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+-------------+--------+------------+-------------+--------------------------+ | dee2a9f4-e24c-444d-8c94-386f11f74af5 | test_server | ACTIVE | - | Running | provider-101=203.0.113.3 | +--------------------------------------+-------------+--------+------------+-------------+--------------------------+
6.在控制节点或任何访问提供者网络的主机上,ping IP地址:
$ ping -c 4 203.0.113.3 PING 203.0.113.3 (203.0.113.3) 56(84) bytes of data. 64 bytes from 203.0.113.3: icmp_req=1 ttl=63 time=3.18 ms 64 bytes from 203.0.113.3: icmp_req=2 ttl=63 time=0.981 ms 64 bytes from 203.0.113.3: icmp_req=3 ttl=63 time=1.06 ms 64 bytes from 203.0.113.3: icmp_req=4 ttl=63 time=0.929 ms --- 203.0.113.3 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3002ms rtt min/avg/max/mdev = 0.929/1.539/3.183/0.951 ms
7.获取对实例的访问。
8.测试连接到互联网:
$ ping -c 4 openstack.org PING openstack.org (174.143.194.225) 56(84) bytes of data. 64 bytes from 174.143.194.225: icmp_req=1 ttl=53 time=17.4 ms 64 bytes from 174.143.194.225: icmp_req=2 ttl=53 time=17.5 ms 64 bytes from 174.143.194.225: icmp_req=3 ttl=53 time=17.7 ms 64 bytes from 174.143.194.225: icmp_req=4 ttl=53 time=17.5 ms --- openstack.org ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 17.431/17.575/17.734/0.143 ms