配置第 7 层内容切换
NetScaler Application Delivery Management (ADM) 与 OpenStack 协同编排,以在 NetScaler 实例上配置第 7 层 (L7) 切换或基于内容切换的功能。内容切换与简单负载均衡的不同之处在于,特定类型的请求可以定向到特定服务器。当在 OpenStack 中使用 NetScaler 实例作为提供程序创建 L7 配置时,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 请求中的主机名与规则中的值参数进行比较。例如,“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 策略会将以下表达式与规则中定义的属性进行比较。
-
regex:Perl 类型正则表达式匹配
-
starts_with:字符串开头是
-
ends_with:字符串结尾是
-
contains:字符串包含
-
equal_to:字符串等于
注意
主机名、路径、标头和 Cookie 属性支持所有比较类型,但文件类型属性仅支持 regex 和 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 响应,其中 Location 响应标头包含新位置。浏览器将使用新位置更新地址栏并发出新请求。用例有很多。例如,如果网站地址已更改,您可以将请求重定向到新地址而不是丢弃。或者,在网站维护期间,您可以将用户重定向到只读站点。
-
拒绝 - 拒绝请求,不执行任何进一步操作。例如,您可以返回 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 中,始终有一个与 csvserver 关联的默认策略,其优先级为 1。此默认策略指定 lbvserver 在任何给定时间点处理的 TCP 连接数。因此,当在 NetScaler 中创建相应的响应程序策略和内容切换策略时,它们的优先级始终比相应的 L7 策略的优先级高 1。例如,当评估优先级为 1 的 L7 策略时,会创建一个优先级为 2 的内容切换策略。同样,当评估优先级为 2 的 L7 策略时,会创建一个优先级为 3 的响应程序策略。
在 OpenStack 中,“reject”或“redirect_to_url”策略首先进行评估,然后评估“redirect_to_pool”策略。在 NetScaler 实例中,响应程序策略始终首先进行评估,以丢弃请求或向用户呈现重定向的 Web 地址,而内容切换策略最后进行评估。如果内容切换策略和响应程序策略是互斥的,则这种评估顺序通常不会引起任何冲突。也就是说,两个 L7 策略不能具有相同的表达式。在响应程序和内容切换策略中添加派生表达式以避免此类冲突。例如,编写一个表达式来拒绝所有对“sports-football.com”的请求,并编写另一个表达式来允许对“example-sports-football.com”的请求。创建 L7 策略,以便所有拒绝请求的响应程序策略都排列在评估列表的顶部,然后是用于 Web 直接的响应程序策略,最后是内容切换策略。
在 NetScaler ADM 中,始终有一个与 csvserver 关联的默认策略,其优先级为 1。此默认策略指定 lbvserver 在任何给定时间点处理的 TCP 连接数。因此,当在 NetScaler 中创建相应的响应程序策略和内容切换策略时,它们的优先级始终比相应的 L7 策略的优先级高 1。例如,当评估优先级为 1 的 L7 策略时,会创建一个优先级为 2 的内容切换策略。同样,当评估优先级为 2 的 L7 策略时,会创建一个优先级为 3 的响应程序策略。
在 OpenStack 中,“reject”或“redirect_to_url”策略首先进行评估,然后评估“redirect_to_pool”策略。在 NetScaler 中,响应程序策略始终首先进行评估,以丢弃请求或向用户呈现重定向的 Web 地址,而内容切换策略最后进行评估。如果内容切换策略和响应程序策略是互斥的,则这种评估顺序通常不会引起任何冲突。也就是说,没有两个 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 –name policy13 –action REDIRECT_TO_POOL –listener admin-list1 –redirect-pool admin-pool2
如果这是第一个 L7 策略,则上述命令会实施 P2 以及 LB1,创建内容切换重定向操作并将请求重定向到 LB1。如果 P2 已存在,则该命令会创建内容切换重定向操作并将请求重定向到 LB1。