配置第 7 层内容交换

NetScaler Application Delivery Management (ADM) 与 OpenStack 进行调配,在 NetScaler 实例上配置第 7 层 (L7) 交换或基于内容的交换功能。内容交换与简单的负载平衡不同,因为特定类型的请求可以导向到特定服务器。在 OpenStack 中创建 L7 配置并将 NetScaler 实例作为提供者时,NetScaler ADM 会分配一个 NetScaler 实例,并部署与 L7 配置对应的内容交换和响应器配置。然后,NetScaler 实例可以根据用户请求的应用层特征对请求进行分发和负载平衡。

OpenStack 7 层 (L7) 负载平衡功能组合了负载平衡和内容交换,可针对特定类型内容提供优化交付。这只运行适用于内容的策略,从而提高了负载平衡器的性能。7 层负载平衡还有利于提高应用程序基础结构的效率。由于能够根据类型、URI 或数据分开内容,因此能够在应用程序基础结构中优化物理资源的分配。例如,浏览到 http://example-sports.com/about-us 的最终用户由托管有关公司和服务的内容的服务器池提供服务,而浏览到 http://example-sports.com/shopping-cart-football 的用户则由另一个服务器池提供服务,允许用户进行在线购买。

在 L7 交换中,负载平衡器实现为内容交换虚拟服务器,该服务器接受来自用户的 HTTP 请求,并将请求分发到应用程序服务器。L7 交换或内容交换允许您通过单点进入来访问各种后端服务(例如,不仅有 Web 应用程序、Web 服务门户、Web 邮件,而且有移动管理、不同语言的内容等)。即,您可以为您向用户提供的所有服务提供一个公用 IP 地址。

与较低级别的负载平衡不同,7 层交换不要求池中的所有服务器具有相同的内容。使用 L7 交换的负载平衡器配置假定不同池中的应用程序或后端服务器具有不同的内容。L7 交换可以根据 URI、主机、HTTP 标头或应用程序消息中的任何其他内容导向请求。应用程序服务器基本上服务于特定类型的内容。例如,一台服务器只能提供图像,另一台服务器可能运行服务器端脚本语言,如 PHP 和 ASP,另一台服务器可以提供 HTML、CSS 和 JavaScript 等静态内容。

L7 规则

以下属性在规则中定义,用于评估流量,它们将与规则中定义的值进行比较:

  • 主机名:将 HTTP 请求中的主机名与规则中的 value 参数进行比较。例如 www.example-sports.com。

  • path:HTTP URI 的路径部分将与规则中的值参数进行比较。例如,“www.example-sports.com/shopping-cart/football_pump.

  • file_type:URI 的最后一部分将与规则中的值参数进行比较。例如,txt、html、jpg、PNG、xls 等。

  • header:主要参数中定义的标头将与规则中的值参数进行比较。

  • cookie:主要参数指定的 cookie 将与规则中的值参数进行比较。cookie request-header 字段值包含存储的 URL 信息的名称和值对;常规语法如下 - Cookie: name=value。例如,一个正在寻找名为“stores”且值以“football-”开头的 Cookie 的规则将如下所示:type = Cookie, compare_type=StartsWith, key = stores value = football-。

比较类型

评估流量时,L7 策略将以下表达式与规则中定义的属性进行比较。

  • regex:Perl 类型正则表达式匹配

  • starts_with:字符串开头

  • ends_with:字符串结尾

  • contains:字符串包含

  • equal_to:字符串等于

注意

主机名、路径、标题和 Cookie 属性支持所有比较类型,但 file_type 属性仅支持正则表达式和 equal_to。

L7 策略

L7 策略处理传入 HTTP 流量,当匹配策略中定义的所有规则时返回“true”值。

在任何 L7 策略中,所有规则都通过 AND 运算符以逻辑方式连接在一起。请求必须匹配所有规则,策略才会返回“true”值。负载平衡器采取的操作基于策略返回的值。您可以创建具有相同操作的另一个策略,在规则之间实现逻辑 OR 运算。

例如,您可以创建一个策略,在此策略中,传入 HTTP 请求可以包含词语“EXAMPLE-SPORTS”、“SPORTS-FOOTBALL”或“EXAMPLE-FOOTBALL”,以便负载平衡器可以采取合适的操作将这些请求转发到 Example-sports ecommerce 公司的服务器池,从而为请求的内容提供服务。您可以创建另一个策略,它采取相同操作但匹配“example-sports”、“example-sports-football”或“example-football”。如果用户发送的 HTTP 请求包含这六个关键字中的任何一个,负载平衡器都将请求转发到 Example-Sports 服务器。

根据策略中定义的规则,L7 策略可以采取以下任何操作:

  • 重定向到池 - 将请求转发到与 L7 策略关联的规则标识的应用程序服务器。即,您可以创建一个应用程序规则以根据域名将请求定向到特定负载平衡器池。例如,您可以创建一个规则,将针对 example-football.com 的一些请求定向到 pool_1,将针对 example-sports-online_purchase.com 的其他请求定向到 pool_2。

  • 重定向到 URL - 向客户端发送位置响应头包含新位置的重定向 HTTP 响应。浏览器使用新位置更新地址栏并发出新请求。用例很多。例如,如果 Web 站点地址发生变化,您可以将请求重定向到新地址,而不是丢弃。或者,在 Web 站点维护期间,您可以将用户重定向到只读站点。

  • 拒绝 - 拒绝请求且不采取任何进一步操作。例如,您可以返回 401 未经授权的响应,以拒绝访问受限网页的用户。

内容交换配置包括内容交换虚拟服务器、负载平衡设置(包括负载平衡服务器和服务)以及内容交换策略。创建内容交换虚拟服务器和策略后,应将每个策略绑定到内容交换虚拟服务器。将策略绑定到内容交换虚拟服务器时,应指定目标负载平衡虚拟服务器。请求到达内容交换虚拟服务器时,该虚拟服务器将关联的内容交换策略应用于该请求。策略的优先级定义绑定到内容交换虚拟服务器的策略的评估顺序。

可以将具有侦听器 ID 的任何池分配为流量转移到的默认虚拟服务器池。池与侦听器松散绑定在一起,仅通过实现 L7 策略与侦听器关联。还可以直接在负载平衡器下创建池,无需绑定到侦听器。在这种情况下,池创建时处于“pending_create”状态。由于 L7 策略与侦听器紧密绑定在一起,因此必须创建并实现包含池 ID 的 L7 策略,池才能处于“active”状态并开始接收流量请求。

一个池可以由多个 L7 策略提供服务,但在至少附加了一个策略时保持“active”状态。删除最后一个策略后,池返回到“pending_create”状态,直到创建了另一个策略并与之关联。如果删除池本身,则原本由它接收的所有 HTTP 请求都重定向到默认池。

OpenStack L7 策略与 NetScaler 实体之间的对应关系

     
OpenStack NetScaler 实体 说明
操作为 REDIRECT_TO_POOL 的 L7 策略 内容交换策略 > 内容交换操作 NetScaler ADM 创建了内容交换策略,该策略绑定到内容交换虚拟服务器并与内容交换操作相关联,该内容交换操作指定用于内容检索和向用户展示内容的目标应用程序服务器池。
操作为 REDIRECT_TO_URL 的 L7 策略 响应方策略 > 响应方操作 NetScaler ADM 创建响应器策略,该策略绑定到内容交换虚拟服务器,并与指定向用户显示的目标 URL 的响应者操作相关联。
操作为 REJECT 的 L7 策略 响应方策略 > 丢弃请求 NetScaler ADM 创建响应器策略,该策略绑定到内容交换虚拟服务器并与丢弃请求的响应者操作相关联。

如果评估结果为“true”的 L7 策略的操作将流量重定向到处于“create_pending”状态的池,则 NetScaler ADM 会实现指定的池和负载平衡虚拟服务器。NetScaler ADM 从 L7 策略中创建内容交换策略,并使用相应的内容交换操作将请求重定向到与该池相关的负载平衡虚拟服务器。如果第二个 L7 策略重定向到同一个池,NetScaler ADM 会创建内容交换策略和内容交换操作,将流量重定向到与该池关联的现有负载平衡虚拟服务器。

策略定位

OpenStack 中对 L7 策略的评估由其优先级确定。在 OpenStack 中,默认情况下,按策略的创建顺序为其分配优先级。第一个创建的策略编号为 1,后续创建的策略连续编号。但您可以更改策略的优先级,为其分配不同的优先级。策略始终按其优先级顺序进行评估。首先运行与特定请求匹配的第一个策略。

创建策略时,应注意以下事项:

  • 如果为新策略分配的优先级与某个现有策略相同,则新策略采用该优先级。现有策略的优先级将会降低。如有必要,还可以降低其他策略的优先级以保持策略的评估顺序。

  • 如果创建新策略时未指定位置,则新策略将只是附加到列表中。

  • 如果创建新策略时为其分配的位置大于列表中已有的策略数,则新策略将附加到列表中,即,新策略的优先级将始终为下一个可用优先级。例如,假定有三个策略 A、B 和 C,优先级为 1、2 和 3,如果创建一个策略并为其分配优先级 8,则新策略的优先级将变为 4。

  • 如果向列表添加策略或从列表中删除策略,则策略位置值将从 1 重新排序,而不会跳过数字。例如,假定策略 A、B、C 和 D 的位置值为 1、2、3 和 4,如果从列表中删除策略 B,则策略 C 现在排在第二个位置,策略 D 排在第三个位置。

在 NetScaler ADM 中,始终存在与优先级为 1 的 csvserver 关联的默认策略。此默认策略指定 lbvserver 在任何给定时间点处理的 TCP 连接数。因此,当在 NetScaler 中创建相应的响应程序策略和内容交换策略时,它们的优先级总是高于相应 L7 策略的优先级 1。例如,如果 L7 策略的优先级为 1,则创建的内容交换策略的优先级为 2。同样,如果 L7 策略的优先级为 2,则创建的响应方策略的优先级为 3。

在 OpenStack 中,首先评估“拒绝”或“redirect_to_url”策略,然后评估“redirect_to_pool 策略。在 NetScaler 实例中,始终首先评估响应程序策略,以删除请求或向用户提供重定向的 Web 地址,最后评估内容切换策略。如果内容交换策略和响应方策略相互排斥,则此评估顺序通常不会导致出现任何冲突。也就是说,两个 L7 策略不能具有相同的表达式。派生表达式将添加到响应程序和内容切换策略中,以避免此类冲突。例如,编写一个表达式用于拒绝发送到“sports-football.com”的所有请求,编写另一个表达式用于允许发送到“example-sports-football.com”的请求。创建 L7 策略以使拒绝请求的所有响应方策略排列在评估列表顶部,后面依次接着用于 Web 定向的响应方策略和内容交换策略。

在 NetScaler ADM 中,始终存在与优先级为 1 的 csvserver 关联的默认策略。此默认策略指定 lbvserver 在任何给定时间点处理的 TCP 连接数。因此,当在 NetScaler 中创建相应的响应程序策略和内容交换策略时,它们的优先级总是高于相应 L7 策略的优先级 1。例如,如果 L7 策略的优先级为 1,则创建的内容交换策略的优先级为 2。同样,如果 L7 策略的优先级为 2,则创建的响应方策略的优先级为 3。

在 OpenStack 中,首先评估“拒绝”或“redirect_to_url”策略,然后评估“redirect_to_pool 策略。在 NetScaler 中,始终首先评估响应程序策略,以删除请求或向用户提供重定向的 Web 地址,最后评估内容切换策略。如果内容交换策略和响应方策略相互排斥,则此评估顺序通常不会导致出现任何冲突。也就是说,没有两个 L7 策略具有类似的表达式。响应程序和内容切换策略中会添加类似的派生表达式,以避免此类冲突。例如,编写一个表达式用于拒绝发送到“sports-football.com”的所有请求,编写另一个表达式用于允许发送到“example-sports-football.com”的请求。创建 L7 策略以使拒绝请求的所有响应方策略排列在评估列表顶部,后面依次接着用于 Web 定向的响应方策略和内容交换策略。

配置任务

通过 Neutron LBaaS 命令执行 L7 策略和操作实现。

在 OpenStack 中设置环境变量并创建负载平衡器(例如 LB1)。成功创建负载平衡器后,创建侦听器和池(例如 L1、P1 和 P2),并向池添加成员和监视器。例如,P1 是 L1 的默认池,P2 是绑定到 LB1 的池并管理应用程序服务器。

有关如何使用命令行配置 LBaaS V2 的更多信息,请参阅使用命令行 配置 LBaaS V2

以下命令创建策略并定义特定操作:

创建用于丢弃请求的 L7 策略

neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action<action-name>

示例

neutron lbaas-l7policy-create –name policy11 –action REJECT –listener L1

上述命令创建响应方策略 policy11 并将其绑定到内容交换服务器以拒绝请求。由于没有为此策略创建规则,因此策略的评估结果为“false”并拒绝请求。

创建用于将请求重定向到特定 URL 的 L7 策略

neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action <action-name> --redirect-url <redirect-url>

示例

neutron lbaas-l7policy-create –name policy12 –action REDIRECT_TO_URL –listener admin-list1 –redirect-url http://example-sports/about-us.html

上述命令创建响应方操作以将请求重定向到 URL、创建具有操作的响应方策略以及将此策略绑定到内容交换虚拟服务器。

neutron lbaas-l7rule-create --type HOST_NAME --compare-type CONTAINS --value <value-string> <L7 policy name>

neutron lbaas-l7rule-create --type PATH --compare-type CONTAINS --value <value-string> <L7 policy name>

可以使用 AND 运算符连接上述两个规则为响应方策略派生表达式。

创建用于将请求重定向到池的 L7 策略

neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action <action-name> --redirect-pool <redirect-pool>

示例

neutron lbaas-l7policy-create –name policy13 –action REDIRECT_TO_POOL –listener admin-list1 –redirect-pool admin-pool2

如果这是第一个 L7 策略,则上述命令将 P2 与 LB1 一起实现、创建内容交换重定向操作以及将请求重定向到 LB1。如果 P2 已存在,则该命令将创建内容交换重定向操作以及将请求重定向到 LB1。

配置第 7 层内容交换