OpenStack 与 NSX Advanced Load Balancer 的集成支持 IPv6。本节中介绍的集成已针对 OpenStack Ocata 进行了测试,该测试侧重于解决可扩展性和性能问题。
软件定义的网络 (SDN) 支持 Contrail。
设置信息
在常规设置中,将在管理网络(在本例中为 avimgmt
)中启动 NSX Advanced Load Balancer Controller。控制器将用于针对 OpenStack 无权访问云和通用 OpenStack 云进行测试。客户端和服务器实例在无状态地址自动配置 (Stateless Address Auto Configuration, SLAAC) 中分别基于客户端网络和服务器网络启动。这些实例位于基于有状态动态主机配置协议版本 6 (Dynamic Host Configuration Protocol version 6, DHCPv6) 的客户端网络或服务器网络中。
网络拓扑
考虑了以下网络组合:
IPv4 网络。
IPv6 网络,进一步细分为 SLAAC、DHCPv6 无状态和 DHCPv6 有状态。在网络创建期间,将通过 Horizon UI 或 OpenStack CLI 选择这些网络类型。
为虚拟服务选择以客户端前缀开头的网络,为后端服务器选择以服务器前缀开头的网络。
因此,考虑了 16 个网络,如下面的屏幕截图中所示:
这样做是为了涵盖所有可能的场景,而并非确切的要求。
因此,该设置由单臂和双臂设置组成,在这两种设置中,所有对象可以分别包含在一个网络或不同网络中。在本节中,将使用双臂设置创建虚拟服务(单独的网络),然后将流量发送到位于其他网络上的服务器。在双臂设置中,虚拟服务位于一个网络中,其后端服务器位于另一个网络中。
使用的 IP 寻址方案
虚拟服务将使用有状态 DHCPv6、SLAAC 或静态 IPv6 寻址进行创建。在本例中,从 SLAAC v6 或 DHCPv6 有状态网络中选择了 IP 地址,同时在实例中使用 IPv4。
OpenStack 不支持浮动 IPv6。因此:
对于双堆栈虚拟服务,浮动 IP 将始终转换 (NAT) 为专用 v4 VIP 地址。
对于 IPv6 虚拟 IP (VIP),与双堆栈虚拟服务一样,IPv6 VIP(无论是专用还是公用)必须与专用 IPv4 VIP 网络位于同一接口上,才能放置成功。
以下 IPv4、IPv6 和双堆栈网络组合涵盖了所有寻址类型:
静态或手动配置。
无状态地址自动配置 (SLAAC):使用路由器通告 (Router Advertisement, RA) 将 IPv6 前缀 (/64) 分配给终端节点,该节点自行构建地址的接口 ID (Interface ID, IID) 部分(最后 /64 位)。
有状态 DHCPv6:类似于 IPv4 DHCP,DHCPv6 服务器负责处理整个 IPv6 寻址和配置选项。
仅在收到来自指定路由器的路由通告 (RA) 时,SE 才会启动 DHCPv6 客户端。
无状态 DHCPv6:使用 SLAAC 进行地址分配,同时使用 DHCPv6 进行选项分配,例如域名系统 (Domain Name System, DNS) 和域名。
网络
这与设置无关,可根据需要进行更改。
如上面的网络拓扑中所示,所有网络都必须在相应的虚拟 LAN (Virtual LAN, VLAN) 207 网络中进行路由。此处,VLAN 207 是提供程序网络 VLAN。此路由要求网络中具有一个路由器。
连接到路由器的接口
每个网络都必须有一个连接到路由器(IPv4 或 IPv6 路由器)的接口,如下面的屏幕截图中所示:
IPv6 路由通告
路由器配置为处理 IPv6 路由通告 (RA)。如果 DHCPv6 是所选的 IP 寻址方案,则必须跨整个 OpenStack 发送 RA,以便在 SE 上执行其工作。同样,在创建 IPv6 网络后,需为每个 IPv6 网络选择链路本地地址 (Link-Local Address, LLA),并将其更新为每个 IPv6 网络的默认网关。配置如下所示:
root@openstack-ocata:~# ip netns | grep qrouter qrouter-3eeb3d41-8955-431c-b2bd-1934c97900a9 qrouter-017709bf-5ab1-43b5-a372-75c554c1b961
root@openstack-ocata:~# ip netns exec qrouter-017709bf-5ab1-43b5-a372-75c554c1b961 bash
ip a
如下面的输出中所示,inet6 fe80::f816:3eff:fe88:18ff
值是在 IPv6 网络设置下更新的 LLA。
13: qr-c7e57476-e5@if109: mtu 1450 qdisc noqueue state UP group default qlen 1000 link/ether fa:16:3e:88:18:ff brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 700::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fe88:18ff/64 scope link valid_lft forever preferred_lft forever
安全组
对于通用 OpenStack 云,将自动为 SE 创建安全组规则。
对于无 Orchestrator 云,如果按照使用 Heat 模板在无权访问 OpenStack 云中创建服务引擎中所述的步骤手动启动 SE,则必须允许 IPv4 和 IPv6 的某些规则,才能正常传输流量(如 Internet 控制消息协议 (Internet Control Message Protocol, ICMP) 和安全 Shell (Secure Shell, SSH))。打开端口,如 22、80、443 和 8443。如果未将 8443 配置为例外,则 SE 将无法通过 SSH 访问控制器,反之亦然。
Allowed-Address-Pairs
通过使用允许的地址对扩展,可扩展端口属性,使您能够指定任意 mac_address
/ip_address
(无类别域间路由 (Classless Inter-Domain Routing, CIDR))对,这些地址对能够通过端口,而无论与网络关联的子网如何。
对于通用 OpenStack 云,默认情况下将在云设置中启用此功能,因此无需进一步更改。
对于无 Orchestrator 云,可以使用 OpenStack CLI 或通过 Horizon 启用此功能。
allowed-address-pairs Neutron 扩展允许从端口中输出具有特定 CIDR 的流量。NSX Advanced Load Balancer 使用此扩展将 VIP 放置在服务引擎 (SE) 数据端口上。因此,SE 数据端口上的 VIP 允许 VIP 流量通过这些数据端口输出。
在 SE 端口上添加 allowed-address-pairs,以便安全组不会丢弃数据包。对于 MLS/OVS 插件,您可以为每个 SE 端口或特定 VIP 地址添加一次值为 0.0.0.0/0 和 ::/0(如果需要,对于 IPv6 或双堆栈)的 allowed-address-pairs。
如果将 Contrail 用作 SDN 类型与 NSX Advanced Load Balancer 一起使用,则会将 VIP 地址添加到固定地址列表中,如此处所述。要区分接口 IP,必须根据是 IPv4 还是 IPv6,使用 /24 或 /120 前缀将同一 IP 添加到 AAP 中。
neutron port-update da0e1e9a-312d-41c2-b15f-f10ac344ef03 --allowed-address-pairs type=dict list=true ip_address=192.168.1.222/32 neutron port-update da0e1e9a-312d-41c2-b15f-f10ac344ef03 --allowed-address-pairs type=dict list=true ip_address=2001::6/128
如果为 True,将使用 allowed-address-pairs
扩展。如果底层网络插件不支持此功能,则 VIP 流量将无法正常传输。
以下屏幕截图显示了 IPv4 对应的 AAP 条目(无 Orchestrator 云)。
配置 NSX Advanced Load Balancer
按照“为 OpenStack 安装 NSX Advanced Load Balancer”中的说明,为 OpenStack 安装 NSX Advanced Load Balancer。
使用适当的 IP 寻址机制进行虚拟服务和池 IPv6 配置,例如 SLAACv6。
使用 OpenStack UI 导航到 openstack-horizon/networks/subnets/id,以获取子网 ID;也可以按如下所述方式使用 OpenStack CLI 获取子网 ID:
root@openstack-ocata:/root# openstack subnet show client-v4-network +-------------------+--------------------------------------+ | Field | Value | +-------------------+--------------------------------------+ | allocation_pools | 192.168.10.2-192.168.10.254 | | cidr | 192.168.10.0/24 | | created_at | 2017-12-08T13:06:54Z | | description | | | dns_nameservers | | | enable_dhcp | True | | gateway_ip | 192.168.10.1 | | host_routes | | | id | 337c70de-3be5-4072-8e7f-04d61ee6ceb5 | | ip_version | 4 | | ipv6_address_mode | None | | ipv6_ra_mode | None | | name | client-v4-network | | network_id | 85b861a8-7d87-4e03-8cfe-444082ff1412 | | project_id | 39155680f7d24b628d9752057527ccb9 | | revision_number | 4 | | segment_id | None | | service_types | | | subnetpool_id | None | | updated_at | 2017-12-11T18:13:45Z | +-------------------+--------------------------------------+
IPv4 池和 IPv4 虚拟服务
要配置 IPv4 池,请执行以下操作:
导航到
。单击创建池。
指定名称和类型详细信息,然后单击设置云和 VRF。
为云和 VRF 上下文输入相应内容,然后单击设置。
单击服务器选项卡。
指定 IPv4 服务器 IP 地址,然后单击保存。
要配置 IPv4 虚拟服务,请执行以下操作:
导航到创建虚拟服务下拉菜单中选择高级设置。
,然后在在新建虚拟服务页面中的 VIP 地址部分下,从 VS VIP 下拉菜单中单击创建 VS VIP。
创建 VS VIP 页面如下所示:
在 VIP 下单击添加。
在编辑 VIP 页面中指定 IPv4 地址,然后单击保存。
在创建 VS VIP 屏幕中,单击保存。
您可以根据需要在其余选项卡下输入可选内容,然后在新建虚拟服务窗口中单击保存。
IPv4v6 池和 IPv4v6 虚拟服务(双堆栈)
在双堆栈网络中,如果使用 IPv4 或 IPv6 地址创建了具有单个 VIP 的虚拟服务,则无法通过添加额外的 IP 地址将其转换为双堆栈。
要配置双堆栈池,请执行以下操作:
导航到创建池。
,然后单击在创建池页面中,指定名称和类型详细信息,然后单击设置云和 VRF。
在服务器选项卡下,提供 IPv4 或 IPv6 服务器 IP 地址,如下所示:
完成池创建。
要配置双堆栈虚拟服务,请执行以下操作:
导航到
。在创建虚拟服务下拉菜单中选择高级设置。
在新建虚拟服务屏幕中,从 VS VIP 下拉菜单中单击创建 VS VIP。
在创建 VS VIP 屏幕中,单击 VIP 字段下的添加。
指定 IPv4 地址和 IPv6 地址的值,如下所示。
单击保存。
故障排除:流量捕获
可使用 tcpdump 命令捕获流量,以进行故障排除。必须在 OpenStack 中相应 qrouter
命名空间的 qr 接口中执行捕获。
在 SLAACv6 模式下禁用临时 IP 生成功能
在 NSX Advanced Load Balancer 服务引擎中,如果为 SLAACv6 模式禁用了临时 IP 生成功能,您将只有全局动态地址。
5: eth2: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether fa:16:3e:10:7a:0c brd ff:ff:ff:ff:ff:ff inet6 1100::f816:3eff:fe10:7a0c/64 scope global dynamic valid_lft 86306sec preferred_lft 14306sec inet6 fe80::f816:3eff:fe10:7a0c/64 scope link valid_lft forever preferred_lft forever