Поделиться через


Настройка программного балансировщика нагрузки для балансировки нагрузки и преобразования сетевых адресов (NAT)

Область применения: Windows Server 2022, Windows Server 2019, Windows Server 2016, Azure Stack HCI, версии 21H2 и 20H2

В этом разделе описано, как использовать подсистему балансировки нагрузки программного обеспечения (SDN) программной подсистемы балансировки нагрузки (SLB) для перевода исходящих сетевых адресов (NAT), входящего NAT или балансировки нагрузки между несколькими экземплярами приложения.

Общие сведения о ПО Load Balancer

SdN Software Load Balancer (SLB) обеспечивает высокий уровень доступности и производительность сети для приложений. Это подсистема балансировки нагрузки уровня 4 (TCP, UDP), которая распределяет входящий трафик между здоровыми экземплярами служб в облачных службах или виртуальных машинах, определенных в наборе подсистемы балансировки нагрузки.

Настройте SLB для выполнения следующих действий:

  • Балансировка нагрузки входящего трафика во внешней сети к виртуальным машинам (виртуальным машинам) также называется балансировкой нагрузки общедоступных ВИРТУАЛЬНЫх IP-адресов.
  • Балансировка нагрузки входящего трафика между виртуальными машинами в виртуальной сети, между виртуальными машинами в облачных службах или между локальными компьютерами и виртуальными машинами в локальной виртуальной сети.
  • Переадресация сетевого трафика виртуальной машины из виртуальной сети во внешние назначения с помощью преобразования сетевых адресов (NAT) также называется исходящим NAT.
  • Перенаправка внешнего трафика на определенную виртуальную машину, которая также называется входящий NAT.

Пример. Создание общедоступного ВИРТУАЛЬНОГО IP-адреса для балансировки нагрузки пула двух виртуальных машин в виртуальной сети

В этом примере создается объект подсистемы балансировки нагрузки с общедоступным виртуальным IP-адресом и двумя виртуальными машинами в качестве участников пула для обслуживания запросов к виртуальному ip-адресу. Этот пример кода также добавляет пробу работоспособности HTTP, чтобы определить, становится ли один из членов пула не адаптивным.

  1. Подготовьте объект подсистемы балансировки нагрузки.

     import-module NetworkController
    
     $URI = "https://sdn.contoso.com"
    
     $LBResourceId = "LB2"
    
     $LoadBalancerProperties = new-object Microsoft.Windows.NetworkController.LoadBalancerProperties
    
  2. Назначьте внешний IP-адрес, который обычно называется виртуальным IP-адресом (VIP).

    IP-адрес должен быть из неиспользуемого 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
    
  3. Выделите внутренний пул адресов, содержащий динамические IP-адреса (DIPs), составляющие члены подсистемы балансировки нагрузки виртуальных машин.

     $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
    
  4. Определите пробу работоспособности, которую использует подсистема балансировки нагрузки для определения состояния работоспособности членов внутреннего пула.

    В этом примере вы определяете пробу HTTP, которая запрашивает запрос к RequestPath объекта "/health.htm". Запрос выполняется каждые 5 секунд, как указано в свойстве IntervalInSeconds.

    Проба работоспособности должна получить код ответа HTTP 200 для 11 последовательных запросов для проверки работоспособности внутреннего IP-адреса. Если внутренний IP-адрес не работоспособен, он не получает трафик от подсистемы балансировки нагрузки.

    Внимание

    Не блокируйте трафик на первый IP-адрес в подсети для любых списков контроль доступа (списков управления доступом), которые применяются к внутреннему 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
    
  5. Определите правило балансировки нагрузки для отправки трафика, который поступает в интерфейсный IP-адрес в внутренний IP-адрес. В этом примере внутренний пул получает TCP-трафик через порт 80.

    Используйте следующий пример, чтобы определить правило балансировки нагрузки:

    $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
    
  6. Добавьте конфигурацию подсистемы балансировки нагрузки в сетевой контроллер.

    Используйте следующий пример, чтобы добавить конфигурацию подсистемы балансировки нагрузки в сетевой контроллер.

     $LoadBalancerResource = New-NetworkControllerLoadBalancer -ConnectionUri $URI -ResourceId $LBResourceId -Properties $LoadBalancerProperties -Force -PassInnerException
    
  7. Следуйте следующему примеру, чтобы добавить сетевые интерфейсы в этот внутренний пул.

Пример. Использование SLB для исходящего NAT

В этом примере вы настроите SLB с внутренним пулом для предоставления возможности исходящего NAT для виртуальной машины в частном адресном пространстве виртуальной сети для доступа к Интернету.

  1. Создайте свойства подсистемы балансировки нагрузки, интерфейсный 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
    
  2. Определите правило исходящего 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
    
  3. Добавьте объект подсистемы балансировки нагрузки в сетевом контроллере.

     $LoadBalancerResource = New-NetworkControllerLoadBalancer -ConnectionUri $URI -ResourceId $LBResourceId -Properties $LoadBalancerProperties -Force -PassInnerException
    
  4. Следуйте следующему примеру, чтобы добавить сетевые интерфейсы, к которым требуется предоставить доступ к Интернету.

Пример. Добавление сетевых интерфейсов в внутренний пул

В этом примере вы добавите сетевые интерфейсы в внутренний пул. Этот шаг необходимо повторить для каждого сетевого интерфейса, который может обрабатывать запросы, сделанные в IP-адрес.

Этот процесс также можно повторить на одном сетевом интерфейсе, чтобы добавить его в несколько объектов подсистемы балансировки нагрузки. Например, если у вас есть объект подсистемы балансировки нагрузки для виртуального IP-адреса веб-сервера и отдельный объект подсистемы балансировки нагрузки для предоставления исходящего NAT.

  1. Получите объект подсистемы балансировки нагрузки, содержащий внутренний пул, чтобы добавить сетевой интерфейс.

    $lbresourceid = "LB2"
    $lb = get-networkcontrollerloadbalancer -connectionuri $uri -resourceID $LBResourceId -PassInnerException
    
  2. Получите сетевой интерфейс и добавьте внутренний пулaddress в массив loadbalancerbackendaddresspools.

    $nic = get-networkcontrollernetworkinterface  -connectionuri $uri -resourceid 6daca142-7d94-0000-1111-c38c0141be06 -PassInnerException
    $nic.properties.IpConfigurations[0].properties.LoadBalancerBackendAddressPools += $lb.properties.backendaddresspools[0]
    
  3. Поместите сетевой интерфейс для применения изменения.

    new-networkcontrollernetworkinterface  -connectionuri $uri -resourceid 6daca142-7d94-0000-1111-c38c0141be06 -properties $nic.properties -force -PassInnerException
    

Пример. Использование подсистемы балансировки нагрузки программного обеспечения для пересылки трафика

Если необходимо сопоставить виртуальный IP-адрес с одним сетевым интерфейсом в виртуальной сети без определения отдельных портов, можно создать правило пересылки L3. Это правило перенаправит весь трафик на виртуальную машину и из нее через назначенный ВИРТУАЛЬНЫй IP-адрес, содержащийся в объекте PublicIPAddress.

Если вы определили ВИРТУАЛЬНЫЙ IP-адрес и DIP как ту же подсеть, то это эквивалентно выполнению перенаправления L3 без NAT.

Примечание.

Этот процесс не требует создания объекта подсистемы балансировки нагрузки. Назначение PublicIPAddress сетевому интерфейсу достаточно сведений для выполнения настройки программной подсистемы балансировки нагрузки.

  1. Создайте общедоступный IP-объект для хранения виртуального 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
    
  2. Назначьте 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
    

Пример. Использование Программной подсистемы балансировки нагрузки для пересылки трафика с динамически выделенным ВИРТУАЛЬНЫМ IP-адресом

В этом примере повторяется то же действие, что и в предыдущем примере, но он автоматически выделяет виртуальный IP-адрес из доступного пула IP-адресов в подсистеме балансировки нагрузки вместо указания определенного IP-адреса.

  1. Создайте общедоступный IP-объект для хранения виртуального 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
    
  2. Запросите ресурс 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  :
    
  3. Назначьте 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
    

    Пример. Удаление общедоступного IP-адреса, который используется для переадресации трафика и возврата его в пул ВИРТУАЛЬНЫх IP-адресов

    В этом примере удаляется ресурс PublicIPAddress, созданный в предыдущих примерах. После удаления PublicIPAddress ссылка на PublicIPAddress будет автоматически удалена из сетевого интерфейса, трафик перестанет пересылаться, а IP-адрес будет возвращен в пул общедоступных ВИРТУАЛЬНЫх IP-адресов для повторного использования.

  4. Удаление общедоступного IP-адреса

    Remove-NetworkControllerPublicIPAddress -ConnectionURI $uri -ResourceId "MyPIP"