适用于:✔️ Linux 虚拟机 ✔️ 灵活规模集
负载均衡通过跨多个虚拟机分散传入请求来提供更高级别的可用性。 在本教程中,你将了解分发流量并提供高可用性的 Azure 负载均衡器的不同组件。 你将学会如何:
- 创建负载均衡器
- 创建健康探测器
- 创建流量规则
- 使用 cloud-init 安装基本 Node.js 应用
- 创建虚拟机并将其附加到负载均衡器
- 查看作中的负载均衡器
- 在负载均衡器中添加和删除 VM
本教程使用 Azure Cloud Shell 中的 CLI,该 CLI 会不断更新到最新版本。 若要打开 Cloud Shell,请从任何代码块的顶部选择“试一试” 。
如果选择在本地安装并使用 CLI,本教程要求运行 Azure CLI 2.0.30 或更高版本。 运行 az --version 即可查找版本。 如果需要安装或升级,请参阅 安装 Azure CLI。
Azure 负载均衡器概述
Azure 负载均衡器是一个第 4 层(TCP、UDP)负载均衡器,它通过在正常的 VM 之间分配传入流量来提供高可用性。 负载均衡器运行状况探测器监视每个 VM 上的给定端口,并且仅将流量分发到正常运行的 VM。
定义包含一个或多个公共 IP 地址的前端 IP 配置。 此前端 IP 配置允许负载均衡器和应用程序通过 Internet 访问。
虚拟机使用其虚拟网络接口卡(NIC)连接到负载均衡器。 若要将流量分发到 VM,后端地址池包含连接到负载均衡器的虚拟 (NIC) 的 IP 地址。
若要控制流量流,请为映射到 VM 的特定端口和协议定义负载均衡器规则。
如果按照上 一教程创建虚拟机规模集,则已为你创建负载均衡器。 这些组件都已为您配置为规模集的组成部分。
创建 Azure 负载均衡器
本部分详细介绍了如何创建和配置负载均衡器的每个组件。 在创建负载均衡器之前,请使用 az group create 创建资源组。 以下示例在 eastus 位置创建名为 myResourceGroupLoadBalancer 的资源组:
az group create --name myResourceGroupLoadBalancer --location eastus
创建公共 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 秒。 您可以基于协议或特定的运行状况检查页面为您的应用创建健康探测。
以下示例创建 TCP 探测。 还可以创建自定义 HTTP 探测,以便进行更精细的运行状况检查。 使用自定义 HTTP 探测时,必须创建运行状况检查页,例如 healthcheck.js。 探测必须返回负载均衡器的 HTTP 200 正常 响应才能使主机保持旋转状态。
若要创建 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
虚拟 NIC 是使用 az network nic create 创建的。 以下示例创建三个虚拟 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
创建所有三个虚拟 NIC 后,请继续执行下一步
创建虚拟机
创建 cloud-init 配置
在上一篇有关如何 在首次启动时自定义 Linux 虚拟机的教程中,你学习了如何使用 cloud-init 自动执行 VM 自定义。 可以使用同一 cloud-init 配置文件安装 NGINX,并在下一步中运行简单的“Hello World”Node.js 应用。 若要查看运行中的负载均衡器,请在本教程结束时,在 Web 浏览器中访问此简单应用。
在当前 shell 中,创建名为 cloud-init.txt 的文件并粘贴以下配置。 例如,在不处于本地计算机上的 Cloud Shell 中创建文件。 输入 sensible-editor 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
然后,可以在 Web 浏览器中输入公共 IP 地址。 请记住 - 在负载均衡器开始向其分发流量之前,VM 需要几分钟时间才能准备就绪。 将显示该应用,包括负载均衡器将流量分发到的 VM 的主机名,如以下示例所示:
若要查看负载均衡器在运行应用的所有三个 VM 之间分配流量,可以强制刷新 Web 浏览器。
添加和删除 VM
可能需要对运行应用的 VM 执行维护,例如安装 OS 更新。 若要处理应用流量增加的问题,可能需要添加其他 VM。 本部分介绍如何从负载均衡器中删除或添加 VM。
从负载均衡器中删除 VM
可以使用 az network nic ip-config address-pool remove 从后端地址池中删除虚拟机。 以下示例从 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 上执行维护,例如安装 OS 更新或执行 VM 重启。
若要查看连接到负载均衡器的虚拟 NIC 的 VM 列表,请使用 az network lb address-pool show。 查询和筛选虚拟 NIC 的 ID,如下所示:
az network lb address-pool show \
--resource-group myResourceGroupLoadBalancer \
--lb-name myLoadBalancer \
--name myBackEndPool \
--query backendIpConfigurations \
--output tsv | cut -f5
输出类似于以下示例,显示 VM 2 的虚拟 NIC 不再是后端地址池的一部分:
/subscriptions/<guid>/resourceGroups/myResourceGroupLoadBalancer/providers/Microsoft.Network/networkInterfaces/myNic1/ipConfigurations/ipconfig1
/subscriptions/<guid>/resourceGroups/myResourceGroupLoadBalancer/providers/Microsoft.Network/networkInterfaces/myNic3/ipConfigurations/ipconfig1
将 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
若要验证虚拟 NIC 是否已连接到后端地址池,请再次使用上一步中的 az network lb address-pool show 。
后续步骤
在本教程中,你创建了一个负载均衡器并向其附加了 VM。 你已了解如何执行以下操作:
- 创建 Azure 负载均衡器
- 创建负载均衡器运行状况探测
- 创建负载均衡器流量规则
- 使用 cloud-init 创建基本 Node.js 应用
- 创建虚拟机并附加到负载均衡器
- 查看运行中的负载均衡器
- 在负载均衡器中添加和删除 VM
请继续学习下一教程,详细了解 Azure 虚拟网络组件。