使用 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。
开始之前
确保以下信息:
部署 SDN 网络控制器 和 SDN 软件负载均衡器 。
所需的 VM 是在适当的网络上创建的,并标识用于负载均衡。
创建 VIP 模板
使用以下过程将 VIP 配置为对工作负荷 VM(DIP)进行负载均衡。
在 VMM 控制台中,选择“构造>VIP 模板”。 右键单击并选择“ 创建 VIP 模板”。
在“ 名称” 页中,提供名称和可选说明。 指定 将用作网络流量的前端端口的虚拟 IP 端口 。 在 后端端口中,指定后端工作负荷托管的端口。 选择下一步。
在“类型”中,在“指定模板类型”下,选择“特定”。 从“制造商”下拉列表中选择Microsoft,并从“模型”下拉列表Microsoft网络控制器。
选择下一步。
在 “指定协议”选项中,选择协议名称中的“自定义”选项和“TCP/UDP”。 选择下一步。
注意
SLB 仅支持 TCP/UDP 流量的第 4 层负载均衡。 不支持 HTTP/HTTPS 协议。
对于 持久性 和 负载均衡,请使用默认值。 选择下一步。
注意
SLB 不支持持久性和不同的负载均衡方法。 默认情况下,SLB 使用轮循机制算法进行负载均衡。
在 运行状况监视器中,(可选)插入适当的值。 选择下一步。
选项:如果使用 SLB,则 TCP 和 HTTP 作为运行状况监视器协议受支持。
验证设置,然后选择“ 完成”。
创建模板后,可以在 Fabric>VIP 模板下找到此模板。
使用 PowerShell 创建 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;