부하 분산 및 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 상태 프로브를 추가하여 풀 구성원 중 하나가 응답하지 않는지 여부를 감지합니다.
부하 분산 장치 개체를 준비합니다.
import-module NetworkController $URI = "https://sdn.contoso.com" $LBResourceId = "LB2" $LoadBalancerProperties = new-object Microsoft.Windows.NetworkController.LoadBalancerProperties
보통 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
부하 분산된 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
부하 분산 장치가 백 엔드 풀 구성원의 상태를 확인하는 데 사용하는 상태 프로브를 정의합니다.
이 예제에서는 "/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
프런트 엔드 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
다음 예제에 따라 이 백 엔드 풀에 네트워크 인터페이스를 추가합니다.
예: 아웃바운드 NAT에 SLB 사용
이 예제에서는 가상 네트워크의 프라이빗 주소 공간에서 VM에 아웃바운드 NAT 기능을 제공하여 인터넷에 아웃바운드로 연결하도록 백 엔드 풀을 사용하여 SLB를 구성합니다.
부하 분산 장치 속성, 프런트 엔드 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
네트워크 인터페이스를 가져와서 loadbalancerbackendaddresspools 배열에 backendaddress 풀을 추가합니다.
$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로 트래픽을 전달하기 위해 소프트웨어 부하 분산 장치 사용
이 예제에서는 이전 예제와 동일한 작업을 반복하지만 특정 IP 주소를 지정하는 대신 부하 분산 장치의 사용 가능한 VIP 풀에서 VIP를 자동으로 할당합니다.
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"