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

可以使用软件负载均衡器 (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网络控制器

  4. 选择下一步

    VIP 协议选项的屏幕截图。

  5. “指定协议”选项中,选择协议名称中的“自定义”选项和“TCP/UDP”。 选择下一步

    注意

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

  6. 对于 持久性负载均衡,请使用默认值。 选择下一步

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

    注意

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

  7. 运行状况监视器中,(可选)插入适当的值。 选择下一步

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

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

创建模板后,可以在 Fabric>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 ILB-001 和 ILB-002 进行负载均衡,这些 VM 是同一租户 VM 网络的一部分。

此脚本还可以通过传递 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;