如何在 Azure 中均衡 Linux 虚拟机负载以创建高可用性应用程序
负载均衡通过将传入请求分布到多个虚拟机来提供更高级别的可用性。 本教程介绍了 Azure 负载均衡器的不同组件,这些组件用于分发流量和提供高可用性。 你将学习如何执行以下操作:
- 创建 Azure 负载均衡器
- 创建负载均衡器运行状况探测
- 创建负载均衡器流量规则
- 使用 cloud-init 创建基本的 Node.js 应用
- 创建虚拟机并将其附加到负载均衡器
- 查看负载均衡器的实际运行情况
- 从负载均衡器中添加和删除 VM
Note
在 Azure 中国区使用 Azure CLI 2.0 之前,请先运行 az cloud set -n AzureChinaCloud
来改变云环境。如果想切回国际版 Azure,请再次运行 az cloud set -n AzureCloud
。
如果选择在本地安装并使用 CLI,本教程要求运行 Azure CLI 2.0.4 或更高版本。 运行 az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI 2.0。
Azure 负载均衡器概述
Azure 负载均衡器是位于第 4 层(TCP、UDP)的负载均衡器,通过在正常运行的 VM 之间分发传入流量提供高可用性。 负载均衡器运行状况探测器监视每个 VM 上的给定端口,仅将流量分发给正常运行的 VM。
定义包含一个或多个公共 IP 地址的前端 IP 配置。 利用此前端 IP 配置,可通过 Internet 访问负载均衡器和应用程序。
虚拟机使用其虚拟网络接口卡 (NIC) 连接到负载均衡器。 若要向 VM 分发流量,后端地址池需包含连接到负载均衡器的虚拟 NIC 的 IP 地址。
若要控制流量,需为映射到 VM 的特定端口和协议定义负载均衡器规则。
如果遵循了前面的教程来创建虚拟机规模集,则已创建负载均衡器。 所有这些组件都已配置为规模集的一部分。
创建 Azure 负载均衡器
本部分详细介绍如何创建和配置负载均衡器的每个组件。 创建负载均衡器之前,需使用 az group create 创建资源组。 以下示例在 chinaeast 位置创建名为 myResourceGroupLoadBalancer 的资源组:
az group create --name myResourceGroupLoadBalancer --location chinaeast
创建公共 IP 地址
若要通过 Internet 访问应用,需要负载均衡器的一个公共 IP 地址。 使用 az network public-ip create 创建公共 IP 地址。 以下示例在 myResourceGroupLoadBalancer 资源组中创建名为 myPublicIP 的公共 IP 地址:
az network public-ip create \
--resource-group myResourceGroupLoadBalancer \
--name myPublicIP
创建负载均衡器
使用 az network lb create 创建负载均衡器。 以下示例创建名为“myLoadBalancer”的负载均衡器,并将“myPublicIP”地址分配到前端 IP 配置:
az network lb create \
--resource-group myResourceGroupLoadBalancer \
--name myLoadBalancer \
--frontend-ip-name myFrontEndPool \
--backend-pool-name myBackEndPool \
--public-ip-address myPublicIP
创建运行状况探测器
若要允许负载均衡器监视应用的状态,可以使用运行状况探测器。 运行状况探测器基于其对运行状况检查的响应,从负载均衡器中动态添加或删除 VM。 默认情况下,在 15 秒时间间隔内发生两次连续的故障后,会从负载均衡器分布中删除 VM。 可以为应用创建基于协议或特定运行状况检查页面的运行状况探测器。
以下示例创建一个 TCP 探测器。 还可创建自定义 HTTP 探测,以便执行更精细的运行状况检查。 使用自定义 HTTP 探测时,必须创建运行状况检查页,例如 healthcheck.js。 探测必须为负载均衡器返回 HTTP 200 OK 响应,以保持主机处于旋转状态。
若要创建 TCP 运行状况探测,请使用 az network lb probe create。 以下示例创建名为“myHealthProbe”的运行状况探测:
az network lb probe create \
--resource-group myResourceGroupLoadBalancer \
--lb-name myLoadBalancer \
--name myHealthProbe \
--protocol tcp \
--port 80
创建负载均衡器规则
负载均衡器规则用于定义将流量分配给 VM 的方式。 定义传入流量的前端 IP 配置和后端 IP 池以接收流量,同时定义所需源和目标端口。 若要确保仅正常运行的 VM 接收流量,还需定义要使用的运行状况探测。
使用 az network lb rule create 创建负载均衡器规则。 以下示例创建名为“myLoadBalancerRule”的规则、使用“myHealthProbe”运行状况探测并平衡端口 80 上的流量:
az network lb rule create \
--resource-group myResourceGroupLoadBalancer \
--lb-name myLoadBalancer \
--name myLoadBalancerRule \
--protocol tcp \
--frontend-port 80 \
--backend-port 80 \
--frontend-ip-name myFrontEndPool \
--backend-pool-name myBackEndPool \
--probe-name myHealthProbe
配置虚拟网络
需要先创建提供支持的虚拟网络资源,然后才能部署某些 VM 并测试均衡器。 有关虚拟网络的详细信息,请参阅管理 Azure 虚拟网络教程。
创建网络资源
使用 az network vnet create 创建虚拟网络。 以下示例创建名为“myVnet”的虚拟网络和一个名为“mySubnet”的子网:
az network vnet create \
--resource-group myResourceGroupLoadBalancer \
--name myVnet \
--subnet-name mySubnet
若要添加网络安全组,请使用 az network nsg create。 以下示例创建名为“myNetworkSecurityGroup”的网络安全组:
az network nsg create \
--resource-group myResourceGroupLoadBalancer \
--name myNetworkSecurityGroup
使用 az network nsg rule create 创建网络安全组规则。 以下示例创建名为“myNetworkSecurityGroupRule”的网络安全组规则:
az network nsg rule create \
--resource-group myResourceGroupLoadBalancer \
--nsg-name myNetworkSecurityGroup \
--name myNetworkSecurityGroupRule \
--priority 1001 \
--protocol tcp \
--destination-port-range 80
使用 az network nic create 创建虚拟 NIC。 以下示例创建三个虚拟 NIC。 (在以下步骤中针对为应用创建的每个 VM 各使用一个虚拟 NIC)。 可随时创建其他虚拟 NIC 和 VM,并将其添加到负载均衡器:
for i in `seq 1 3`; do
az network nic create \
--resource-group myResourceGroupLoadBalancer \
--name myNic$i \
--vnet-name myVnet \
--subnet mySubnet \
--network-security-group myNetworkSecurityGroup \
--lb-name myLoadBalancer \
--lb-address-pools myBackEndPool
done
创建虚拟机
创建 cloud-init 配置
在有关如何在首次启动时自定义 Linux 虚拟机的上一个教程中,你已了解如何使用 cloud-init 自动执行 VM 自定义。 可使用同一个 cloud-init 配置文件安装 NGINX 并运行简单的“Hello World”Node.js 应用。
创建名为“cloud-init.txt”的文件并粘贴以下配置。 请确保已正确复制整个 cloud-init 文件,尤其是第一行:
#cloud-config
package_upgrade: true
packages:
- nginx
- nodejs
- npm
write_files:
- owner: www-data:www-data
- path: /etc/nginx/sites-available/default
content: |
server {
listen 80;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
- owner: azureuser:azureuser
- path: /home/azureuser/myapp/index.js
content: |
var express = require('express')
var app = express()
var os = require('os');
app.get('/', function (req, res) {
res.send('Hello World from host ' + os.hostname() + '!')
})
app.listen(3000, function () {
console.log('Hello world app listening on port 3000!')
})
runcmd:
- service nginx restart
- cd "/home/azureuser/myapp"
- npm init
- npm install express -y
- nodejs index.js
创建虚拟机
若要提高应用的高可用性,请将 VM 放置在可用性集中。 有关可用性集的详细信息,请参阅前面的如何创建高可用性虚拟机教程。
使用 az vm availability-set create 创建可用性集。 以下示例创建名为“myAvailabilitySet”的可用性集:
az vm availability-set create \
--resource-group myResourceGroupLoadBalancer \
--name myAvailabilitySet
现在,可使用 az vm create 创建 VM。 以下示例创建三个 VM,并生成 SSH 密钥(如果它们尚不存在):
for i in `seq 1 3`; do
az vm create \
--resource-group myResourceGroupLoadBalancer \
--name myVM$i \
--availability-set myAvailabilitySet \
--nics myNic$i \
--image UbuntuLTS \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data cloud-init.txt \
--no-wait
done
在 Azure CLI 返回提示之后,仍然存在继续运行的后台任务。 --no-wait
参数不会等待所有任务完成。 可能还需等待几分钟才能访问应用。 在每个 VM 上运行应用时,负载均衡器运行状况探测器会自动检测。 应用运行后,负载均衡器规则将开始分布流量。
测试负载均衡器
使用 az network public-ip show 获取负载均衡器的公共 IP 地址。 以下示例获取前面创建的“myPublicIP”的 IP 地址:
az network public-ip show \
--resource-group myResourceGroupLoadBalancer \
--name myPublicIP \
--query [ipAddress] \
--output tsv
然后,可将公共 IP 地址输入 Web 浏览器中。 请记住:在负载均衡器开始向 VM 分发流量之前,VM 需要几分钟才能准备就绪。 随即显示应用,包括负载均衡器将流量分发到的 VM 的主机名,如下例所示:
若要查看负载均衡器如何在运行应用的所有 3 个 VM 之间分配流量,可强制刷新 Web 浏览器。
添加和删除 VM
建议对运行应用的 VM 执行维护,例如安装 OS 更新。 若要应对应用增加的流量,建议添加更多 VM。 本部分演示了如何在负载均衡器中删除或添加 VM。
从负载均衡器中删除 VM
可使用 az network nic ip-config address-pool remove 从后端地址池中删除 VM。 以下示例从“myLoadBalancer”中删除“myVM2”的虚拟 NIC:
az network nic ip-config address-pool remove \
--resource-group myResourceGroupLoadBalancer \
--nic-name myNic2 \
--ip-config-name ipConfig1 \
--lb-name myLoadBalancer \
--address-pool myBackEndPool
若要查看负载均衡器如何在运行应用的其余两个 VM 之间分发流量,可强制刷新 Web 浏览器。 现在可以对 VM 执行维护,例如安装 OS 更新或执行 VM 重新启动。
将 VM 添加到负载均衡器
可以在执行 VM 维护后或需要扩展容量的情况下,使用 az network nic ip-config address-pool add 将 VM 添加到后端地址池。 以下示例将“myVM2”的虚拟 NIC 添加到“myLoadBalancer”:
az network nic ip-config address-pool add \
--resource-group myResourceGroupLoadBalancer \
--nic-name myNic2 \
--ip-config-name ipConfig1 \
--lb-name myLoadBalancer \
--address-pool myBackEndPool
后续步骤
在本教程中,你已创建了一个负载均衡器并已将 VM 附加到它。 你已了解如何:
- 创建 Azure 负载均衡器
- 创建负载均衡器运行状况探测
- 创建负载均衡器流量规则
- 使用 cloud-init 创建基本的 Node.js 应用
- 创建虚拟机并将其附加到负载均衡器
- 查看负载均衡器的实际运行情况
- 从负载均衡器中添加和删除 VM
请转到下一教程,详细了解 Azure 虚拟网络组件。
立即访问http://market.azure.cn