vlambda博客
学习文章列表

NSX高级负载均衡的“高级”玩儿法


很多用户在了解了VMware NSX高级负载均衡的基本功能之后,经常会问到的一个问题是:

“我现在的系统里,很多负载均衡策略是使用脚本语言编写的,NSX能做到吗?”


答案是肯定的:

- NSX可以更简洁地实现各种基于深度包分析的负载均衡策略,甚至不再需要学习和使用脚本语言。

负载均衡是构建可靠的分布式系统所需的核心功能,尤其是涉及现代微服务体系架构时。由于L7负载均衡具有深度检查应用层数据包的能力,会在后端服务器之间有效地进行应用访问平衡,甚至被很多客户用于实现A/B测试、灰度发布、蓝绿发布等现代应用开发和部署过程。如何定义L7负载均衡的策略,以便对数据流进行L7检查并以L7内容为依据进行负载平衡,是所有负载均衡管理员面临的任务——管理员会希望轻松定义、轻松扩展这些L7负载均衡策略,达到添加并使用自定义功能的目的。最常见的方式是:通过编写可插入过滤器、并将之加载到负载均衡器中。比如,iRules支持Tcl语言编写的脚本,很多其他负载均衡器支持使用Lua语言编写脚本。


随着现代化应用对系统敏捷化要求的不断提高,iRules的学习和使用成本成为了一种阻碍:Tcl语言已成为过去时,由于掌握Tcl语言的管理员稀缺,导致已经编写好的iRules缺乏维护,依赖iRules的应用系统,也就无法得到及时的维护和更新。


VMware NSX高级负载均衡通过图形界面、REST API和DataScript(基于Lua),完全可以取代iRules的功能: 
• 原本需要通过iRules才能实现的功能,大部分(超过75%)在NSX高级负载均衡的图形界面下即可完成配置
• NSX高级负载均衡提供了基于Lua语言的DataScript工具,以支持更多的负载均衡需求场景下的配置
• NSX高级负载均衡的全部功能,可以通过REST API实现批量配置,符合程序化运维的要求
 
下面我们列举11个最常见的使用场景,并展示如何通过NSX的图形界面配置实现这些本来需要iRules编程的功能。

1. HTTP到HTTPS
将客户端发来的HTTP请求重定向到HTTPS,重写请求并插入HSTS标头、安全cookie等。通过单击配置界面中的SSL Everywhere复选框,一切即可完成,无需脚本。如果您的虚拟服务仅具有端口80,则NSX足够智能,不会将客户端重定向到443黑洞中。 

NSX高级负载均衡的“高级”玩儿法
图1  启用HTTP-HTTPS重定向策略

2. HTTP请求限制
限制一段时间内来自客户端的HTTP请求数量,通过:
• 识别客户端:通过HTTP Header中的IP地址,用户名,会话ID,或通过HTTP Header/Cookie中的自定义标识符
• 限制操作:限制每个时间段的请求数,返回自定义页面,自定义响应代码或重定向到备用位置

NSX高级负载均衡的“高级”玩儿法
图2 配置HTTP请求限制策略

3.基于Session ID的会话保持
如果服务器已经嵌入了Session ID,则利用服务器的现有会话ID来识别和保持客户端会话,而不是插入新的cookie。只需选择App Cookie持久方法,然后输入Session ID的名称即可。NSX高级负载均衡将同时检查客户端发来的Header和Cookie内容,以获取会话ID。

NSX高级负载均衡的“高级”玩儿法
图3 配置会话持久性策略

4.跟踪用户会话
NSX高级负载均衡功能无需额外配置就可以记录每个连接或请求,或仅记录感兴趣的会话。管理员将通过IP地址、会话ID或用户ID搜索日志。如果客户端登录到站点,则日志中将填充内部的“用户ID”字段。如果客户端未通过身份验证,则可以使用Session ID填充该字段。在日志中,在搜索栏中输入用户名,以监视他们与站点的完整交互。

NSX高级负载均衡的“高级”玩儿法
图4 会话跟踪日志

5. 插入客户端SSL证书
NSX支持将客户端的SSL证书,插入到发送给服务器的HTTP请求Header中。这不限于通过SSL证书在服务器端进行认证,而且任何组件都可以像SSL证书这样插入到发给服务器的自定义HTTP标头中。
这个配置方法,还可以允许管理员删除或替换现有的HTPP请求Header。

NSX高级负载均衡的“高级”玩儿法
图5 修改HTTP请求中的Header

6. 双向数据改写
将客户端请求(包括其URI和主机名)重写为服务器期望的内容。然后在发送响应包时,逆转该过程。

NSX高级负载均衡的“高级”玩儿法
图6 配置URL中的主机名改写

7. HTTP服务器重新选择
NSX高级负载均衡可以避免将服务器的错误代码发送给客户端:如果服务器发出错误消息(例如503“服务器繁忙”)超过指定的次数,则NSX会自动重试同一台服务器或在池中尝试其他服务器。


NSX高级负载均衡的“高级”玩儿法
图7 配置服务器错误情况下的重新选择

8. 指定返回页面
只需在HTTP策略中上载自定义网页,并在需要时引用它。比如:当站点因维护而停机时,启用策略显示友好的错误页面,即可实现此功能;在维护期结束后可随时禁用该策略。


NSX高级负载均衡的“高级”玩儿法
图8 上传定制页面,用于显示友好的系统信息

9. 根据URI进行负载均衡
NSX高级负载均衡支持根据URI在服务器之间分配请求并保持会话。

NSX高级负载均衡的“高级”玩儿法
图9 选择使用URI(包括但不限于)作为负载均衡和会话保持的依据

10. 内容交换
以上基于URI的负载均衡策略,还可以延伸为基于请求内容的服务器分配,比如对某类特殊文件的HTTP请求可以配置发给特定的服务器池(或指定的服务器)。图10的示例,是将请求图片文件的HTTP包分配到图片服务器池。

NSX高级负载均衡的“高级”玩儿法
图10 基于请求内容的7层互换

11. A/B池分配
在池组中,依据可调整的比率跨多个池分配流量。例如在A/B测试中,如果所有服务器都在运行版本1,则提供设置比率(Ratio)将一些流量移到运行版本2的几个服务器上。在将流量完全转移到新服务器之前,比较两个池之间的最终用户体验。

NSX高级负载均衡的“高级”玩儿法
图11 为A/B测试设置服务器池

以上例子是最常用的11个场景,展示通过NSX GUI轻松实现与脚本编程同样的功能。在更多场景中,通过NSX高级负载均衡图形界面的简单化配置,业务所需的策略可以快速上线、敏捷变更,免除了使用Tcl进行iRules编写和调试的过程,减轻了管理员制定和维护脚本程序的负担。
NSX高级负载均衡已经可以通过图形界面,配置大部分(超过75%)原本需要编写iRules脚本才能完成的功能。同时,NSX高级负载均衡解决方案中提供了DataScript功能作为补充,并且提供了大量从iRules转换为DataScript的脚本样例,帮助用户快速熟悉并使用DataScript实现预期的负载均衡功能。

NSX高级负载均衡的“高级”玩儿法
图12 NSX DataScript样例库(部分截图

随着CI/CD和DevOps的思路和模式被越来越多的企业用于其应用开发和部署流程,采用API对基础架构进行程序化运维,也成为了一种必然。NSX高级负载均衡支持包括REST API在内的多种北向接口,通过最常用的JSON/YAML格式,可以将各种负载均衡策略进行批量化、自动化管理和应用。

图13 NSX高级负载均衡策略的JSON表达

负载均衡策略,特别是在应用层(L7)的策略,复杂而又精妙。NSX高级负载均衡解决方案对传统负载均衡体系进行了扬弃,管理员可以从大量的脚本编写、测试和维护工作中解脱出来,轻松完成对复杂策略的熟练使用和精确运维。

NSX负载均衡“高级”,但不“高冷”,你Get到了吗?