配置七层内容切换
NetScaler Console 与 OpenStack 协同工作,以在 NetScaler 实例上配置七层 (L7) 交换或基于内容的交换功能。内容交换与简单的负载均衡不同,它能够将特定类型的请求定向到特定服务器。当在 OpenStack 中以 NetScaler 实例作为提供者创建 L7 配置时,NetScaler Console 会分配一个 NetScaler 实例,并部署与 L7 配置相对应的内容交换和响应器配置。然后,NetScaler 实例可以根据请求的应用层特性分发和负载均衡用户请求。
OpenStack 七层 (L7) 负载均衡功能结合了负载均衡和内容交换,以提供特定类型内容的优化交付。这通过仅运行适用于内容的策略来提高负载均衡器的性能。七层负载均衡还有助于提高应用程序基础设施的效率。根据类型、URI 或数据分离内容的能力,可以更好地分配应用程序基础设施中的物理资源。例如,浏览到
http://example-sports.com/about-us 的最终用户由托管公司和服务的相关内容的服务器池提供服务,而浏览到 http://example-sports.com/shopping-cart-football 的用户则由另一个服务器池提供服务,该服务器池允许用户进行在线购买。
在 L7 交换中,负载均衡器作为内容交换虚拟服务器实现,接收来自用户的 HTTP 请求并将这些请求分发到应用程序服务器。L7 交换或内容交换允许您拥有一个单点入口来访问各种后端服务(例如,不仅是 Web 应用程序、Web 服务门户、Web 邮件,还包括移动管理、不同语言的内容等)。也就是说,您可以为向用户提供的所有服务提供一个公共 IP 地址。
与低层负载均衡不同,七层交换不要求池中的所有服务器都具有相同的内容。使用 L7 交换的负载均衡器配置期望来自不同池的应用程序或后端服务器具有不同的内容。L7 交换机可以根据 URI、主机、HTTP 标头或应用程序消息中的任何其他内容来定向请求。应用程序服务器本质上是提供特定类型的内容。例如,一个服务器只能提供图像,另一个可能运行服务器端脚本语言,如 PHP 和 ASP,而另一个可以提供静态内容,如 HTML、CSS 和 JavaScript。
L7 规则
以下属性在规则中定义,用于评估流量,并与规则中定义的值进行比较:
-
主机名:HTTP 请求中的主机名与规则中的值参数进行比较。例如,“www.example-sports.com.”
-
路径:HTTP URI 的路径部分与规则中的值参数进行比较。例如,“www.example-sports.com/shopping-cart/football_pump.html”
-
文件\_类型: URI 的最后一部分与规则中的值参数进行比较。例如,txt、html、jpg、PNG、xls 等。
-
标头:键参数中定义的标头与规则中的值参数进行比较。
-
Cookie:键参数命名的 Cookie 与规则中的值参数进行比较。Cookie 请求头字段值包含为该 URL 存储的名称和值对信息;一般语法如下 - Cookie: name=value。例如,查找名为“stores”且值以“football-”开头的 Cookie 的规则将如下所示:type = Cookie, compare_type=StartsWith, key = stores value = football-。
比较类型
在评估流量时,L7 策略会将以下表达式与规则中定义的属性进行比较。
-
正则表达式: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 电子商务公司的服务器池以提供请求的内容。您可以创建另一个策略,该策略执行相同的操作,但匹配“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 响应,其中位置响应标头包含新位置。浏览器将使用新位置更新地址栏并发出新请求。用例很多。例如,如果网站地址已更改,您可以将请求重定向到新地址而不是丢弃。或者,在网站维护期间,您可以将用户重定向到只读站点。
-
拒绝 - 拒绝请求,不采取进一步行动。例如,您可以返回 401 未授权响应,以拒绝用户访问受限网页。
内容切换配置包括内容切换虚拟服务器、由负载均衡虚拟服务器和服务组成的负载均衡设置以及内容切换策略。创建内容切换虚拟服务器和策略后,将每个策略绑定到内容切换虚拟服务器。将策略绑定到内容切换虚拟服务器时,需要指定目标负载均衡虚拟服务器。当请求到达内容切换虚拟服务器时,虚拟服务器会将关联的内容切换策略应用于该请求。策略的优先级定义了绑定到内容切换虚拟服务器的策略的评估顺序。
任何具有侦听器 ID 的池都可以被指定为虚拟服务器的默认池,流量将重定向到该池。池与侦听器松散绑定,并且仅通过实施 L7 策略才能与侦听器关联。池也可以直接在负载均衡器下创建,而不必与侦听器绑定。在这种情况下,池将以“pending\_create”状态创建。由于 L7 策略与侦听器紧密绑定,因此必须创建并实施包含池 ID 的 L7 策略,才能使池变为“active”状态并开始接收流量请求。
一个池可以由多个 L7 策略提供服务,但如果至少有一个策略附加到它,它将保持“active”状态。当最后一个策略被移除时,池将返回到“pending\_create”状态,直到创建并关联另一个策略。如果池本身被移除,所有它本应接收到的 HTTP 请求都将被重定向到默认池。
OpenStack L7 策略与 NetScaler 实体之间的映射
| OpenStack | NetScaler 实体 | 描述 |
| 具有 REDIRECT_TO_POOL 操作的 L7 策略 | 内容切换策略 > 内容切换操作 | NetScaler Console 创建一个内容切换策略,该策略绑定到内容切换虚拟服务器,并与一个内容切换操作相关联,该操作指定用于内容检索和向用户呈现的应用程序服务器目标池。 |
| 具有 REDIRECT_TO_URL 操作的 L7 策略 | 响应器策略 > 响应器操作 | NetScaler Console 创建一个响应器策略,该策略绑定到内容切换虚拟服务器,并与一个响应器操作相关联,该操作指定要呈现给用户的目标 URL。 |
| 具有 REJECT 操作的 L7 策略 | 响应器策略 > 丢弃请求 | NetScaler Console 创建一个响应器策略,该策略绑定到内容切换虚拟服务器,并与一个丢弃请求的响应器操作相关联。 |
如果 L7 策略的操作评估为“true”并将流量重定向到处于“create\_pending”状态的池,NetScaler Console 将实现指定的池以及负载均衡虚拟服务器。NetScaler Console 从 L7 策略创建内容切换策略,并使用相应的内容切换操作将请求重定向到与该池关联的负载均衡虚拟服务器。如果第二个 L7 策略重定向到同一个池,NetScaler Console 将创建内容切换策略和内容切换操作,以将流量重定向到与该池关联的现有负载均衡虚拟服务器。
策略定位
OpenStack 中 L7 策略的评估由其优先级决定。在 OpenStack 中,默认情况下,策略按照创建顺序分配优先级。首先创建的策略编号为“1”,随后创建的策略按顺序编号。但您可以更改策略的优先级并为其分配不同的优先级。策略始终按照其优先级的顺序进行评估。第一个匹配特定请求的策略总是最先运行。
创建策略时,请注意以下几点:
-
如果您为新策略分配与现有策略相同的优先级,则新策略将获得该优先级。现有策略的优先级会降低。如有必要,其他策略的优先级也会降低,以保持策略的评估顺序。
-
如果您创建新策略时未指定位置,则新策略将直接附加到列表中。
-
如果您创建新策略并为其分配一个大于列表中现有策略数量的位置,则新策略将附加到列表末尾,也就是说,新策略总是获得下一个可用的优先级。例如,如果存在优先级分别为 1、2 和 3 的三个策略 A、B 和 C,并且您创建了一个策略并为其分配优先级 8,则新策略的优先级将变为 4。
-
如果您向列表中添加策略或从列表中删除策略,策略位置值将从 1 开始重新排序,不跳过任何数字。例如,如果策略 A、B、C 和 D 的位置值分别为 1、2、3 和 4,并且您从列表中删除了策略 B,则策略 C 现在将占据第二个位置,策略 D 将占据第三个位置。
在 NetScaler Console 中,始终存在一个与
csvserver 关联的默认策略,其优先级为 1。此默认策略指定 lbvserver 在任何给定时间处理的 TCP 连接数。因此,当在 NetScaler 中创建相应的响应器策略和内容切换策略时,它们的优先级总是比相应的 L7 策略的优先级高 1。例如,当评估优先级为 1 的 L7 策略时,会创建一个优先级为 2 的内容切换策略。同样,当评估优先级为 2 的 L7 策略时,会创建一个优先级为 3 的响应器策略。
在 OpenStack 中,首先评估“reject”或“redirect\_to\_url”策略,然后评估“redirect\_to\_pool”策略。在 NetScaler 实例中,响应器策略总是最先评估,以丢弃请求或向用户呈现重定向的网址,而内容切换策略最后评估。如果内容切换策略和响应器策略是互斥的,这种评估顺序通常不会引起任何冲突。也就是说,两个 L7 策略不能具有相同的表达式。在响应器和内容切换策略中添加派生表达式以避免此类冲突。例如,编写一个表达式来拒绝所有对“sports-football.com”的请求,并编写另一个表达式来允许对“example-sports-football.com”的请求。创建 L7 策略时,应将所有拒绝请求的响应器策略排在评估列表的顶部,然后是用于 Web 直接的响应器策略,最后是内容切换策略。
在 NetScaler Console 中,始终存在一个与
csvserver 关联的默认策略,其优先级为 1。此默认策略指定 lbvserver 在任何给定时间处理的 TCP 连接数。因此,当在 NetScaler 中创建相应的响应器策略和内容切换策略时,它们的优先级总是比相应的 L7 策略的优先级高 1。例如,当评估优先级为 1 的 L7 策略时,会创建一个优先级为 2 的内容切换策略。同样,当评估优先级为 2 的 L7 策略时,会创建一个优先级为 3 的响应器策略。
在 OpenStack 中,首先评估“reject”或“redirect\_to\_url”策略,然后评估“redirect\_to\_pool”策略。在 NetScaler 中,响应器策略总是最先评估,以丢弃请求或向用户呈现重定向的网址,而内容切换策略最后评估。如果内容切换策略和响应器策略是互斥的,这种评估顺序通常不会引起任何冲突。也就是说,没有两个 L7 策略具有相似的表达式。在响应器和内容切换策略中添加相似的派生表达式以避免此类冲突。例如,编写一个表达式来拒绝所有对“sports-football.com”的请求,并编写另一个表达式来允许对“example-sports-football.com”的请求。创建 L7 策略时,应将所有拒绝请求的响应器策略排在评估列表的顶部,然后是用于 Web 直接的响应器策略,最后是内容切换策略。
配置任务
L7 策略和操作的实现通过 Neutron LBaaS 命令执行。
在 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 --名称 policy13 --操作 REDIRECT\_TO\_POOL --监听器 admin-list1 --重定向池 admin-pool2
如果这是第一个 L7 策略,则上述命令将 P2 与 LB1 一起实施,创建内容交换重定向操作并将请求重定向到 LB1。如果 P2 已存在,则该命令创建内容交换重定向操作并将请求重定向到 LB1。