本节介绍如何创建代表外部网络的虚拟网络。在此虚拟网络上,不使用 DHCP,而是创建浮动 IP 地址。这些浮动 IP 地址分配给特定的租户,并且可以分配给 Nova VM 实例以供该租户下的用户使用。Neutron L3 代理将自动在分配给 Nova 实例的地址和浮动 IP 地址之间创建一对一的 NAT 映射。
OpenStack Neutron 的 Oracle Solaris 11.2 实现通过专用网络部署模型支持提供商路由器。在此部署模型中,每个租户都有一个或多个专用网络,并且所有租户网络都共享相同的路由器。数据管理员创建、拥有和管理路由器。该路由器在租户的网络拓扑视图中不可见。因为只有一个路由器,所以租户网络无法使用重叠的 IP 地址。管理员代表租户创建专用网络。
缺省情况下,此模型中的路由器禁止在属于同一租户的专用网络之间路由:一个专用网络中的 VM 实例无法与其他专用网络中的 VM 实例通信,即使它们属于同一租户也是如此。要更改此行为,请将 /etc/neutron/l3_agent.ini 配置文件中的 allow_forwarding_between_networks 设置为 True 并重新启动 neutron-l3-agent SMF 服务。
此模型中的路由器为租户 VM 实例提供与外部世界的连接。该路由器在连接路由器与外部网络的接口上执行双向 NAT。租户可以根据需要创建任意数量的浮动 IP(公共 IP),也可以根据浮动 IP 限额进行创建,然后将这些浮动 IP 与需要外部连接的 VM 实例关联。
下图展示了 Oracle Solaris 11.2 Neutron 部署模型。图后面为该图的说明。
图 9 使用专用网络模型的提供商路由器
在上图所示的模型中,每个租户具有两个内部网络和两个 VM 实例。
包含子网 192.168.100.0/24 和网关 192.168.100.1 的 HR 网络
包含子网 192.168.101.0/24 和网关 192.168.101.1 的 ENG 网络
通过固定 IP 地址 192.168.100.3 连接到 HR 的 VM1
通过固定 IP 地址 192.168.101.3 连接到 ENG 的 VM2
包含子网 192.168.102.0/24 和网关 192.168.102.1 的 IT 网络
包含子网 192.168.103.0/24 和网关 192.168.103.1 的 ACCT 网络
通过固定 IP 地址 192.168.102.3 连接到 IT 的 VM3
通过固定 IP 地址 192.168.103.3 连接到 ACCT 的 VM4
如下表所示配置双向 NAT 表。
|
所有网关接口在运行 neutron-l3-agent SMF 服务的节点上实例化。虽然云可以具有许多 Neutron 实例,但是每个云只需要一个 neutron-l3-agent。
外部网络是与可从外部访问的子网 10.134.13.0/24 关联的提供商网络。租户将从此网络创建浮动 IP 地址,并将这些地址与其 VM 实例关联。VM1 和 VM2 分别与浮动 IP 10.134.13.40 和 10.134.13.9 关联。VM1 和 VM2 可以通过这些 IP 地址从外部进行访问。
下图显示了这些租户资源在网络节点和两个计算节点中的配置方式。图后面为图中所示部分功能的说明。
图 10 Neutron L3 代理配置
虚拟网络接口。
L3 代理在执行双向 NAT 的外部 ("e") 网络上创建了 VNIC。
L3 代理在具有缺省网关 IP 地址的内部 ("i") 网络上创建了 VNIC。
下面的列表显示了 IP 地址在本示例配置中的使用方式。
缺省网关
为向租户公开 OpenStack API(例如 Nova、Cinder、Glance)而留出的 IP 地址
租户 VM 实例的浮动 IP 地址
此过程介绍如何使用 service 租户创建将由数据中心内的所有租户使用的路由器、外部网络和外部子网。
此过程由数据中心管理员执行。必须使用命令行配置共享的单个路由器并关联来自不同租户的网络和子网,因为 OpenStack 系统信息显示板仅允许您一次管理一个租户的资源。
执行以下步骤时,请参阅图 10。
开始之前
必须先完成内部网络的配置,然后再执行此过程。
network# svcadm enable ipfilter
network# ipadm set-prop -p forwarding=on ipv4 network# ipadm set-prop -p forwarding=on ipv6
在以下示例中,VLAN ID 和范围值均基于Step 9 完成的 EVS 配置。
network# evsadm show-controlprop -p vlan-range,l2-type PROPERTY PERM VALUE DEFAULT HOST l2-type rw vlan vlan -- vlan-range rw 13,1000-2000 -- --
network# keystone tenant-list
提供商路由器创建为 service 租户下的 OpenStack neutron 用户。
请注意新路由器的 UUID (id)。您将在下一步中使用此 UUID。
network# export OS_USERNAME=neutron network# export OS_PASSWORD=neutron-password network# export OS_TENANT_NAME=service network# export OS_AUTH_URL=http://controller-name:5000/v2.0 network# neutron router-create provider_router Created a new router: +-----------------------+--------------------------------------+ | Field | Value | +-----------------------+--------------------------------------+ | admin_state_up | True | | external_gateway_info | | | id | 181543df-40d1-4514-ea77-fddd78c389ff | | name | provider_router | | status | ACTIVE | | tenant_id | f164220cb02465db929ce520869895fa | +-----------------------+--------------------------------------+
使用之前步骤中的路由器 UUID (id) 更新 /etc/neutron/l3_agent.ini 文件中 router_id 的值。
router_id = 181543df-40d1-4514-ea77-fddd78c389ff
network# svcadm enable neutron-l3-agent
虚拟网络创建为 service 租户下的 OpenStack neutron 用户。
network# neutron net-create --provider:network_type=vlan \ --provider:segmentation_id=13 --router:external=true external_network Created a new network: +--------------------------+--------------------------------------+ | Field | Value | +--------------------------+--------------------------------------+ | admin_state_up | True | | id | f67f0d72-0ddf-11e4-9d95-e1f29f417e2f | | name | external_network | | provider:network_type | vlan | | provider:segmentation_id | 13 | | router:external | True | | shared | False | | status | ACTIVE | | subnets | | | tenant_id | f164220cb02465db929ce520869895fa | +--------------------------+--------------------------------------+
为外部网络创建关联的子网网络,指定禁用 DHCP 并将该子网用于外部路由。指定从其分配浮动 IP 地址的可路由 IP 子网。在本示例中,该子网与 VLAN ID 13 关联。
network# neutron subnet-create --enable-dhcp=False \ --allocation-pool start=10.134.13.8,end=10.134.13.254 \ --name external_subnet external_network 10.134.13.0/24 Created a new subnet: +------------------+--------------------------------------------------+ | Field | Value | +------------------+--------------------------------------------------+ | allocation_pools | {"start": "10.134.13.8", "end": "10.134.13.254"} | | cidr | 10.134.13.0/24 | | dns_nameservers | | | enable_dhcp | False | | gateway_ip | 10.134.13.1 | | host_routes | | | id | 5d9c8958-0de0-11e4-9d96-e1f29f417e2f | | ip_version | 4 | | name | external_subnet | | network_id | f67f0d72-0ddf-11e4-9d95-e1f29f417e2f | | tenant_id | f164220cb02465db929ce520869895fa | +------------------+--------------------------------------------------+
在下面的命令中,第一个 UUID 是 provider_router UUID,而第二个 UUID 是 external_network UUID。
network# neutron router-gateway-set \ 181543df-40d1-4514-ea77-fddd78c389ff \ f67f0d72-0ddf-11e4-9d95-e1f29f417e2f Set gateway for router 181543df-40d1-4514-ea77-fddd78c389ff network# neutron router-list -c name -c external_gateway_info +-----------------+--------------------------------------------------------+ | name | external_gateway_info | +-----------------+--------------------------------------------------------+ | provider_router | {"network_id": "f67f0d72-0ddf-11e4-9d95-e1f29f417e2f"} | +-----------------+--------------------------------------------------------+
neutron net-list 命令显示的网络之前已配置。
network# keystone tenant-list +----------------------------------+---------+---------+ | id | name | enabled | +----------------------------------+---------+---------+ | 511d4cb9ef6c40beadc3a664c20dc354 | demo | True | | f164220cb02465db929ce520869895fa | service | True | +----------------------------------+---------+---------+ network# neutron net-list --tenant-id=511d4cb9ef6c40beadc3a664c20dc354 +-------------------------------+------+------------------------------+ | id | name | subnets | +-------------------------------+------+------------------------------+ | c0c15e0a-0def-11e4-9d9f- | HR | c0c53066-0def-11e4-9da0- | | e1f29f417e2f | | e1f29f417e2f 192.168.100.0/24| | ce64b430-0def-11e4-9da2- | ENG | ce693ac8-0def-11e4-9da3- | | e1f29f417e2f | | e1f29f417e2f 192.168.101.0/24| +-------------------------------+------+------------------------------+
在下面的命令中,第一个 UUID 是 provider_router UUID,而第二个 UUID 是 HR 子网 UUID。
network# neutron router-interface-add \ 181543df-40d1-4514-ea77-fddd78c389ff \ c0c53066-0def-11e4-9da0-e1f29f417e2f (HR subnet UUID) Added interface 7843841e-0e08-11e4-9da5-e1f29f417e2f to router 181543df-40d1-4514-ea77-fddd78c389ff.
在下面的命令中,第一个 UUID 是 provider_router UUID,而第二个 UUID 是 ENG 子网 UUID。
network# neutron router-interface-add \ 181543df-40d1-4514-ea77-fddd78c389ff \ ce693ac8-0def-11e4-9da3-e1f29f417e2f Added interface 89289b8e-0e08-11e4-9da6-e1f29f417e2f to router 181543df-40d1-4514-ea77-fddd78c389ff.
另请参见
此过程由租户用户使用 OpenStack Horizon 系统信息显示板执行。
使用租户用户的凭证按照如何访问 OpenStack 系统信息显示板中的说明登录。
"Floating IPs"(浮动IP)选项卡显示浮动 IP 地址 10.134.13.9 已分配。
"Project"(项目)> "Instances"(云主机)窗口显示该浮动 IP 地址已与 VM 实例关联。
如果您在启动 VM 实例时选择了密钥对(SSH 公钥),则系统会为 VM 实例中的 root 用户将该 SSH 密钥添加到 authorized_keys 文件中。
global# ssh root@10.134.13.9 Last login: Fri Jul 18 00:37:39 2014 from 10.132.146.13 Oracle Corporation SunOS 5.11 11.2 June 2014 root@host-192-168-101-3:~# uname -a SunOS host-192-168-101-3 5.11 11.2 i86pc i386 i86pc root@host-192-168-101-3:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 2 instance-00000001 running / solaris excl root@host-192-168-101-3:~# ipadm NAME CLASS/TYPE STATE UNDER ADDR lo0 loopback ok -- -- lo0/v4 static ok -- 127.0.0.1/8 lo0/v6 static ok -- ::1/128 net0 ip ok -- -- net0/dhcp inherited ok -- 192.168.101.3/24
您可以使用诸如 ipf、ippool 和 ipnat 等 IP 过滤器命令以及诸如 dladm 和 ipadm 等网络命令观察 neturon-l3-agent 执行的配置并对其进行故障排除。
network# dladm show-vnic LINK OVER SPEED MACADDRESS MACADDRTYPE VIDS l3i7843841e_0_0 net1 1000 2:8:20:42:ed:22 fixed 200 l3i89289b8e_0_0 net1 1000 2:8:20:7d:87:12 fixed 201 l3ed527f842_0_0 net0 100 2:8:20:9:98:3e fixed 0
network# ipadm NAME CLASS/TYPE STATE UNDER ADDR l3ed527f842_0_0 ip ok -- -- l3ed527f842_0_0/v4 static ok -- 10.134.13.8/24 l3ed527f842_0_0/v4a static ok -- 10.134.13.9/32 l3i7843841e_0_0 ip ok -- -- l3i7843841e_0_0/v4 static ok -- 192.168.100.1/24 l3i89289b8e_0_0 ip ok -- -- l3i89289b8e_0_0/v4 static ok -- 192.168.101.1/24
network# ipfstat -io empty list for ipfilter(out) block in quick on l3i7843841e_0_0 from 192.168.100.0/24 to pool/4386082 block in quick on l3i89289b8e_0_0 from 192.168.101.0/24 to pool/8226578 network# ippool -l table role = ipf type = tree number = 8226578 { 192.168.100.0/24; }; table role = ipf type = tree number = 4386082 { 192.168.101.0/24; };
network# ipnat -l List of active MAP/Redirect filters: bimap l3ed527f842_0_0 192.168.101.3/32 -> 10.134.13.9/32 List of active sessions: BIMAP 192.168.101.3 22 <- -> 10.134.13.9 22 [10.132.146.13 36405]