我们在为Azure虚拟机上的IIS网站选择负载平衡解决方案(负载平衡器、应用程序网关、流量管理器、前门)时遇到困难。当有两个相同的站点时,简单的用例涵盖得很好——只需使用Azure负载均衡器或应用程序网关。然而,在我们想要更新网站并测试这些更新的情况下,我们会遇到负载平衡解决方案的限制。
例如,如果我们想在VM1上更新IIS网站并测试这些更新,策略将是:
- 将负载平衡器指向VM2
- 在VM1上更新IIS网站
- 测试更改
- 如果所有测试都通过了,那么在我们更新VM2的同时,将负载平衡器仅指向VM1
- 将负载平衡器指向两个虚拟机
我们想知道将流量仅引导到一个VM的最佳解决方案是什么。到目前为止,我们只看到一个选项——从后端地址池中删除一个VM,然后将其返回,并对其他VM重复该过程。当然,必须有更好的方法将100%的流量引导到一个(或特定的VM),对吧?
更新:
通过在服务标签负载平衡器上创建带有拒绝操作的网络安全组规则,我们最终阻止了虚拟机和负载平衡器之间的连接。一旦我们希望该特定VM能够再次访问,我们就将NSG规则从"拒绝"切换到"允许"。
这种方法的缺点是,更改需要1-3分钟才能生效。使用Azure负载均衡器进行连续交付
如果有人能想出一个更快(或即时)的解决方案,请告诉我。
在没有任何Azure细节的情况下,通常的模式是将负载平衡器指向进程的/status端点,并根据您的需求设计端点行为,例如:
- 当首次部署服务时,其状态为"挂起">
- 当你认为它是健康的,例如所有测试都通过了,做一个POST/状态来更新它
- 然后服务返回状态"ok">
同时,负载平衡器每分钟轮询/status端点,并知道标记/排除任何未处于"ok"状态的服务器的转发。
一些负载均衡器/网关可能最适合使用HTTP状态代码,而另一些则能够从状态端点读取响应文本。不过,几乎所有这些都将支持这种一般行为——您不应该需要昂贵的解决方案。
我们通过在服务标签负载平衡器上创建带有拒绝操作的网络安全组规则,最终阻止了虚拟机和负载平衡器之间的连接。一旦我们希望该特定VM能够再次访问,我们就将NSG规则从"拒绝"切换到"允许"。
这种方法的缺点是,更改需要1-3分钟才能生效。使用Azure负载均衡器进行连续交付
如果有人能想出一个更快(或即时)的解决方案,请告诉我。
我在几年前构建的Azure环境中有着完全相同的需求。Azure Front Door不存在,我已经研究过使用Azure API来自动执行添加和删除后端服务器的过程,就像你描述的那样。它有时起作用,但我发现Azure API不可靠(大量503重新配置负载平衡器),并且在我添加或从集群中删除服务器时,将流量转移到服务器或从服务器转移流量非常缓慢。
如果你正在寻找一个完全依赖Azure资源的答案,那么下面的解决方案可能不会受到欢迎,但这就是我设计的:
我用最简单的HTTP和HTTPS循环负载平衡配置了一个Azure负载均衡器,在我的外部IP上对运行Debian和HAProxy的两个小型Azure虚拟机进行请求。然后,我为每个HAProxy虚拟机配置了实际IIS服务器的后端。我在可用性集中配置了两个HAProxy虚拟机,这样Microsoft就不应该同时重新启动它们进行维护。
HAProxy是一个出色且非常健壮的负载均衡器,它支持几乎所有可以想象的负载平衡场景,对于您的问题,至关重要的是,它还支持监听套接字以控制后端的状态。我在haproxy.cfg的全局部分配置了以下内容:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats socket ipv4@192.168.95.100:9001 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
在我的示例中,192.168.95.100是第一个HAProxy虚拟机,192.168.95.101是第二个。在第二台服务器上,除了其内部IP之外,这些线路都是相同的。
假设您有一个HAProxy前端和后端,用于连接到两个web服务器的HTTPS流量,ws1pro和ws2pro,IP分别为192.168.95.10和192.168.95.11。为了简单起见,我假设我们不需要担心两个服务器之间的HTTP会话状态差异(例如进程外会话状态),所以我们只需将HTTPS连接转移到一个节点或另一个节点:
listen stats
bind *:8080
mode http
stats enable
stats refresh 10s
stats show-desc Load Balancer
stats show-legends
stats uri /
frontend www_https
bind *:443
mode tcp
option tcplog
default_backend backend_https
backend backend_https
mode tcp
balance roundrobin
server ws1pro 192.168.95.10:443 check inter 5s
server ws2pro 192.168.95.11:443 check inter 5s
使用上面的配置,由于两个HAProxy虚拟机都在侦听端口9001上的管理命令,并且Azure负载平衡器正在向其中一个虚拟机发送客户端的请求,因此我们需要告诉两个服务器禁用同一后端。
我使用Socat发送集群控制命令。你可以在Linux虚拟机上完成这项工作,但也有Windows版本的Socat,我在一组非常简单的批处理文件中使用了Windows版本。集群控制命令在BASH中实际上是相同的。
stop_ws1pro.bat:
echo disable server backend_https/ws1pro | socat - TCP4:192.168.95.100:9001
echo disable server backend_https/ws1pro | socat - TCP4:192.168.95.101:9001
start_ws1pro.bat:
echo enable server backend_https/ws1pro | socat - TCP4:192.168.95.100:9001
echo enable server backend_https/ws1pro | socat - TCP4:192.168.95.101:9001
这些管理命令几乎立即执行。由于上面的HAProxy配置启用了统计页面,您应该能够在统计页面刷新后立即查看状态变化。当您禁用后端时,统计页面将显示从禁用的服务器到其余已启用服务器的连接或会话,然后显示它们在再次启用服务器后返回到服务器。