Skip to main content

使用负载均衡支持高可用性

分类:  Azure虚拟机 标签:  #虚拟机 #Linux #基础 #Azure入门 发布于: 2023-05-27 21:32:04

使用负载均衡可以将进入的请求分发到虚拟机上,从而提高可用性。本教程有如下的要点:

  • 创建一个负载均衡
  • 创建一个健康监测
  • 创建一个流量规则
  • 使用cloud-init安装一个Node.js App
  • 创建虚拟机,并配置虚拟机使用负载均衡
  • 查看负载均衡
  • 从负载均衡配置种移除虚拟机

Azure 负载均衡器是位于第 4 层(TCP、UDP)的负载均衡器,通过在正常运行的 VM 之间分发传入流量提供高可用性。 负载均衡器运行状况探测器监视每个 VM 上的给定端口,仅将流量分发给正常运行的 VM。定义包含一个或多个公共 IP 地址的前端 IP 配置。 利用此前端 IP 配置,可通过 Internet 访问负载均衡器和应用程序。虚拟机使用其虚拟网络接口卡 (NIC) 连接到负载均衡器。 若要向 VM 分发流量,后端地址池需包含连接到负载均衡器的虚拟 NIC 的 IP 地址。若要控制流量流,需为映射到 VM 的特定端口和协议定义负载均衡器规则。如果遵循了前面的教程来创建虚拟机规模集,则已创建负载均衡器。 所有这些组件都已配置为规模集的一部分。

创建负载均衡

使用如下的命令来创建负载均衡:

先创建资源组

az group create --name myResourceGroupLoadBalancer --location chinaeast2

创建公共IP地址

要可以在网络上访问负载均衡,需要为负载均衡创建一个公共的IP地址。

az network public-ip create \
    --resource-group myResourceGroupLoadBalancer \
    --name myPublicIP

创建负载均衡

然后创建负载均衡

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 并测试均衡器。 有关虚拟网络的详细信息,后期我们会学习虚拟机网络的基本信息。

创建网络资源

使用 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

创建所有三个虚拟 NIC 之后,请继续执行下一步骤

创建虚拟机

创建cloud-init配置

在上一个教程中,已了解如何使用 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

测试负载均衡

使用 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 的主机名,如下例所示:



添加和删除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 重新启动。

若要查看包含与负载均衡器连接的虚拟 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 -f4

输出类似于以下示例,其中显示 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