다음을 통해 공유


부하 분산 및 NAT(Network Address Translation)에 대한 소프트웨어 부하 분산 장치 구성

이 토픽을 활용하면 SDN(소프트웨어 정의 네트워킹) SLB(소프트웨어 부하 분산 장치)를 사용하여 아웃바운드 NAT(Network Address Translation), 인바운드 NAT 또는 애플리케이션의 여러 인스턴스 간에 부하 분산을 제공하는 방법을 알아볼 수 있습니다.

소프트웨어 부하 분산 장치 개요

SDN SLB(소프트웨어 부하 분산 장치)는 애플리케이션에 고가용성 및 네트워크 성능을 제공합니다. 부하 분산 장치 설정에 정의된 클라우드 서비스 또는 가상 컴퓨터의 정상적인 서비스 인스턴스에 수신 트래픽을 배포하는 계층 4(TCP, UDP) 부하 분산 장치입니다.

SLB를 구성하여 다음을 수행합니다.

  • 가상 네트워크 외부에서 들어오는 트래픽을 VM(가상 머신)으로 부하 분산하며 공용 VIP 부하 분산이라고도 합니다.
  • 가상 네트워크의 VM 간, 클라우드 서비스의 VM 간 또는 온-프레미스 컴퓨터와 프레미스 간 가상 네트워크의 VM 간에 들어오는 트래픽의 부하를 분산합니다.
  • 아웃바운드 NAT라고도 하는 NAT(Network Address Translation)를 사용하여 가상 네트워크에서 외부 대상으로 VM 네트워크 트래픽을 전달합니다.
  • 외부 트래픽을 인바운드 NAT라고도 하는 특정 VM으로 전달합니다.

예: 가상 네트워크에서 두 VM의 풀 부하 분산을 위한 공용 VIP 만들기

이 예제에서는 공용 VIP와 두 개의 VM을 풀 구성원으로 부하 분산 장치 개체를 만들어 VIP에 대한 요청을 처리합니다. 또한 이 예제 코드는 HTTP 상태 프로브를 추가하여 풀 구성원 중 하나가 응답하지 않는지 여부를 감지합니다.

  1. 부하 분산 장치 개체를 준비합니다.

     import-module NetworkController
    
     $URI = "https://sdn.contoso.com"
    
     $LBResourceId = "LB2"
    
     $LoadBalancerProperties = new-object Microsoft.Windows.NetworkController.LoadBalancerProperties
    
  2. 보통 VIP(가상 IP)라고 하는 프런트 엔드 IP 주소를 할당합니다.

    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 집합의 구성원을 구성하는 DIP(동적 IP)를 포함하는 백 엔드 주소 풀을 할당합니다.

     $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. 부하 분산 장치가 백 엔드 풀 구성원의 상태를 확인하는 데 사용하는 상태 프로브를 정의합니다.

    이 예제에서는 "/health.htm"의 RequestPath를 쿼리하는 HTTP 프로브를 정의합니다. 이 쿼리는 IntervalInSeconds 속성에 지정된 대로 5초마다 실행됩니다.

    백 엔드 IP가 정상으로 간주되려면 상태 프로브에서 프로브에 대한 연속 쿼리 11개에 대해 HTTP 응답 코드 200을 수신해야 합니다. 백 엔드 IP가 정상이 아닌 경우 부하 분산 장치에서 트래픽을 수신하지 않습니다.

    Important

    백 엔드 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
    
  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. 다음 예제에 따라 이 백 엔드 풀에 네트워크 인터페이스를 추가합니다.

예: 아웃바운드 NAT에 SLB 사용

이 예제에서는 가상 네트워크의 프라이빗 주소 공간에서 VM에 아웃바운드 NAT 기능을 제공하여 인터넷에 아웃바운드로 연결하도록 백 엔드 풀을 사용하여 SLB를 구성합니다.

  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. 다음 예제에 따라 인터넷 액세스를 제공하려는 네트워크 인터페이스를 추가합니다.

예: 백 엔드 풀에 네트워크 인터페이스 추가

이 예제에서는 백 엔드 풀에 네트워크 인터페이스를 추가합니다. VIP에 대한 요청을 처리할 수 있는 각 네트워크 인터페이스에 대해 이 단계를 반복해야 합니다.

단일 네트워크 인터페이스에서 이 프로세스를 반복하여 여러 부하 분산 장치 개체에 추가할 수도 있습니다. 예를 들어 웹 서버 VIP에 대한 부하 분산 장치 개체와 아웃바운드 NAT를 제공하는 별도의 부하 분산 장치 개체가 있는 경우입니다.

  1. 백 엔드 풀이 포함된 부하 분산 장치 개체를 가져와서 네트워크 인터페이스를 추가합니다.

    $lbresourceid = "LB2"
    $lb = get-networkcontrollerloadbalancer -connectionuri $uri -resourceID $LBResourceId -PassInnerException
    
  2. 네트워크 인터페이스를 가져와서 loadbalancerbackendaddresspools 배열에 backendaddress 풀을 추가합니다.

    $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로 트래픽을 전달하기 위해 소프트웨어 부하 분산 장치 사용

이 예제에서는 이전 예제와 동일한 작업을 반복하지만 특정 IP 주소를 지정하는 대신 부하 분산 장치의 사용 가능한 VIP 풀에서 VIP를 자동으로 할당합니다.

  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"