配置软件负载均衡器以实现负载均衡和网络地址转换 (NAT)

可以在本主题中了解如何使用软件定义的网络 (SDN) 软件负载均衡器 (SLB) 来提供出站网络地址转换 (NAT)、入站 NAT,或多个应用程序实例之间的负载均衡。

软件负载均衡器概述

SDN 软件负载均衡器 (SLB) 为应用程序提供高可用性和网络性能。 它是一种第 4 层(TCP、UDP)负载均衡器,用于在云服务中的健康服务实例或负载均衡器集中定义的虚拟机之间分配传入流量。

配置 SLB 以实现以下目的:

  • 将虚拟网络外部的传入流量负载均衡到虚拟机 (VM),这也称为公共 VIP 负载均衡。
  • 对虚拟网络和云服务中 VM 之间的传入流量或本地计算机和跨界虚拟网络中 VM 之间的流量进行负载均衡。
  • 使用网络地址转换 (NAT) 将来自虚拟网络的 VM 网络流量转发到外部目标,这也称为出站 NAT。
  • 将外部流量转发到特定 VM,这也称为入站 NAT。

示例:创建公共 VIP 以便对虚拟网络上包含两个 VM 的池进行负载均衡

在此示例中,你将创建一个负载均衡器对象来处理对 VIP 的请求,该对象使用公共 VIP,并使用两个 VM 作为池成员。 此示例代码还会添加一个 HTTP 运行状况探测,以检测其中一个池成员是否无响应。

  1. 准备负载均衡器对象。

     import-module NetworkController
    
     $URI = "https://sdn.contoso.com"
    
     $LBResourceId = "LB2"
    
     $LoadBalancerProperties = new-object Microsoft.Windows.NetworkController.LoadBalancerProperties
    
  2. 分配前端 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
    
  3. 分配一个后端地址池,其中包含构成负载均衡 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
    
  4. 定义一个运行状况探测,负载均衡器使用它来确定后端池成员的运行状态。

    在此示例中,你将定义一个 HTTP 探测用于查询“/health.htm”的 RequestPath。该查询每隔 5 秒(由 IntervalInSeconds 属性指定)运行一次。

    运行状况探测必须收到 11 个连续查询的 HTTP 响应代码 200,才认为后端 IP 正常。 如果后端 IP 不正常,则该探测不会从负载均衡器接收流量。

    重要

    对于应用于后端 IP 的任何访问控制列表 (ACL),请不要阻止进出子网中第一个 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。 在此示例中,后端池将接收发往端口 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
    
  6. 将负载均衡器配置添加到网络控制器。

    使用以下示例将负载均衡器配置添加到网络控制器:

     $LoadBalancerResource = New-NetworkControllerLoadBalancer -ConnectionUri $URI -ResourceId $LBResourceId -Properties $LoadBalancerProperties -Force -PassInnerException
    
  7. 按照下一个示例将网络接口添加到此后端池。

示例:将 SLB 用于出站 NAT

在此示例中,你将使用后端池配置 SLB,以便提供出站 NAT 功能,使虚拟网络的专用地址空间中的 VM 能够出站访问 Internet。

  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. 按照下一个示例添加要为其提供 Internet 访问的网络接口。

示例:将网络接口添加到后端池

在此示例中,你要将网络接口添加到后端池。 对于可以处理向 VIP 发出的请求的每个网络接口,必须重复此步骤。

还可以针对单个网络接口重复此过程,以将此接口添加到多个负载均衡器对象。 例如,如果你为 Web 服务器 VIP 创建了一个负载均衡器对象,并创建了一个单独的负载均衡器对象来提供出站 NAT。

  1. 获取包含后端池的负载均衡器对象以添加网络接口。

    $lbresourceid = "LB2"
    $lb = get-networkcontrollerloadbalancer -connectionuri $uri -resourceID $LBResourceId -PassInnerException
    
  2. 获取网络接口并将 backendaddress 池添加到 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 转发规则。 此规则通过 PublicIPAddress 对象中包含的已分配 VIP 转发进出 VM 的所有流量。

如果将 VIP 和 DIP 定义为同一子网,则相当于在不使用 NAT 的情况下进行 L3 转发。

注意

此过程不需要创建负载均衡器对象。 将 PublicIPAddress 分配到网络接口可以提供足够的信息来让软件负载均衡器执行其配置。

  1. 创建一个用于包含 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
    
  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
    

示例:使用软件负载均衡器通过动态分配的 VIP 转发流量

此示例重复前一示例的相同操作,但它自动从负载均衡器中可用的 VIP 池分配 VIP,而不是指定特定的 IP 地址。

  1. 创建一个用于包含 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
    
  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
    

    示例:删除用于转发流量的 PublicIP 地址并将其返回到 VIP 池

    此示例删除前面的示例所创建的 PublicIPAddress 资源。 删除 PublicIPAddress 后,将自动从网络接口中删除对 PublicIPAddress 的引用,流量将停止转发,IP 地址将返回到公共 VIP 池以供重复使用。

  4. 删除 PublicIP

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