使用 VMM 对 SDN 构造中的网络流量进行负载均衡

重要

此版本的 Virtual Machine Manager (VMM) 已终止支持。 建议 升级到 VMM 2022

可以使用软件负载均衡器 (SLB) 在由云服务提供商 (CSP) 和租户管理的软件定义的网络 (SDN) 中的工作负载之间平均分配网络流量。 有关详细信息,请参阅软件负载均衡器 (SLB)

System Center Virtual Machine Manager (VMM) 支持以下两种情形的负载均衡:

  • 对外部网络流量进行负载均衡:此情形包括对来自外部网络的网络流量进行负载均衡。 负载均衡通过公用虚拟 IP (VIP) 来实现。 工作负荷 VM 可以连接到无隔离 VM 网络或启用了网络虚拟化的 VM 网络。

  • 对内部网络流量进行负载均衡(内部负载均衡):此情形包括在启用网络虚拟化的 VM 网络中对工作负荷的网络流量进行负载均衡。 负载均衡通过 VIP 来实现。

    注意

    VMM 2016 支持使用 PowerShell 配置负载均衡。 当前不支持通过服务模板进行配置。

本文提供有关如何使用 PowerShell 配置工作负荷 VM 的负载均衡的信息。

注意

  • 从 VMM 2019 UR1 开始,“一个连接的网络”类型已更改为“连接的网络”
  • VMM 2019 UR2 及更高版本支持 IPv6。

准备工作

确保以下信息:

创建 VIP 模板

使用以下过程可配置 VIP,以对工作负荷 VM (DIP) 进行负载均衡。

  1. 在 VMM 控制台中,选择“ 构造>VIP 模板”。 右键单击并选择“创建 VIP 模板”

    VIP 模板名称的屏幕截图。

  2. 在“名称”页上,提供名称和可选说明。 指定将用作网络流量前端端口的 虚拟 IP 端口。 在 “后端端口”中,指定托管后端工作负荷的端口。 选择“下一页”。

    VIP 模板类型的屏幕截图。

  3. 在“指定模板类型”中,选择“特定”。 在“制造商”中,选择“Microsoft”。 在“型号”中,选择“Microsoft 网络控制器”。 选择“下一页”。

    VIP 协议选项的屏幕截图。

  4. 在“指定协议选项”中,选择自定义选项并在“协议名称”中输入 TCP/UDP。 选择“下一页”。

    注意

    SLB 仅支持 TCP/UDP 流量的第 4 层负载均衡。 不支持 HTTP/HTTPS 协议。

  5. 对于“暂留”和“负载均衡”,使用默认值。 选择“下一页”。

    运行状况监视器的屏幕截图。

    注意

    SLB 不支持持久性和不同的负载均衡方法。 默认情况下,SLB 使用轮循机制算法进行负载均衡。

  6. 在“运行状况监视器”中,可以选择插入适当的值。 选择“下一页”。

    选项:如果使用 SLB,则支持将 TCP 和 HTTP 作为运行状况监视器协议。

  7. 验证设置,然后选择“ 完成”。

创建了模板之后,可以“构造”“VIP 模板”下找到此模板。

使用 PowerShell 创建 VIP

使用以下示例脚本创建 VIP。 基于要进行负载均衡的网络流量类型选择脚本:

用于创建 VIP 以对外部网络流量进行负载均衡的脚本

用于创建 VIP 以对内部网络流量进行负载均衡的脚本

用于创建 VIP 以对外部网络流量进行负载均衡的脚本

以下示例脚本从公共 IP 网络创建 VIP,以在端口 80 上对工作负荷 VM WGB-001 和 WGB-002 进行负载均衡。

此脚本还可用于通过传递 IPv6 VIP 地址来创建负载均衡 VIP。

工作负荷 VM 可以连接到无隔离网络或启用了网络虚拟化的 VM 网络。

注意

  • 在脚本参数部分中,替换与此脚本中使用的示例的测试环境相匹配的实际值。
  • 确保在 VMM 服务器或运行 VMM 控制台的计算机上运行脚本。
param(

[Parameter(Mandatory=$false)]
# Name of the Network Controller Network Service
# This value should be the name you gave the Network Controller service
# when you on-boarded the Network Controller to VMM
$LBServiceName = "NC",

[Parameter(Mandatory=$false)]
# Name of the workload VMs you want to load balance.
$VipMemberVMNames =  @("WGB-001","WGB-002"),

[Parameter(Mandatory=$false)]
# Name of the VIP VM Network
$VipNetworkName = "PublicVIP",


[Parameter(Mandatory=$false)]
# VIP address you want to assign from the VIP VM Network IP pool.
# Pick any VIP that falls within your VIP IP Pool range.
$VipAddress = "44.15.10.253",


[Parameter(Mandatory=$false)]
# The name of the VIP template you created via the VMM Console.
$VipTemplateName = "WebsiteHTTP",

[Parameter(Mandatory=$false)]
# Arbitrary but good to match the VIP you're using.
$VipName = "scvmm_44_15_10_253_80"

)

Import-Module virtualmachinemanager

$lb = Get-scLoadBalancer | where { $_.Service.Name -like $LBServiceName};
$vipNetwork = get-scvmnetwork -Name $VipNetworkName;

$vipMemberNics = @();
foreach ($vmName in $VipMemberVMNames)
{
$vm = get-scvirtualmachine -Name $vmName;
#    if ($vm.VirtualNetworkAdapters[0].VMNetwork.ID -ne $vipNetwork.ID)
#    {
#        $vm.VirtualNetworkAdapters[0] | set-scvirtualnetworkadapter -VMNetwork $vipNetwork;
#    }

$vipMemberNics += $vm.VirtualNetworkAdapters[0];
}

$existingVip = get-scloadbalancervip -Name $VipName
    if ($existingVip -ne $null)
{
#    foreach ($mem in $existingVip.VipMembers)
#    {
#        $mem | remove-scloadbalancervipmember;
#    }

    $existingVip | remove-scloadbalancervip;
}

$vipt = get-scloadbalancerviptemplate -Name $VipTemplateName;

$vip = New-SCLoadBalancerVIP -Name $VipName -LoadBalancer $lb
-IPAddress $VipAddress -LoadBalancerVIPTemplate $vipt
-FrontEndVMNetwork $vipNetwork
-BackEndVirtualNetworkAdapters $vipMemberNics;
Write-Output "Created VIP " $vip;

$vip = get-scloadbalancervip -Name $VipName;
Write-Output "VIP created successfully " $vip;

用于创建 VIP 以对内部网络流量进行负载均衡的脚本

对于以下示例脚本,我们按名称 ILB-VIP-Template 创建了一个新 VIP 模板,以便使用在前面部分中详细介绍的过程对端口 443 进行负载均衡。 该脚本从租户 VM 网络创建 VIP,以对属于相同租户 VM 网络的 VM ILB-001 和 ILB-002 进行负载均衡。

此脚本还可用于通过传递 IPv6 VIP 地址来创建负载均衡 VIP。

注意

  • 在内部负载均衡方案中,VIP 来自租户 VM 网络。 因此,$VipNetworkName 是 VM 连接的相同租户 VM 网络名称。 确保租户 VM 网络 IP 池具有为 VIP 保留的 IP。 $VipAddress 是来自保留 VIP 的 IP 地址之一。
  • 在脚本参数部分中,替换与此脚本中使用的示例的测试环境相匹配的实际值。
  • 确保在 VMM 服务器或运行 VMM 控制台的计算机上运行脚本。
param(

[Parameter(Mandatory=$false)]
# Name of the Network Controller Network Service
# This value should be the name you gave the Network Controller service
# when you on-boarded the Network Controller to VMM
$LBServiceName = "NC",

[Parameter(Mandatory=$false)]
# Name of the workload VMs you want to load balance.
$VipMemberVMNames =  @("ILB-001","ILB-002"),

[Parameter(Mandatory=$false)]
# Name of the VIP VM Network
$VipNetworkName = "TenantNetwork",

[Parameter(Mandatory=$false)]
# VIP address you want to assign from the VIP VM Network IP pool.
# Pick any VIP that falls within your VIP IP Pool range.
$VipAddress = "192.168.100.75",

[Parameter(Mandatory=$false)]
# The name of the VIP template you created via the VMM Console.
$VipTemplateName = "ILB-VIP-Template",

[Parameter(Mandatory=$false)]
# Arbitrary but good to match the VIP you're using.
$VipName = "scvmm_192_168_100_75_443"

)

Import-Module virtualmachinemanager

$lb = Get-scLoadBalancer | where { $_.Service.Name -like $LBServiceName};
$vipNetwork = get-scvmnetwork -Name $VipNetworkName;

$vipMemberNics = @();
foreach ($vmName in $VipMemberVMNames)
{
$vm = get-scvirtualmachine -Name $vmName;
#    if ($vm.VirtualNetworkAdapters[0].VMNetwork.ID -ne $vipNetwork.ID)
#    {
#        $vm.VirtualNetworkAdapters[0] | set-scvirtualnetworkadapter -VMNetwork $vipNetwork;
#    }

$vipMemberNics += $vm.VirtualNetworkAdapters[0];
}

$existingVip = get-scloadbalancervip -Name $VipName
if ($existingVip -ne $null)
{
#    foreach ($mem in $existingVip.VipMembers)
#    {
#        $mem | remove-scloadbalancervipmember;
#    }

$existingVip | remove-scloadbalancervip;
}

$vipt = get-scloadbalancerviptemplate -Name $VipTemplateName;

$vip = New-SCLoadBalancerVIP -Name $VipName -LoadBalancer $lb
-IPAddress $VipAddress -LoadBalancerVIPTemplate $vipt
-FrontEndVMNetwork $vipNetwork
-BackEndVirtualNetworkAdapters $vipMemberNics;
Write-Output "Created VIP " $vip;

$vip = get-scloadbalancervip -Name $VipName;
Write-Output " VIP created successfully " $vip;