設定軟體負載平衡器以進行負載平衡和網路位址轉譯 (NAT)
您可以使用本主題,了解如何使用軟體定義的網路功能 (SDN) 軟體負載平衡器 (SLB),在應用程式的多個執行個體之間提供輸出網路位址轉譯 (NAT)、輸入 NAT 或負載平衡。
軟體負載平衡器概觀
SDN 軟體負載平衡器 (SLB) 可為您的應用程式提供高可用性和網路效能。 這是第 4 層 (TCP、UDP) 負載平衡器,可將傳入流量分散到雲端服務中狀況良好的服務執行個體,或負載平衡器集中定義的虛擬機器。
設定 SLB 以執行下列動作:
- 將虛擬網路外部的傳入流量負載平衡至虛擬機器 (VM),也稱為公用 VIP 負載平衡。
- 在虛擬網路中的 VM 之間、在雲端服務中的 VM 之間,或在跨單位虛擬網路中的內部部署電腦與 VM 之間,對傳入流量進行負載平衡。
- 使用網路位址轉譯 (NAT) 將 VM 網路流量從虛擬網路轉送至外部目的地,這也稱為輸出 NAT。
- 將外部流量轉送至特定 VM,這也稱為輸入 NAT。
範例:建立公用 VIP 以對虛擬網路上兩個 VM 的集區進行負載平衡
在此範例中,您會建立一個負載平衡器物件,該物件具有公用 VIP 和兩個作為集區成員的 VM,用以處理對 VIP 的要求。 此範例程式碼也會新增 HTTP 健康情況探查,以偵測是否有其中一個集區成員無法回應。
準備負載平衡器物件。
import-module NetworkController $URI = "https://sdn.contoso.com" $LBResourceId = "LB2" $LoadBalancerProperties = new-object Microsoft.Windows.NetworkController.LoadBalancerProperties
指派前端 IP 位址,通常稱為虛擬 IP (VIP)。
VIP 必須來自提供給負載平衡器管理員的其中一個邏輯網路 IP 集區內未使用的 IP。
$VIPIP = "10.127.134.5" $VIPLogicalNetwork = get-networkcontrollerlogicalnetwork -ConnectionUri $uri -resourceid "PublicVIP" -PassInnerException $FrontEndIPConfig = new-object Microsoft.Windows.NetworkController.LoadBalancerFrontendIpConfiguration $FrontEndIPConfig.ResourceId = "FE1" $FrontEndIPConfig.ResourceRef = "/loadBalancers/$LBResourceId/frontendIPConfigurations/$($FrontEndIPConfig.ResourceId)" $FrontEndIPConfig.Properties = new-object Microsoft.Windows.NetworkController.LoadBalancerFrontendIpConfigurationProperties $FrontEndIPConfig.Properties.Subnet = new-object Microsoft.Windows.NetworkController.Subnet $FrontEndIPConfig.Properties.Subnet.ResourceRef = $VIPLogicalNetwork.Properties.Subnets[0].ResourceRef $FrontEndIPConfig.Properties.PrivateIPAddress = $VIPIP $FrontEndIPConfig.Properties.PrivateIPAllocationMethod = "Static" $LoadBalancerProperties.FrontEndIPConfigurations += $FrontEndIPConfig
配置後端位址集區,其中包含組成負載平衡的 VM 集合成員的動態 IP (DIP)。
$BackEndAddressPool = new-object Microsoft.Windows.NetworkController.LoadBalancerBackendAddressPool $BackEndAddressPool.ResourceId = "BE1" $BackEndAddressPool.ResourceRef = "/loadBalancers/$LBResourceId/backendAddressPools/$($BackEndAddressPool.ResourceId)" $BackEndAddressPool.Properties = new-object Microsoft.Windows.NetworkController.LoadBalancerBackendAddressPoolProperties $LoadBalancerProperties.backendAddressPools += $BackEndAddressPool
定義負載平衡器用來判斷後端集區成員健康情況狀態的健康情況探查。
在此範例中,您會定義一個 HTTP 探查,用以查詢 "/health.htm" 的 RequestPath。查詢每隔 5 秒執行一次,如 IntervalInSeconds 屬性所指定。
健康情況探查的查詢必須連續 11 次接收到 HTTP 回應碼 200,探查才會將後端 IP 視為狀況良好。 後端 IP 若狀況不良,則不會從負載平衡器接收流量。
重要
對於套用至後端 IP 的任何存取控制清單 (ACL),請勿封鎖子網路中第一個 IP 的輸入或輸出流量,因為這是探查的起始點。
使用下列範例來定義健康情況探查。
$Probe = new-object Microsoft.Windows.NetworkController.LoadBalancerProbe $Probe.ResourceId = "Probe1" $Probe.ResourceRef = "/loadBalancers/$LBResourceId/Probes/$($Probe.ResourceId)" $Probe.properties = new-object Microsoft.Windows.NetworkController.LoadBalancerProbeProperties $Probe.properties.Protocol = "HTTP" $Probe.properties.Port = "80" $Probe.properties.RequestPath = "/health.htm" $Probe.properties.IntervalInSeconds = 5 $Probe.properties.NumberOfProbes = 11 $LoadBalancerProperties.Probes += $Probe
定義負載平衡規則,以將抵達前端 IP 的流量傳送至後端 IP。 在此範例中,後端集區會接收前往連接埠 80 的 TCP 流量。
使用下列範例來定義負載平衡規則:
$Rule = new-object Microsoft.Windows.NetworkController.LoadBalancingRule $Rule.ResourceId = "webserver1" $Rule.Properties = new-object Microsoft.Windows.NetworkController.LoadBalancingRuleProperties $Rule.Properties.FrontEndIPConfigurations += $FrontEndIPConfig $Rule.Properties.backendaddresspool = $BackEndAddressPool $Rule.Properties.protocol = "TCP" $Rule.Properties.FrontEndPort = 80 $Rule.Properties.BackEndPort = 80 $Rule.Properties.IdleTimeoutInMinutes = 4 $Rule.Properties.Probe = $Probe $LoadBalancerProperties.loadbalancingRules += $Rule
將負載平衡器設定新增至網路控制卡。
使用下列範例,將負載平衡器設定新增至網路控制卡:
$LoadBalancerResource = New-NetworkControllerLoadBalancer -ConnectionUri $URI -ResourceId $LBResourceId -Properties $LoadBalancerProperties -Force -PassInnerException
參考下一個範例,將網路介面新增至此後端集區。
範例:使用 SLB 進行輸出 NAT
在此範例中,您會使用後端集區設定 SLB 以提供輸出 NAT 功能,讓虛擬網路私人位址空間上的 VM 可以對外連線到網際網路。
建立負載平衡器屬性、前端 IP 和後端集區。
import-module NetworkController $URI = "https://sdn.contoso.com" $LBResourceId = "OutboundNATMMembers" $VIPIP = "10.127.134.6" $VIPLogicalNetwork = get-networkcontrollerlogicalnetwork -ConnectionUri $uri -resourceid "PublicVIP" -PassInnerException $LoadBalancerProperties = new-object Microsoft.Windows.NetworkController.LoadBalancerProperties $FrontEndIPConfig = new-object Microsoft.Windows.NetworkController.LoadBalancerFrontendIpConfiguration $FrontEndIPConfig.ResourceId = "FE1" $FrontEndIPConfig.ResourceRef = "/loadBalancers/$LBResourceId/frontendIPConfigurations/$($FrontEndIPConfig.ResourceId)" $FrontEndIPConfig.Properties = new-object Microsoft.Windows.NetworkController.LoadBalancerFrontendIpConfigurationProperties $FrontEndIPConfig.Properties.Subnet = new-object Microsoft.Windows.NetworkController.Subnet $FrontEndIPConfig.Properties.Subnet.ResourceRef = $VIPLogicalNetwork.Properties.Subnets[0].ResourceRef $FrontEndIPConfig.Properties.PrivateIPAddress = $VIPIP $FrontEndIPConfig.Properties.PrivateIPAllocationMethod = "Static" $LoadBalancerProperties.FrontEndIPConfigurations += $FrontEndIPConfig $BackEndAddressPool = new-object Microsoft.Windows.NetworkController.LoadBalancerBackendAddressPool $BackEndAddressPool.ResourceId = "BE1" $BackEndAddressPool.ResourceRef = "/loadBalancers/$LBResourceId/backendAddressPools/$($BackEndAddressPool.ResourceId)" $BackEndAddressPool.Properties = new-object Microsoft.Windows.NetworkController.LoadBalancerBackendAddressPoolProperties $LoadBalancerProperties.backendAddressPools += $BackEndAddressPool
定義輸出 NAT 規則。
$OutboundNAT = new-object Microsoft.Windows.NetworkController.LoadBalancerOutboundNatRule $OutboundNAT.ResourceId = "onat1" $OutboundNAT.properties = new-object Microsoft.Windows.NetworkController.LoadBalancerOutboundNatRuleProperties $OutboundNAT.properties.frontendipconfigurations += $FrontEndIPConfig $OutboundNAT.properties.backendaddresspool = $BackEndAddressPool $OutboundNAT.properties.protocol = "ALL" $LoadBalancerProperties.OutboundNatRules += $OutboundNAT
在網路控制卡中新增負載平衡器物件。
$LoadBalancerResource = New-NetworkControllerLoadBalancer -ConnectionUri $URI -ResourceId $LBResourceId -Properties $LoadBalancerProperties -Force -PassInnerException
參考下一個範例,確認您想要提供對哪些網路介面的網際網路存取,並予以新增。
範例:將網路介面新增至後端集區
在此範例中,您會將網路介面新增至後端集區。 您必須對每個可處理 VIP 要求的網路介面重複此步驟。
您也可以對單一網路介面重複此程序,以將其新增至多個負載平衡器物件。 例如,如果您將一個負載平衡器物件用於網頁伺服器 VIP,並且用另一個負載平衡器物件提供輸出 NAT。
取得包含後端集區的負載平衡器物件以新增網路介面。
$lbresourceid = "LB2" $lb = get-networkcontrollerloadbalancer -connectionuri $uri -resourceID $LBResourceId -PassInnerException
取得網路介面,並將 backendaddress 集區新增至 loadbalancerbackendaddresspools 陣列。
$nic = get-networkcontrollernetworkinterface -connectionuri $uri -resourceid 6daca142-7d94-0000-1111-c38c0141be06 -PassInnerException $nic.properties.IpConfigurations[0].properties.LoadBalancerBackendAddressPools += $lb.properties.backendaddresspools[0]
放置網路介面以套用變更。
new-networkcontrollernetworkinterface -connectionuri $uri -resourceid 6daca142-7d94-0000-1111-c38c0141be06 -properties $nic.properties -force -PassInnerException
範例:使用軟體負載平衡器來轉送流量
如果您需要將虛擬 IP 對應至虛擬網路上的單一網路介面,而不定義個別連接埠,您可以建立 L3 轉送規則。 此規則會透過 PublicIPAddress 物件中包含的已指派 VIP,轉送所有進出於 VM 的流量。
如果您將 VIP 和 DIP 定義為相同的子網路,這將相當於執行不具 NAT 的 L3 轉送。
注意
執行此程序時,您無須建立負載平衡器物件。 只要確實將 PublicIPAddress 指派給網路介面,軟體負載平衡器即可執行其設定。
建立用來包含 VIP 的公用 IP 物件。
$publicIPProperties = new-object Microsoft.Windows.NetworkController.PublicIpAddressProperties $publicIPProperties.ipaddress = "10.127.134.7" $publicIPProperties.PublicIPAllocationMethod = "static" $publicIPProperties.IdleTimeoutInMinutes = 4 $publicIP = New-NetworkControllerPublicIpAddress -ResourceId "MyPIP" -Properties $publicIPProperties -ConnectionUri $uri -Force -PassInnerException
將 PublicIPAddress 指派給網路介面。
$nic = get-networkcontrollernetworkinterface -connectionuri $uri -resourceid 6daca142-7d94-0000-1111-c38c0141be06 $nic.properties.IpConfigurations[0].Properties.PublicIPAddress = $publicIP New-NetworkControllerNetworkInterface -ConnectionUri $uri -ResourceId $nic.ResourceId -Properties $nic.properties -PassInnerException
範例:使用軟體負載平衡器透過動態配置的 VIP 來轉送流量
此範例會重複上一個範例的相同動作,但會自動從負載平衡器中可用的 VIP 集區配置 VIP,而不是指定特定的 IP 位址。
建立用來包含 VIP 的公用 IP 物件。
$publicIPProperties = new-object Microsoft.Windows.NetworkController.PublicIpAddressProperties $publicIPProperties.PublicIPAllocationMethod = "dynamic" $publicIPProperties.IdleTimeoutInMinutes = 4 $publicIP = New-NetworkControllerPublicIpAddress -ResourceId "MyPIP" -Properties $publicIPProperties -ConnectionUri $uri -Force -PassInnerException
查詢 PublicIPAddress 資源以確認已指派的 IP 位址。
(Get-NetworkControllerPublicIpAddress -ConnectionUri $uri -ResourceId "MyPIP").properties
IpAddress 屬性包含已指派的位址。 輸出會顯示如下:
Counters : {} ConfigurationState : IpAddress : 10.127.134.2 PublicIPAddressVersion : IPv4 PublicIPAllocationMethod : Dynamic IdleTimeoutInMinutes : 4 DnsSettings : ProvisioningState : Succeeded IpConfiguration : PreviousIpConfiguration :
將 PublicIPAddress 指派給網路介面。
$nic = get-networkcontrollernetworkinterface -connectionuri $uri -resourceid 6daca142-7d94-0000-1111-c38c0141be06 $nic.properties.IpConfigurations[0].Properties.PublicIPAddress = $publicIP New-NetworkControllerNetworkInterface -ConnectionUri $uri -ResourceId $nic.ResourceId -Properties $nic.properties -PassInnerException
範例:移除用來轉送流量的 PublicIP 位址,並將其傳回至 VIP 集區
此範例會移除先前的範例所建立的 PublicIPAddress 資源。 PublicIPAddress 移除後,對 PublicIPAddress 的參考就會自動從網路介面中移除、流量將會停止轉送,且 IP 位址會傳回至公用 VIP 集區以供重複使用。
移除 PublicIP
Remove-NetworkControllerPublicIPAddress -ConnectionURI $uri -ResourceId "MyPIP"