第 3 章 常见的管理任务

OpenStack Networking(neutron)是一个软件定义的 Red Hat OpenStack Platform 网络组件。通过虚拟网络的基本架构,实例和外部物理网络就可以进行网络连接。

本节介绍了常见的管理任务,如根据您的 Red Hat OpenStack Platform 部署添加、删除子网和路由器。

3.1. 创建网络

通过创建网络,您的实例间将可以进行通讯,并可以使用 DHCP 获得 IP 地址。网络也可以和您的 Red Hat OpenStack Platform 部署或其它部署中的外部网络(如物理网络)进行集成。通过集成,您的实例将可以和外部系统进行交流。如需了解把您的网络和外部物理网络进行集成的信息,请参阅 “桥接物理网络”。

在创建网络时,一个重要因素您需要进行考虑:网络可以包括多个子网。这一点对于需要在同一个网络中提供相互独立的不同系统的环境非常重要。例如,您可以使 webserver 的网络流量只在一个子网中有效,而数据库网络流量在另外的子网中有效。每个子网都独立于其它子网,如果实例需要和其它子网进行通讯,必须经过一个网络路由器。您可以考虑把相互间需要进行大量网络通讯的系统放置在同一个子网中,这将会尽量避免网络路由,从而提高网络的性能。

1. 在 dashboard 中选择项目 > 网络 > 网络

2.+创建网络并设置以下项:

描述

网络名称

根据网络要实现的任务,为它取一个有意义的名称。如果您需要把它和一个外部 VLAN 进行集成,可以考虑把 VLAN ID 值加在名称中。例如:如果您在这个子网中提供 HTTP web 服务器,而它的 VLAN tag 是 122,则可以为它取名为 * webservers_122;如果您计划把这个网络作为私人网络使用,并不准备和外部网络进行连接,则可以为它取名为 * internal-only。

管理状态

指定这个网络是否马上有效。您可以创建一个网络,但使它处于 Down 状态(在逻辑上,这个网络已经存在,但还没有被激活)。如果您不想把新创建的网络马上加入到生产环境中,可以使用这个功能。

3.下一步按钮,在子网标签页中指定以下项:

描述

创建子网

指定是否需要创建一个子网。例如,当您只希望创建一个网络结构,而并不需要进行网络连接时,可以不创建子网。

子网名

为子网输入一个适当的名称。

网络地址

输入 CIDR 格式的地址(一个包括 IP 地址范围和子网掩码的值)。其中的子网掩码值是通过计算用于进行子网掩码的位数决定的。例如,子网掩码 255.255.255.0 有 24 位,如需指定使用这个掩码的 IPv4 地址范围 192.168.122.0,使用 192.168.122.0/24。

IP 版本

指定 IP 版本,有效值是 IPv4 和 IPv6。网络地址项中设置的 IP 地址范围需要和这个值相匹配。

网关 IP

作为默认网关的路由器的 IP 地址。所有和外部网络进行通讯的数据都需要经过这个地址进行路由,它需要在网络地址项中指定的地址范围之内。例如,如果您的 CIDR 网络地址是 192.168.122.0/24,您的默认网关可以是 192.168.122.1。

禁用网关

禁用网络数据转发,使这个网络独立于其它环境。

4.下一步来设置 DHCP 选项:

  • 启用 DHCP - 在这个子网中启用 DHCP 服务。DHCP 可以为您的实例自动分配 IP 设置。
  • IPv6 地址 - 如果创建一个 IPv6 网络,指定 IPv6 地址和其它额外信息是如何分配的。

    • 未指定选项 - 如果手工设置 IP 地址,或使用非 OpenStack 支持的方法分配地址,则使用这个选项。
    • SLAAC (Stateless Address Autoconfiguration) - 实例基于 OpenStack Networking 路由器发送的 RA(Router Advertisement)信息生成 IPv6 地址。使用这个配置的结果是,在创建 OpenStack Networking 子网时,ra_mode 和 address_mode 都被设置为 slaac。
    • DHCPv6 stateful - 实例从 OpenStack Networking DHCPv6 服务接收 IPv6 地址以及其它选项(如 DNS)。使用这个配置的结果是,在创建网络时,ra_mode 和 address_mode 都被设置为 dhcpv6-stateful。
    • DHCPv6 stateless - 实例基于 OpenStack Networking 路由器发送的 RA(Router Advertisement)信息生成 IPv6 地址。其它额外的选项(如 DNS)由 OpenStack Networking DHCPv6 服务分配。使用这个配置的结果是,在创建网络时,ra_mode set 和 address_mode 都被设置为 dhcpv6-stateless。
  • 分配池 - DHCP 分配的 IP 地址范围。例如,192.168.22.100,192.168.22.100 代表范围内的所有 up 的地址都可以被分配。
  • DNS 域名解析服务器 - 网络中可用的 DNS 服务器的 IP 地址。DHCP 把这些地址分配给实例用来进行域名解析。
  • 主机路由 - 静态主机路由。首先以 CIDR 的格式指定目标网络,然后指定下一个处理路由的地址。例如:192.168.23.0/24, 10.1.31.1。如果您需要为实例静态分配路由信息,请设置这个选项。

5.创建

创建的网络可以在网络标签页中查看。您可以根据需要,通过点编辑来修改它的选项。现在,当您创建实例时,可以配置它来使用这个子网,并获得相应的 DHCP 选项。

3.2. 创建高级网络

当管理员通过管理员界面创建网络时,可以使用高级网络选项。这些选项定义了要使用的网络类型,并允许指定租户:

1. 在 dashboard 中,选择管理员 > 网络 > 创建网络 > 项目。在项目中选择一个项目来运行这个新网络。

2. 检查供应商网络类型中的选项:

  • Local - 网络流量只在本地 Compute 主机上传输,它的实际效果是和所有外部网络隔离。
  • Flat - 通讯数据被限制在一个单独的网络中,并可以和其它主机共享。没有 VLAN tagging 或其它网络分离的功能。
  • VLAN - 使用代表了物理网络中的一个 VLAN 的 VLAN ID 来创建网络。这可以使实例和处于相同 2 层 VLAN 中的系统进行交流。
  • GRE - 使用一个跨多个节点的网络覆盖(network overlay)来为实例间提供私人网络通讯。从网络覆盖出站的网络流量需要被路由。
  • VXLAN - 和 GRE 类似,使用一个跨多个节点的网络覆盖(network overlay)来为实例间提供私人网络通讯。从网络覆盖出站的网络流量需要被路由。

创建网络,检查项目的网络拓扑来确认网络已被成功创建。

3.3. 添加网络路由

为了使网络数据可以路由到您的新网络,或从新网络中路由出来,您需要把它的子网添加为一个已存在虚拟路由器的接口:

1. 在 dashboard 中选择项目 > 网络 > 路由

2.路由列中选您的虚拟路由器名称,点 +添加接口。在子网列表中选择您的新子网的名称。您也可以为这个接口指定一个 IP 地址。

3.增加接口

现在,您网络中的实例就可以和子网以外的系统进行交流。

3.4. 删除网络

在一些情况下,您可能需要删除以前创建的网络。为了成功删除一个网络,您需要首先删除或断开所有使用它的接口。以下介绍了在项目中删除网络的方法。

1. 在 dashboard 中,选择项目 > 网络 > 网络。删除和目标网络的子网相关联的所有路由接口。删除一个接口的步骤是:在网络列中点目标网络来找到需要删除的网络的 ID(在 ID 项中显示)。所有和这个网络相关联的子网都在它们的网络 ID 项中共享这个值。

2. 选择项目 > 网络 > 路由,在路由列表中选您的虚拟路由器的名称,并找到附加到需要删除的子网上的接口。您可以通过它的 IP 地址(网关的 IP 地址)来和其它接口区分开。另外,它的网络接口 ID 应该和上一步获得的 ID 相匹配。

3. 点接口的删除接口按钮。

选择项目 > 网络 > 网络,点您的网络名。点目标子网的删除子网按钮。

注意

如果您还不能删除子网,请检查它是否还被其它实例使用。

项目 > 网络 > 网络,然后选项您需要删除的网络。提示时点删除网络,在下一个界面中再次确认。

3.5. 清除(purge)租户的网络

在 Red Hat OpenStack Platform 9 以前的版本中,在删除一个项目后,还存在分配给这个项目的资源,这包括网络、路由和端口。这些资源需要被手工删除,而且需要以正确的顺序删除。在 Red Hat OpenStack Platform 9 中,可以使用 neutron purge 命令来删除以前属于一个特定项目的所有 neutron 资源。

例如,在删除 test-project 前,需要 purge 它的 neutron 资源:

# openstack project list
+----------------------------------+--------------+
| ID                               | Name         |
+----------------------------------+--------------+
| 02e501908c5b438dbc73536c10c9aac0 | test-project |
| 519e6344f82e4c079c8e2eabb690023b | services     |
| 80bf5732752a41128e612fe615c886c6 | demo         |
| 98a2f53c20ce4d50a40dac4a38016c69 | admin        |
+----------------------------------+--------------+

# neutron purge 02e501908c5b438dbc73536c10c9aac0
Purging resources: 100% complete.
Deleted 1 security_group, 1 router, 1 port, 1 network.

# openstack project delete 02e501908c5b438dbc73536c10c9aac0

3.6. 创建子网

子网为相关的实例提供了网络连接功能。在每个实例的创建过程中,都需要被分配一个子网,您需要仔细考虑实例和子网的设置,以最好地满足您的网络连接需求。子网是在已存在的网络中创建的。一个需要考虑的重要因素是:OpenStack Networking 中的租户网络可以包括多个子网。这一点对于需要在同一个网络中提供相互独立的不同系统环境的情况非常重要。例如,您可以使 webserver 的网络流量只在一个子网中有效,而数据库网络流量在另外的子网中有效。每个子网都独立于其它子网,如果实例需要和其它子网进行通讯,必须经过一个网络路由器。您可以考虑把相互间需要进行大量网络通讯的系统放置在同一个子网中,这将会尽量避免网络路由,从而提高网络的性能。

3.6.1. 创建一个新子网

在 dashboard 中,选择项目 > 网络 > 网络,然后在网络项中点您的网络名称。

1.创建子网,然后指定以下项。

描述

子网名

子网的名称

网络地址

CIDR 格式的地址(一个包括 IP 地址范围和子网掩码的值)。其中的子网掩码值是通过计算用于进行子网掩码的位数决定的。例如,子网掩码 255.255.255.0 有 24 位,如需指定使用这个掩码的 IPv4 地址范围 192.168.122.0,使用 192.168.122.0/24。

IP 版本

指定 IP 版本,有效值是 IPv4 和 IPv6。网络地址项中设置的 IP 地址范围需要和这个值相匹配。

网关 IP

作为默认网关的路由器的 IP 地址。所有和外部网络进行通讯的数据都需要经过这个地址进行路由,它需要在网络地址项中指定的地址范围之内。例如,如果您的 CIDR 网络地址是 192.168.122.0/24,您的默认网关可以是 192.168.122.1。

禁用网关

禁用网络数据转发,使这个网络独立于其它环境。

2.下一步来设置 DHCP 选项:

  • 启用 DHCP - 在这个子网中启用 DHCP 服务。DHCP 可以为您的实例自动分配 IP 设置。
  • IPv6 地址 - 如果创建一个 IPv6 网络,指定 IPv6 地址和其它额外信息是如何分配的。

    • 未指定选项 - 如果手工设置 IP 地址,或使用非 OpenStack 支持的方法分配地址,则使用这个选项。
    • SLAAC (Stateless Address Autoconfiguration) - 实例基于 OpenStack Networking 路由器发送的 RA(Router Advertisement)信息生成 IPv6 地址。使用这个配置的结果是,在创建 OpenStack Networking 子网时,ra_mode 和 address_mode 都被设置为 slaac。
    • DHCPv6 stateful - 实例从 OpenStack Networking DHCPv6 服务接收 IPv6 地址以及其它选项(如 DNS)。使用这个配置的结果是,在创建网络时,ra_mode 和 address_mode 都被设置为 dhcpv6-stateful。
    • DHCPv6 stateless - 实例基于 OpenStack Networking 路由器发送的 RA(Router Advertisement)信息生成 IPv6 地址。其它额外的选项(如 DNS)由 OpenStack Networking DHCPv6 服务分配。使用这个配置的结果是,在创建网络时,ra_mode set 和 address_mode 都被设置为 dhcpv6-stateless。
  • 分配池 - DHCP 分配的 IP 地址范围。例如,192.168.22.100,192.168.22.100 代表范围内的所有 up 的地址都可以被分配。
  • DNS 域名解析服务器 - 网络中可用的 DNS 服务器的 IP 地址。DHCP 把这些地址分配给实例用来进行域名解析。
  • 主机路由 - 静态主机路由。首先以 CIDR 的格式指定目标网络,然后指定下一个处理路由的地址。例如:192.168.23.0/24, 10.1.31.1。如果您需要为实例静态分配路由信息,请设置这个选项。

3.创建

新建的子网可以在网络的子网标签页中看到。您可以根据需要,通过点编辑来修改它的选项。现在,当您创建实例时,可以配置它来使用这个新创建的子网,并获得相应的 DHCP 选项。

3.7. 删除子网

当一个子网不再被使用时,您可以删除它。当您删除子网时,如果有实例还在使用它,删除操作会失败,dashboard 会显示一个错误信息。以下介绍了在一个网络中删除一个特定子网的步骤。

在 dashboard 中,选择项目 > 网络 > 网络,然后点您的网络名。选择目标子网后点删除子网

3.8. 添加一个路由器

OpenStack Networking 使用一个基于 SDN 的虚拟路由器提供网络路由服务。当您的实例需要和外部子网(包括物理网络之外的网络)进行通讯时,需要使用路由器。路由器和子网使用接口进行连接,每个子网都需要有自己的到路由器的接口。一个路由器的默认网关定义了它所接收的数据要发送到的下一个地址。它的网络通常会被设置为使用一个虚拟网桥把数据路由到外部物理网络。

1.在 dashboard 中,选择项目 > 网络 > 路由,然后点 +创建路由

2. 为新的路由设置一个名称,然后点创建路由

3.路由列表中的新路由器旁的设置网关

4.外部网络列表中,指定接收发送到外部地址的网络数据的网络。

5.设置网关。在添加了一个路由后,您需要配置已经创建的子网来使用这个路由器发送网络数据,您需要通过在子网和路由器间创建一个接口来实现它。

3.9. 删除一个路由

如果一个路由没有和其它接口相连,您可以删除这个路由。以下介绍了删除路由接口,然后再删除路由本身的方法。

1. 在 dashboard 中,选择项目 > 网络 > 路由,然后点您需要删除的路由名称。

2. 选择类型为 Internal Interface 的接口,点删除接口

3.路由列表中选择目标路由,点删除路由

3.10. 添加一个接口

使用接口可以把路由器和子网进行连接。路由器可以把实例所发出的数据发送到所在子网以外。以下过程会添加一个路由器接口并把它连接到一个子网。它使用"网络拓扑"功能来以图形化的形式显示所有的虚拟路由器,并可以通过这个功能执行网络管理的任务。

1. 在 dashboard 中,选项目 > 网络 > 网络拓扑

2. 找到您需要管理的路由器,把鼠标光标移到它上面,然后点添加接口

3. 指定要连接到这个路由器的子网。您可以指定一个 IP 地址,它可以用于测试和故障排除,如果可以 ping 到这个地址,则说明数据可以被正确路由。

4.添加接口

网络拓扑图会自动更新来显示在路由器和子网间添加的新接口。

3.11. 删除一个接口

当您不再需要路由器来处理到一个子网的接口的数据时,可以把这个接口从子网中删除。以下介绍了删除接口的步骤:

1. 在 dashboard 中选择项目 > 网络 > 路由

2. 点您需要删除的接口所在的路由。

3. 选择接口(类型应该是 Internal Interface),点删除接口

3.12. 配置 IP 地址

您可以使用以下介绍的方法来在 OpenStack Networking 中管理 IP 地址的分配。

3.12.1. 创建浮动 IP 地址池

通过使用浮动 IP 地址,您可以把外部的网络流量发送到您的 OpenStack 实例中。首先,您需要定义一组可以被路由的外部 IP 地址,然后可以把它们动态地分配给实例。OpenStack Networking 会把流入的网络数据发送到相关实例的浮动 IP 地址上。

注意

OpenStack Networking 会把浮动 IP 地址分配给在同一个 IP 范围/CIDR 中的所有项目(租户)。这意味着,浮动 IP 地址子网可以分配给任何项目或所有项目。您可以通过为特定项目设置配额来对这个进行管理。例如,您可以把 ProjectAProjectB 的默认配额设为 10,把 ProjectC 的配额设为 0

浮动 IP 地址池在创建一个外部子网时被定义。如果这个子网只包括主机的浮动 IP 地址,您可以使用 enable_dhcp=False 选项禁用 DCHP 服务。

# neutron subnet-create --name SUBNET_NAME --enable_dhcp=False --allocation_pool start=IP_ADDRESS,end=IP_ADDRESS --gateway=IP_ADDRESS NETWORK_NAME CIDR

例如:

# neutron subnet-create --name public_subnet --enable_dhcp=False --allocation_pool start=192.168.100.20,end=192.168.100.100 --gateway=192.168.100.1 public 192.168.100.0/24
3.12.2. 分配一个特定的浮动 IP

您可以使用 nova 命令来为实例分配一个特定的浮动 IP 地址。或者通过 dashboard 进行(请参阅 3.1.2 "更新一个实例(操作菜单)")

# nova floating-ip-associate INSTANCE_NAME IP_ADDRESS

在这个例子中,为名为 corp-vm-01 的实例分配了一个浮动 IP 地址:

# nova floating-ip-associate corp-vm-01 192.168.100.20
3.12.3. 分配一个随机的浮动 IP

浮动 IP 地址可以被动态地分配给实例。您不需要选择一个特定的 IP 地址,而只是要求 OpenStack Networking 从地址池中分配一个。从前面创建的池中分配一个浮动 IP 地址:

# neutron floatingip-create public
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| fixed_ip_address    |                                      |
| floating_ip_address | 192.168.100.20                       |
| floating_network_id | 7a03e6bc-234d-402b-9fb2-0af06c85a8a3 |
| id                  | 9d7e2603482d                         |
| port_id             |                                      |
| router_id           |                                      |
| status              | ACTIVE                               |
| tenant_id           | 9e67d44eab334f07bf82fa1b17d824b6     |
+---------------------+--------------------------------------+

当获得一个 IP 地址后,您可以把它分配给一个特定的实例。找到和您的实例相关的端口 ID(它和与实例相关联的固定 IP 地址相匹配)。这个端口 ID 会在以下步骤中使用来把实例的端口 ID 和浮动 IP 地址 ID 相关联。您还可以通过检查实例的第 3 栏中的 MAC 地址来确定正确的端口 ID。

# neutron port-list
+--------+------+-------------+--------------------------------------------------------+
| id     | name | mac_address | fixed_ips                                              |
+--------+------+-------------+--------------------------------------------------------+
| ce8320 |      | 3e:37:09:4b | {"subnet_id": "361f27", "ip_address": "192.168.100.2"} |
| d88926 |      | 3e:1d:ea:31 | {"subnet_id": "361f27", "ip_address": "192.168.100.5"} |
| 8190ab |      | 3e:a3:3d:2f | {"subnet_id": "b74dbb", "ip_address": "10.10.1.25"}|
+--------+------+-------------+--------------------------------------------------------+

使用 neutron 命令把浮动 IP 地址和一个实例的相关端口进行关联:

# neutron floatingip-associate 9d7e2603482d 8190ab

3.13. 创建多个浮动 IP 地址池

OpenStack Networking 支持每个 L3 agent 有一个浮动 IP 地址池。因此,如果您需要增加 L3 agent 的数量,您将可以创建额外的浮动 IP 地址池。

注意

请确保在您的环境中,只有一个 L3 agent 的 handle_internal_only_routers 被配置为 True(在 /etc/neutron/neutron.conf 文件中)。这个选项会把 L3 agent 配置为只管理非外部的路由器。

3.14. 桥接物理网络

以下介绍了把您的虚拟网络桥接到物理网络,从而使虚拟实例可以进行网络连接的方法。其中,我们使用物理 eth0 接口作为一个例子,把它映射到 br-ex 网桥;虚拟网桥会作为物理网络和虚拟网络之间的一个中间介质。其结果是,所有通过 eth0 的网络流量都会使用配置的 Open vSwitch 来访问实例。使用以下方法把一个物理 NIC 映射到虚拟 Open vSwitch 网桥:

注意

IPADDRNETMASK GATEWAYDNS1(名称解析服务器)必须被更新来与您的网络相匹配。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
Configure the virtual bridge with the IP address details that were previously allocated to eth0:
# vi /etc/sysconfig/network-scripts/ifcfg-br-ex
DEVICE=br-ex
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=192.168.120.10
NETMASK=255.255.255.0
GATEWAY=192.168.120.1
DNS1=192.168.120.1
ONBOOT=yes

现在,您可以为实例分配浮动 IP 地址,并使物理网络可以使用它们。