VMM を使用して SDN ファブリックのネットワーク トラフィックを負荷分散する

ソフトウェア ロード バランサー (SLB) を使って、クラウド サービス プロバイダー (CSP) とテナントによって管理されるソフトウェアによるネットワーク制御 (SDN) でワークロードにネットワーク トラフィックを均等に分散させることができます。 詳細については、ソフトウェア ロード バランサー (SLB) に関する記事を参照してください。

System Center Virtual Machine Manager (VMM) では、負荷分散の次の 2 つのシナリオがサポートされています。

  • 外部ネットワーク トラフィックの負荷分散: このシナリオには、外部ネットワークから送信されるネットワーク トラフィックの負荷分散が含まれます。 負荷分散は、パブリック仮想 IP (VIP) を介して行われます。 ワークロード VM は、 分離 VM ネットワークに接続することも、 network 仮想化 有効な VM ネットワークに接続することもできます。

  • 内部ネットワーク トラフィックの負荷分散 (内部負荷分散): このシナリオには、 network 仮想化が有効になっている VM ネットワーク内のワークロードのネットワーク トラフィックの負荷分散が含まれます。 負荷分散は VIP を介して行われます。

    Note

    VMM 2016 では、PowerShell を使用した負荷分散の構成がサポートされています。 サービス テンプレートを使用した構成は現在サポートされていません。

この記事では、PowerShell を使用してワークロード VM の負荷分散を構成する方法について説明します。

Note

  • VMM 2019 UR1 から、 One Connected ネットワークの種類が Connected Network に変更されました
  • VMM 2019 UR2 以降では、IPv6 がサポートされています。

開始する前に

次のことを確認します。

VIP テンプレートを作成する

ワークロード VM (DIP) の負荷分散を行う VIP を構成するには、次の手順に従います。

  1. VMM コンソールで、 Fabric>VIP テンプレートを選択します。 右クリックして[VIP テンプレートの作成] 選択

    VIP テンプレート名のスクリーンショット。

  2. Name ページで、名前と省略可能な説明を指定します。 ネットワーク トラフィックのフロントエンド ポートとして使用する 仮想 IP ポート を指定します。 バックエンド ポートで、バックエンド ワークロードをホストするポートを指定します。 [次へ] を選択します。

    VIP テンプレートの種類のスクリーンショット。

  3. Typeテンプレートの種類を指定しますで、Specificを選択します。 [製造元] ドロップダウンから Microsoft を選択し、[モデル] ドロップダウンから [Microsoft ネットワーク コントローラーします。

  4. [次へ] を選択します。

    VIP プロトコル オプションのスクリーンショット。

  5. Specify Protocol オプションで、[プロトコル名] で [カスタム] オプションと [TCP/UDP] を選択します。 [次へ] を選択します。

    Note

    SLB では、TCP/UDP トラフィックのレイヤー 4 負荷分散のみがサポートされます。 HTTP/HTTPS プロトコルはサポートされていません。

  6. PersistenceLoad Balancing では、既定値を使用します。 [次へ] を選択します。

    ヘルス モニターのスクリーンショット。

    Note

    SLB では、永続化とさまざまな負荷分散方法はサポートされていません。 既定では、SLB は負荷分散にラウンド ロビン アルゴリズムを使用します。

  7. ヘルス モニターで必要に応じて、適切な値を挿入します。 [次へ] を選択します。

    オプション: SLB が使用されている場合、TCP と HTTP は正常性モニター プロトコルとしてサポートされます。

  8. 設定を確認し、 Finish を選択します。

テンプレートが作成されると、 Fabric>VIP テンプレートの下に表示されます。

PowerShell を使用して VIP を作成する

次のサンプル スクリプトを使用して VIP を作成します。 負荷分散するネットワーク トラフィックの種類に基づいてスクリプトを選択します。

外部ネットワーク トラフィックを負荷分散する VIP を作成するためのスクリプト

内部ネットワーク トラフィックを負荷分散する VIP を作成するためのスクリプト

外部ネットワーク トラフィックを負荷分散する VIP を作成するためのスクリプト

次のサンプル スクリプトでは、パブリック IP ネットワークから VIP を作成し、ポート 80 でワークロード VM WGB-001 と WGB-002 を負荷分散します。

このスクリプトを使用して、IPv6 VIP アドレスを渡すことで負荷分散 VIP を作成することもできます。

ワークロード VM は、 分離 ネットワークまたは network 仮想化 有効な VM ネットワークに接続できます。

Note

  • スクリプト パラメーター セクションで、テスト環境に一致する実際の値を、このスクリプトで使用されるサンプルに置き換えます。
  • 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 を作成するためのスクリプト

次のスクリプト例では、「 previous」セクションで詳しく説明する手順を使用して、ポート 443 を負荷分散するための新しい VIP テンプレートを ILB-VIP-Template という名前で作成しました。 このスクリプトでは、テナント VM ネットワークから VIP を作成して、同じテナント VM ネットワークの一部である VM ILB-001 と ILB-002 を負荷分散します。

このスクリプトを使用して、IPv6 VIP アドレスを渡すことで負荷分散 VIP を作成することもできます。

Note

  • 内部負荷分散シナリオでは、VIP はテナント VM ネットワークから取得されます。 そのため、 $VipNetworkName は、VM が接続されているのと同じテナント VM ネットワーク名です。 テナント VM ネットワーク IP プールに VIP 用に予約された IP があることを確認します。 $VipAddressは、予約 VIP からの IP アドレスの 1 つです。
  • スクリプト パラメーター セクションで、テスト環境に一致する実際の値を、このスクリプトで使用されるサンプルに置き換えます。
  • 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;