NHN Cloud는 DSR(direct server return) 방식의 로드 밸런서를 제공합니다. 로드 밸런서(DSR)를 이용하면,
로드 밸런서(DSR)는 일반 로드 밸런서와 다른 트래픽 처리 방식을 사용합니다.
| 구분 | 일반 로드 밸런서(프록시 모드) | 로드 밸런서(DSR) |
|---|---|---|
| 클라이언트 → 서버 | 로드 밸런서 경유 | 로드 밸런서 경유 |
| 서버 → 클라이언트 | 로드 밸런서 경유 | 로드 밸런서를 거치지 않고 직접 전송 |
| 원본 IP 확인 | X-Forwarded-For 헤더 또는 Proxy Protocol 필요 |
클라이언트 IP 직접 확인 가능 |
| 로드 밸런서 부하 | 요청/응답 모두 처리 | 요청만 처리 |
| 처리 성능 | 보통 | 매우 높음 |
| 프로토콜 지원 | HTTP, HTTPS, TERMINATED_HTTPS, TCP | TCP, UDP |
알아두기
DSR 방식은 응답 트래픽이 로드 밸런서를 거치지 않으므로 다음과 같은 장점이 있습니다:
로드 밸런서(DSR)는 세션 지속성(Session persistence) 기능을 제공합니다. 이 기능을 활성화하면 동일한 클라이언트의 요청을 지속적으로 같은 멤버 인스턴스로 전달할 수 있습니다.
멤버 선택은 별도의 sticky table을 두지 않고 해시 기반의 일관된 매핑(Consistent Hashing)으로 이루어집니다. 세션 지속성 비활성화 시에는 5-tuple을, 활성화 시에는 소스 IP를 해시 입력으로 사용하며, 멤버 구성이 같다면 동일한 입력 키는 항상 동일한 멤버로 매핑됩니다. 또한 한 번 수립된 세션이 유효한 동안에는 해당 세션의 모든 패킷이 동일한 멤버로 전달되어, 세션 단위의 멤버 고정이 보장됩니다.
세션 유지 방식은 프로토콜에 따라 다르게 동작합니다.
알아두기
세션 지속성은 다음과 같은 경우에 유용합니다.
알아두기
세션 지속성 설정은 운영 중에도 변경할 수 있습니다. 변경 시 기존에 수립된 TCP 연결 및 진행 중인 UDP 플로우에는 영향이 없으며, 새로운 연결/플로우부터 변경된 설정이 적용됩니다.
로드 밸런서(DSR)는 멤버로 등록된 인스턴스가 정상적으로 동작하는지 주기적으로 상태 확인(Health check)을 수행합니다. 상태 확인은 지정된 프로토콜에 따라 정해진 응답이 오는지 확인하는 방식입니다. 지정된 횟수나 시간 내에 정상 응답이 오지 않으면 비정상 인스턴스로 간주하여 부하 분산 대상에서 제외합니다. 이 기능으로 예기치 못한 장애나 점검에도 중단 없이 서비스를 제공할 수 있습니다.
로드 밸런서(DSR)는 다음과 같은 상태 확인 프로토콜을 지원합니다.
ICMP: ICMP Echo Request/Reply를 이용한 기본적인 연결성 확인 방식입니다. 인스턴스의 네트워크 연결 상태를 빠르게 확인할 수 있습니다. 요청은 멤버 인스턴스의 실제 IP를 목적지로 발송됩니다.
TCP: 지정된 포트로 TCP 연결을 시도하여 연결 가능 여부를 확인합니다. 특정 서비스 포트가 정상적으로 동작하는지 확인할 수 있습니다. 요청은 로드 밸런서(DSR)의 VIP를 목적지로 발송됩니다.
HTTP: 지정된 경로로 HTTP 요청을 전송하여 응답 코드를 확인합니다. 웹 애플리케이션의 실제 서비스 상태를 보다 정확하게 확인할 수 있습니다. 요청은 로드 밸런서(DSR)의 VIP를 목적지로 발송됩니다.
알아두기
TCP/HTTP 상태 확인은 DSR VIP를 목적지로 요청하므로, 멤버 서버의 lo 인터페이스에 VIP가 설정되어 있지 않으면 해당 패킷이 수신·처리되지 못해 상태 확인이 실패하고 멤버가 INACTIVE로 판정됩니다. 이는 서버 측 VIP 설정 누락을 조기에 탐지하기 위한 동작입니다. ICMP 상태 확인은 멤버의 실제 IP로 요청하므로 VIP 설정과 무관하게 연결성만 확인합니다.
상태 확인을 위해서는 다음 항목을 설정해야 합니다.
| 항목 | 설명 | 비고 |
|---|---|---|
| 지연 시간(delay) | 상태 확인 요청을 보내는 주기(초)입니다. | - |
| 최대 재시도 횟수(max_retries) | 인스턴스를 비정상으로 판단하기까지 재시도할 최대 횟수입니다. | 1~10회 |
| 타임아웃(timeout) | 각 상태 확인 요청의 타임아웃 시간(초)입니다. 이 시간 내에 응답이 없으면 실패로 간주합니다. | - |
| 프로토콜(type) | 상태 확인에 사용할 프로토콜입니다. | ICMP, TCP, HTTP |
| 포트(health_check_port) | 상태 확인을 수행할 포트 번호입니다. | TCP, HTTP 사용 시 필수 |
| HTTP 경로(http_path) | HTTP 상태 확인 시 요청을 보낼 URL 경로입니다. | HTTP 사용 시 설정(기본값: /) |
| 기대 HTTP 응답 코드(expected_http_code) | HTTP 상태 확인 시 정상으로 판단할 응답 코드입니다. | HTTP 사용 시 설정(기본값: 200) |
주의
지연 시간(delay)은 타임아웃(timeout)보다 크거나 같아야 합니다. 타임아웃이 지연 시간보다 크면 상태 확인이 정상적으로 동작하지 않을 수 있습니다.
로드 밸런서(DSR)는 VPC의 서브넷 내에서 생성됩니다.
로드 밸런서(DSR) 생성 시 VIP(virtual IP) 주소를 다음 두 가지 방식으로 할당할 수 있습니다.
주의
직접 지정한 VIP 주소가 서브넷의 CIDR 범위에 속하지 않으면 생성이 실패합니다. 반드시 해당 서브넷의 IP 범위 내에서 지정하세요.
로드 밸런서(DSR)는 인스턴스를 멤버로 등록하여 유입된 트래픽을 분배합니다. 멤버 등록 시 다음 사항을 준수해야 합니다.
device_owner가 compute: 접두사로 시작)주의
하나의 로드 밸런서(DSR)에는 기본적으로 최대 30개의 멤버를 등록할 수 있습니다. 더 많은 멤버가 필요한 경우 별도 문의가 필요합니다.
알아두기
INACTIVE입니다. 상태 확인을 통과하면 자동으로 ACTIVE 상태로 전환되어 트래픽을 수신하기 시작합니다.로드 밸런서(DSR)는 클라이언트의 요청을 멤버 서버에 VIP(virtual IP)를 목적지로 하여 전달합니다. 멤버 서버가 이 패킷을 정상적으로 수신하고 응답하려면, 서버 측에서 아래의 설정이 필요합니다.
주의
반드시 1단계(커널 파라미터) → 2단계(VIP 설정) 순서로 설정해야 합니다. 커널 파라미터를 설정하지 않고 VIP를 먼저 할당하면 로드 밸런서의 VIP와 ARP 충돌이 발생하여 네트워크 장애가 일어날 수 있습니다.
네트워크 인터페이스에 VIP를 설정하기 전에 서버가 VIP에 대한 ARP 요청에 응답하지 않도록 커널 설정을 먼저 수행해야 합니다. 이 설정을 하지 않고 VIP를 할당하면 로드 밸런서의 VIP와 충돌이 발생하여 네트워크 장애가 일어날 수 있습니다.
| 파라미터 | 값 | 설명 |
|---|---|---|
arp_ignore |
1 |
ARP 요청을 받았을 때 해당 IP가 요청이 들어온 인터페이스에 설정되어 있는 경우에만 응답합니다. (lo에 설정된 VIP에 대해서는 응답하지 않게 됨) |
arp_announce |
2 |
외부로 ARP 패킷을 보낼 때 소스 IP를 해당 인터페이스의 주소로 고정하여 VIP 주소를 유출하지 않습니다. |
sudo sysctl -w net.ipv4.conf.all.arp_ignore=1
sudo sysctl -w net.ipv4.conf.all.arp_announce=2
sudo sysctl -w net.ipv4.conf.lo.arp_ignore=1
sudo sysctl -w net.ipv4.conf.lo.arp_announce=2
파일 끝에 아래 내용을 추가합니다.
sudo tee -a /etc/sysctl.conf <<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
# 설정 반영
sudo sysctl -p
알아두기
적용 후 sysctl net.ipv4.conf.all.arp_ignore 명령으로 값이 1로 설정되었는지 확인할 수 있습니다.
서버가 로드 밸런서로부터 전달된 패킷(목적지가 VIP인 패킷)을 자신의 패킷으로 인식할 수 있도록 lo 인터페이스에 VIP를 부여합니다.
# <VIP> 부분을 실제 로드 밸런서 VIP 주소로 변경하세요.
sudo ip addr add <VIP>/32 dev lo
/etc/netplan/ 디렉터리 내의 설정 파일(예: 01-netcfg.yaml)을 수정합니다.
주의
기존 인터페이스 설정을 유지하면서 lo 부분만 추가하거나 병합해야 합니다.
network:
version: 2
renderer: networkd
ethernets:
lo:
addresses:
- 127.0.0.1/8
- <VIP>/32 # 로드 밸런서 VIP 추가
설정 적용:
sudo netplan apply
/etc/sysconfig/network-scripts/ifcfg-lo:0 파일을 생성합니다.
sudo tee /etc/sysconfig/network-scripts/ifcfg-lo:0 <<EOF
DEVICE=lo:0
IPADDR=<VIP>
NETMASK=255.255.255.255
ONBOOT=yes
EOF
설정 적용:
sudo ifup lo:0
하나의 인스턴스가 여러 로드 밸런서(DSR)의 멤버로 등록된 경우, 각 VIP를 모두 lo 인터페이스에 추가하고 네트워크 인터페이스의 추가 허용 주소에도 각 VIP를 모두 등록해야 합니다.
sudo ip addr add <VIP_1>/32 dev lo
sudo ip addr add <VIP_2>/32 dev lo
Netplan 영구 설정 예시:
network:
version: 2
renderer: networkd
ethernets:
lo:
addresses:
- 127.0.0.1/8
- <VIP_1>/32
- <VIP_2>/32
lo 인터페이스에 VIP가 /32 서브넷으로 정상 등록되었는지 확인합니다.
ip addr show lo
출력 예시:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
inet 127.0.0.1/8 scope host lo
inet 192.168.1.100/32 scope host lo
외부(동일 서브넷의 다른 서버)에서 VIP로 ARP 요청을 보냈을 때 멤버 서버의 MAC 주소가 응답되지 않아야 합니다. (로드 밸런서의 MAC만 응답해야 정상)
# 동일 서브넷의 다른 인스턴스에서 실행
arping -c 3 <VIP>
응답되는 MAC 주소가 로드 밸런서의 MAC인지 확인합니다. 멤버 서버의 MAC이 응답되면 ARP 설정이 잘못된 것입니다.
sysctl net.ipv4.conf.all.arp_ignore
sysctl net.ipv4.conf.all.arp_announce
sysctl net.ipv4.conf.lo.arp_ignore
sysctl net.ipv4.conf.lo.arp_announce
각각 1, 2, 1, 2가 출력되어야 합니다.
애플리케이션(Nginx, Apache, Tomcat 등) 설정 시 소켓이 0.0.0.0(Any) 또는 VIP를 수신 대기(Listen)하고 있어야 패킷을 수신할 수 있습니다.
| 바인딩 방식 | 설명 | 예시 |
|---|---|---|
0.0.0.0:포트 |
모든 IP에서 수신(권장) | listen 80;(Nginx 기본값) |
<VIP>:포트 |
VIP에서만 수신 | listen 192.168.1.100:80; |
<서버 IP>:포트 |
서버 자체 IP에서만 수신 — VIP 트래픽 수신 불가 | listen 10.0.0.5:80; |
주의
애플리케이션이 서버의 실제 인터페이스 IP(예: eth0의 IP)에만 바인딩되어 있으면 VIP로 도착한 패킷을 수신할 수 없습니다. 0.0.0.0으로 바인딩하거나, VIP 주소를 명시적으로 추가 바인딩해야 합니다.
로드 밸런서(DSR)는 멤버 서버에 주기적으로 상태 확인 요청을 보냅니다. 서버가 상태 확인에 정상 응답해야 ACTIVE 상태를 유지할 수 있습니다.
| 상태 확인 타입 | 서버 요구사항 |
|---|---|
| ICMP | ICMP Echo Request에 응답해야 합니다. 서버 내부 방화벽에서 ICMP를 차단하고 있다면 허용이 필요합니다. |
| TCP | 지정된 포트에서 TCP 연결을 수락해야 합니다. 해당 포트의 서비스가 기동 중이어야 합니다. |
| HTTP | 지정된 포트/경로에서 기대하는 HTTP 응답 코드(기본 200)를 반환해야 합니다. |
알아두기
멤버 인스턴스의 Security Groups에서 DSR로부터의 서비스 트래픽과 상태 확인 트래픽을 허용해야 합니다.
알아두기
로드 밸런서(DSR)의 VIP와 상태 확인 전용 IP에 해당하는 포트에는 default Security Group이 연결되어 있습니다. 다만, DSR 포트 자체에는 Security Groups의 필터링(flow)이 적용되지 않습니다.
멤버 인스턴스의 포트에는 Security Groups 필터링이 정상 적용됩니다. 이때 DSR은 패킷의 소스 IP를 변환하지 않으므로(No SNAT), 서비스 트래픽의 소스 IP는 클라이언트의 원본 IP입니다. 따라서 서비스 트래픽에 대해서는 default SG를 원격으로 지정하는 것만으로는 허용되지 않으며, 클라이언트 IP 대역 또는 ANY(0.0.0.0/0)를 원격으로 지정해야 합니다.
반면, 상태 확인 트래픽은 DSR과 동일한 서브넷에 할당된 상태 확인 전용 IP에서 발송되며, 해당 IP의 포트가 default SG에 속해 있으므로 default SG를 원격으로 지정하면 허용됩니다.
DSR은 클라이언트의 소스 IP를 그대로 유지하므로, 서비스 트래픽과 상태 확인 트래픽을 각각 허용해야 합니다.
| 방향 | IP 프로토콜 | 포트 범위 | 원격 | 설명 |
|---|---|---|---|---|
| 수신 | TCP 또는 UDP | 서비스 포트(예: 80) | 0.0.0.0/0 | 클라이언트로부터의 서비스 트래픽 허용(서비스 프로토콜에 맞게 지정) |
| 수신 | 임의 | - | default | 상태 확인 트래픽 허용(상태 확인 전용 IP의 포트가 default SG에 속함) |
알아두기
DSR은 패킷의 소스 IP를 변환하지 않으므로, 멤버 서버에 도착하는 서비스 트래픽의 소스 IP는 클라이언트의 원본 IP입니다. 클라이언트 IP 대역이 특정되지 않는 경우 0.0.0.0/0으로 허용해야 합니다. 클라이언트 대역이 확정된 경우 해당 CIDR로 제한할 수 있습니다.
보안 정책상 최소 권한 원칙을 적용하거나, 특정 포트만 허용해야 하는 경우 개별 규칙을 추가합니다.
| 용도 | 프로토콜 | 포트 | 원격 | 비고 |
|---|---|---|---|---|
| 서비스 트래픽(TCP) | TCP | 서비스 포트(예: 80, 443) | 클라이언트 IP 대역 또는 0.0.0.0/0 | DSR은 SNAT하지 않으므로 소스 IP가 클라이언트 원본 IP |
| 서비스 트래픽(UDP) | UDP | 서비스 포트(예: 53, 514) | 클라이언트 IP 대역 또는 0.0.0.0/0 | UDP 프로토콜 서비스 사용 시 |
| TCP 상태 확인 | TCP | health_check_port |
DSR 서브넷 CIDR 또는 default SG | 상태 확인 전용 IP에서 발송 |
| ICMP 상태 확인 | ICMP | - | DSR 서브넷 CIDR 또는 default SG | ICMP 타입 사용 시 |
| HTTP 상태 확인 | TCP | health_check_port |
DSR 서브넷 CIDR 또는 default SG | HTTP 타입 사용 시 |
서비스 포트 80, TCP 상태 확인 포트 80인 경우:
| 방향 | IP 프로토콜 | 포트 범위 | 원격 | 설명 |
|---|---|---|---|---|
| 수신 | TCP | 80 | 0.0.0.0/0 | 클라이언트로부터의 서비스 트래픽 |
| 수신 | TCP | 80 | default | 상태 확인 트래픽 |
ICMP 상태 확인을 사용하는 경우 추가:
| 방향 | IP 프로토콜 | 포트 범위 | 원격 | 설명 |
|---|---|---|---|---|
| 수신 | ICMP | - | default | ICMP 상태 확인 |
알아두기
health_check_port)를 서비스 포트와 다르게 설정한 경우, Security Groups에서 두 포트를 모두 허용해야 합니다.10.0.0.0/8)로 한정되어 있다면, 0.0.0.0/0 대신 해당 CIDR을 지정하여 최소 권한 원칙을 적용할 수 있습니다.192.168.1.0/24)로 지정할 수도 있습니다. 상태 확인 요청은 DSR과 동일한 서브넷에 자동 할당된 상태 확인 전용 IP에서 발송되므로, 서브넷 CIDR 단위로 허용하면 됩니다.DSR 방식에서는 로드 밸런서가 패킷의 목적지 IP를 VIP로 유지한 채 멤버 서버에 전달합니다. NHN Cloud의 네트워크 환경에서는 보안을 위해 인스턴스에 할당된 IP가 아닌 다른 IP를 소스나 목적으로 하는 패킷을 기본적으로 차단합니다.
따라서 멤버 인스턴스가 VIP를 목적지로 하는 패킷을 수신하고, 다시 VIP를 소스로 하여 응답할 수 있도록 네트워크 인터페이스에 VIP를 추가 허용 주소로 추가해야 합니다.
[클라이언트] → dst: VIP → [로드 밸런서(DSR)] → dst: VIP → [멤버 서버]
↑
포트에 할당된 IP와 목적지(VIP)가 다름 → 추가 허용 주소 미등록 시 패킷 드롭
멤버 서버의 네트워크 인터페이스(Port)의 추가 허용 주소 항목에 로드 밸런서(DSR)의 VIP를 추가합니다.
<VIP>/32)를 추가합니다.알아두기
추가 허용 주소 설정 절차는 콘솔 사용 가이드를 참고하세요.
로드 밸런서(DSR)의 VIP에 Floating IP를 연결하여 외부 네트워크에서 접근할 수 있도록 설정할 수 있습니다.
알아두기
Floating IP를 분리해도 내부 네트워크에서 VIP를 통한 접근은 영향을 받지 않습니다.
로드 밸런서(DSR) 사용 시 다음과 같은 쿼터 및 제한사항이 적용됩니다:
| 항목 | 기본 제한 | 설명 |
|---|---|---|
| 프로젝트당 로드 밸런서(DSR) 수 | 10개 | 프로젝트당 생성 가능한 로드 밸런서(DSR) 개수 |
| 로드 밸런서(DSR)당 멤버 수 | 30개 | 하나의 로드 밸런서(DSR)에 등록 가능한 멤버 개수 |
| 프로젝트당 멤버 수 | 제한 없음 |
알아두기
기본 쿼터를 초과하여 사용해야 하는 경우 고객지원으로 문의하세요.
로드 밸런서(DSR)의 상태와 멤버 인스턴스의 상태 확인 결과를 실시간으로 모니터링할 수 있습니다.
로드 밸런서(DSR) 상태
| 상태 | 설명 |
|---|---|
ACTIVE |
정상 동작 중 |
BUILD |
생성 중 |
ERROR |
오류 발생 |
멤버 상태
| 상태 | 설명 |
|---|---|
ACTIVE |
상태 확인 성공, 트래픽 분산 대상 |
INACTIVE |
상태 확인 실패 또는 신규 등록 직후, 트래픽 분산 대상에서 제외 |
ONLINE |
멤버가 수동으로 비활성화된 상태(admin_state_up=false) |
알아두기
멤버의 상태는 상태 확인 결과에 따라 자동으로 ACTIVE 또는 INACTIVE로 변경됩니다. 상태 확인 실패로 INACTIVE 상태가 된 멤버는 자동으로 트래픽 분산 대상에서 제외되며, 이후 상태 확인에 성공하면 다시 ACTIVE 상태로 전환되어 트래픽을 수신합니다. 멤버를 수동으로 비활성화하면 ONLINE 상태로 표시되며 트래픽 분산 대상에서 제외됩니다.
알아두기
새로 등록된 멤버는 INACTIVE 상태로 시작합니다. 상태 확인 통과 후 자동으로 ACTIVE로 전환됩니다.
로드 밸런서(DSR) 사용 시 다음 사항에 주의하세요.