上次我们讨论了 NSX Edge 在静态和动态路由方面的功能,今天我们将讨论负载均衡器。
在我们开始设置之前,我想简要提醒您平衡的主要类型。
Теория
当今所有的有效负载平衡解决方案通常分为两类:模型第四级(传输)和第七级(应用程序)的平衡
- 平衡器L4 最常见的是,它是位于客户端和一组可用后端之间的中间代理,它终止 TCP 连接(即独立响应 SYN),选择后端并沿其方向启动新的 TCP 会话,独立发送 SYN。 此类型是基本类型之一;其他选项也是可能的。
- 平衡器L7 在可用后端之间分配流量比 L4 平衡器“更复杂”。 它可以根据例如 HTTP 消息的内容(URL、cookie 等)来决定选择哪个后端。
无论哪种类型,平衡器都可以支持以下功能:
- 服务发现是确定可用后端集(静态、DNS、Consul、Etcd 等)的过程。
- 检查检测到的后端的功能(使用 HTTP 请求主动“ping”后端、被动检测 TCP 连接中的问题、响应中是否存在多个 503 HTTP 代码等)。
- 平衡本身(循环法、随机选择、源 IP 哈希、URI)。
- TLS 终止和证书验证。
- 与安全相关的选项(身份验证、DoS 攻击预防、速度限制)等等。
NSX Edge 支持两种负载均衡器部署模式:
代理模式,或单臂。 在此模式下,NSX Edge 在向后端之一发送请求时使用其 IP 地址作为源地址。 因此,平衡器同时执行源 NAT 和目标 NAT 的功能。 后端看到从平衡器发送的所有流量并直接对其做出响应。 在这种方案中,平衡器必须与内部服务器在同一网段。
以下是它的发生方式:
1. 用户向 Edge 上配置的 VIP 地址(平衡器地址)发送请求。
2. Edge 选择后端之一并执行目标 NAT,将 VIP 地址替换为所选后端的地址。
3. Edge 执行源 NAT,将发送请求的用户的地址替换为自己的地址。
4. 包裹被发送到选定的后端。
5. 后端不直接响应用户,而是响应 Edge,因为用户的原始地址已更改为平衡器的地址。
6. Edge 将服务器的响应传输给用户。
示意图如下。
透明或内联模式。 在该场景中,平衡器具有内网和外网的接口。 同时,外部网络无法直接访问内部网络。 内置负载均衡器充当内部网络上虚拟机的 NAT 网关。
其机制如下:
1. 用户向 Edge 上配置的 VIP 地址(平衡器地址)发送请求。
2. Edge 选择后端之一并执行目标 NAT,将 VIP 地址替换为所选后端的地址。
3. 包裹被发送到选定的后端。
4. 后端收到带有用户原始地址的请求(未进行源NAT)并直接响应。
5. 流量再次被负载均衡器接受,因为在内联方案中它通常充当服务器场的默认网关。
6. Edge 使用其 VIP 作为源 IP 地址执行源 NAT 以将流量发送到用户。
示意图如下。
实践
我的测试台有 3 台运行 Apache 的服务器,该服务器配置为通过 HTTPS 运行。 Edge 将执行 HTTPS 请求的循环平衡,将每个新请求代理到新服务器。
让我们开始吧
生成 NSX Edge 将使用的 SSL 证书
您可以导入有效的 CA 证书或使用自签名证书。 对于此测试,我将使用自签名。
- 在 vCloud Director 界面中,转到 Edge 服务设置。
- 转到证书选项卡。 从操作列表中,选择添加新的 CSR。
- 填写必填字段并单击保留。
- 选择新创建的 CSR 并选择自签名 CSR 选项。
- 选择证书的有效期,点击保留
- 自签名证书出现在可用证书列表中。
设置应用程序配置文件
应用程序配置文件使您能够更全面地控制网络流量,并使其管理变得简单而有效。 它们可用于定义特定类型流量的行为。
- 转到负载均衡器选项卡并启用均衡器。 此处的加速启用选项允许平衡器使用更快的 L4 平衡而不是 L7。
- 转至应用程序配置文件选项卡以设置应用程序配置文件。 单击+。
- 设置配置文件的名称并选择将应用该配置文件的流量类型。 让我解释一下一些参数。
坚持 – 存储和跟踪会话数据,例如:池中的哪个特定服务器正在为用户请求提供服务。 这可确保在会话或后续会话的生命周期内将用户请求路由到同一池成员。
启用 SSL 直通 – 选择此选项后,NSX Edge 将停止终止 SSL。 相反,终止直接发生在正在平衡的服务器上。
插入 X-Forwarded-For HTTP 标头 – 允许您确定通过负载均衡器连接到 Web 服务器的客户端的源 IP 地址。
启用池端 SSL – 允许您指定所选池由 HTTPS 服务器组成。
- 由于我将平衡 HTTPS 流量,因此我需要启用池端 SSL 并在虚拟服务器证书 -> 服务证书选项卡中选择之前生成的证书。
- 对于池证书 -> 服务证书也是如此。
我们创建一个服务器池,其流量将被平衡池
- 转到池选项卡。 单击+。
- 我们设置池的名称,选择算法(我将使用循环法)和健康检查后端的监控类型。透明选项指示客户端的初始源IP是否对内部服务器可见。
- 如果禁用该选项,内部服务器的流量来自平衡器的源 IP。
- 如果启用该选项,内部服务器将看到客户端的源 IP。 在此配置中,NSX Edge 必须充当默认网关,以确保返回的数据包通过 NSX Edge。
NSX 支持以下平衡算法:
- IP_HASH – 基于每个数据包的源和目标 IP 的哈希函数结果选择服务器。
- 最少连接 – 平衡传入连接,具体取决于特定服务器上已有的可用数量。 新的连接将被定向到连接数最少的服务器。
- 循环法 – 新连接根据分配给它的权重依次发送到每个服务器。
- 的URI – URI 的左侧部分(问号之前)经过哈希处理并除以池中服务器的总权重。 结果指示哪个服务器接收请求,确保只要所有服务器保持可用,请求始终路由到同一服务器。
- HTTP头 – 基于特定 HTTP 标头的平衡,可以将其指定为参数。 如果标头丢失或没有任何值,则应用 ROUND_ROBIN 算法。
- 网址 – 每个 HTTP GET 请求都会搜索指定为参数的 URL 参数。 如果参数后跟等号和值,则对该值进行哈希处理并除以正在运行的服务器的总权重。 结果表明哪个服务器接收到请求。 此过程用于跟踪请求中的用户 ID,并确保只要所有服务器保持可用,相同的用户 ID 始终发送到同一服务器。
- 在成员块中,单击 + 将服务器添加到池中。
这里需要指定:- 服务器名称;
- 服务器的IP地址;
- 服务器接收流量的端口;
- 健康检查端口(监控健康检查);
- 权重 – 使用此参数,您可以调整特定池成员收到的流量比例;
- 最大连接数——与服务器的最大连接数;
- 最小连接数 – 在流量转发到下一个池成员之前服务器必须处理的最小连接数。
这就是最终的三台服务器池的样子。
添加虚拟服务器
- 转到虚拟服务器选项卡。 单击+。
- 我们使用启用虚拟服务器激活虚拟服务器。
我们为其命名,选择之前创建的应用程序配置文件、池并指示虚拟服务器将从外部接收请求的 IP 地址。 我们指定 HTTPS 协议和端口 443。
此处可选参数:
连接限制 – 虚拟服务器可以处理的最大同时连接数;
连接速率限制 (CPS) – 每秒新传入请求的最大数量。
这样就完成了平衡器的配置;您可以检查其功能。 服务器具有简单的配置,使您可以了解池中的哪台服务器处理了请求。 在设置过程中,我们选择了循环平衡算法,并且每个服务器的权重参数等于 XNUMX,因此每个后续请求将由池中的下一个服务器处理。
我们在浏览器中输入平衡器的外部地址,看到:
刷新页面后,请求将由以下服务器处理:
再次 - 检查池中的第三台服务器:
检查时可以看到Edge发给我们的证书和我们一开始生成的证书是一样的。
从 Edge 网关控制台检查平衡器状态。 为此,请输入 显示服务负载均衡器池.
配置服务监视器以检查池中服务器的状态
使用Service Monitor我们可以监控后端池中服务器的状态。 如果对请求的响应不符合预期,则可以将服务器从池中取出,以便它不会接收任何新请求。
默认配置三种验证方式:
- TCP 监视器,
- HTTP 监视器,
- HTTPS 监视器。
让我们创建一个新的。
- 转到服务监控选项卡,单击“+”。
- 选择:
- 新方法的名称;
- 发送请求的时间间隔,
- 等待响应超时,
- 监控类型 – 使用 GET 方法的 HTTPS 请求、预期状态代码 – 200(OK) 和请求 URL。
- 这样就完成了新服务监视器的设置;现在我们可以在创建池时使用它。
设置应用程序规则
应用程序规则是一种基于某些触发器来操纵流量的方法。 借助此工具,我们可以创建高级负载平衡规则,而这些规则可能无法通过应用程序配置文件或 Edge Gateway 上提供的其他服务来实现。
- 要创建规则,请转到平衡器的“应用程序规则”选项卡。
- 选择名称、将使用该规则的脚本,然后单击“保留”。
- 创建规则后,我们需要编辑已经配置的虚拟服务器。
- 在“高级”选项卡中,添加我们创建的规则。
在上面的示例中,我们启用了 tlsv1 支持。
再举几个例子:
将流量重定向到另一个池。
通过此脚本,如果主池关闭,我们可以将流量重定向到另一个平衡池。 为了使规则发挥作用,必须在平衡器上配置多个池,并且主池的所有成员都必须处于关闭状态。 您需要指定池的名称,而不是其 ID。
acl pool_down nbsrv(PRIMARY_POOL_NAME) eq 0
use_backend SECONDARY_POOL_NAME if PRIMARY_POOL_NAME
将流量重定向到外部资源。
在这里,如果主池的所有成员都已关闭,我们会将流量重定向到外部网站。
acl pool_down nbsrv(NAME_OF_POOL) eq 0
redirect location http://www.example.com if pool_down
更多例子
这就是我关于平衡器的全部内容。 如果您有任何疑问,请提问,我准备好回答。
来源: habr.com