본 문서는 OpenStack 환경에서 ML2 플러그인과 Open vSwitch를 활용한 분산 가상 라우팅(Distributed Virtual Routing, DVR)을 통한 고가용성 네트워크 구성 방법을 설명합니다. 이 아키텍처는 VXLAN 또는 GRE 기반의 테넌트 네트워크와 Flat 혹은 VLAN 외부 네트워크를 지원하며, 계산 노드에서 직접 외부 네트워크에 접근함으로써 기존 네트워크 노드의 단일 장애점(SPOF) 문제를 해결합니다.
DVR은 부하 분산 및 성능 향상을 위해 북-남(North-South) 트래픽 처리를 계산 노드로 이관합니다. 특히 공인 IP(플로팅 IP)를 할당받은 인스턴스의 경우, 모든 라우팅 및 SNAT/DNAT 처리가 해당 인스턴스가 위치한 계산 노드에서 수행됩니다. 반면, 사설 IP만 사용하는 인스턴스는 여전히 네트워크 노드의 SNAT 서비스에 의존합니다.
시스템 요구사항
- 컨트롤러 노드: 관리 네트워크 인터페이스 1개
- 네트워크 노드: 관리, 터널, VLAN, 외부 네트워크용 인터페이스 각각 1개씩 총 4개.
br-vlan과br-ex브리지 설정 필요 - 계산 노드: 동일한 네트워크 인터페이스 구성. 최소 2대 이상 배포 권장
예시 IP 대역:
- 관리 네트워크: 10.0.0.0/24
- 터널 네트워크: 10.0.1.0/24
- 외부 네트워크: 203.0.113.0/24
- VLAN 네트워크: Layer 2 전용
서비스 구성 요건
컨트롤러 노드
- Neutron 서버, ML2 플러그인
neutron.conf내 데이터베이스, 메시지 큐, Keystone 인증 정보 설정- Compute 서비스(nova)에서 Neutron 사용하도록 구성
네트워크 노드
- Open vSwitch 에이전트, L3 에이전트, DHCP 에이전트, 메타데이터 에이전트
- L3 에이전트는
dvr_snat모드로 실행
계산 노드
- Open vSwitch 에이전트, L3 에이전트, 메타데이터 에이전트
- L3 에이전트는
dvr모드로 실행 - 보안 그룹 처리를 위한 Linux 브리지 활성화
패킷 흐름 분석
사설 IP 인스턴스의 북-남 트래픽
- 인스턴스는 탭 인터페이스를 통해 패킷을
qbrLinux 브리지로 전달 - 보안 그룹(iptables)이 상태 추적 수행
br-int브리지에서 VXLAN 터널링을 위해 내부 VLAN 태그 삽입- 계산 노드의 qrouter 네임스페이스에서 SNAT 목적지 MAC 주소 확인
- 터널 브리지
br-tun이 패킷을 VXLAN으로 캡슐화하여 네트워크 노드로 전송 - 네트워크 노드에서 디캡슐화 후
br-int→snat네임스페이스 →br-ex를 거쳐 외부 네트워크로 송출 - SNAT는 iptables를 통해 수행되며, 외부 게이트웨이 IP를 소스로 변환
공인 IP 인스턴스의 양방향 트래픽
외부 → 인스턴스 (Ingress)
- 외부 인터페이스가
br-ex로 패킷 수신 - fip 네임스페이스의 fg 인터페이스가 플로팅 IP ARP 요청 응답
- DVR 내부 IP(DA1, DA2)를 경유해 qrouter 네임스페이스로 라우팅
- DNAT 규칙 적용 후 qr 인터페이스를 통해
br-int로 전달 - Linux 브리지를 거쳐 최종적으로 인스턴스의 탭 인터페이스로 도달
인스턴스 → 외부 (Egress)
- 인스턴스가 탭 인터페이스를 통해 패킷 송신
- qrouter 네임스페이스에서 rfp 인터페이스를 소스로 SNAT 수행
- DVR 내부 링크를 통해 fip 네임스페이스로 전달
- fg 인터페이스를 통해
br-ex로 송출
동일 라우터 상 다중 테넌트 네트워크 간 동-서 트래픽
- 계산 노드 1의 인스턴스가
br-int를 통해 qrouter 네임스페이스로 패킷 전달 - 라우터가 목적지 네트워크(192.168.2.0/24) 식별 후 VXLAN 캡슐화
br-tun을 통해 계산 노드 2로 전송- 계산 노드 2에서 디캡슐화 후
br-int→ Linux 브리지 → 탭 인터페이스 순으로 전달 - 이 과정에서 네트워크 노드는 관여하지 않음
실제 구성 예시
컨트롤러 노드 설정
[DEFAULT]
core_plugin = ml2
service_plugins = router
router_distributed = True
allow_overlapping_ips = True
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan,vlan
mechanism_drivers = openvswitch,l2population
[ml2_type_flat]
flat_networks = external
[ml2_type_vxlan]
vni_ranges = 1001:2000
vxlan_group = 239.1.1.1
네트워크 및 계산 노드 공통 OVS 설정
[ovs]
local_ip = 10.0.1.21
bridge_mappings = external:br-ex,vlan:br-vlan
[agent]
tunnel_types = vxlan
l2_population = True
enable_distributed_routing = True
arp_responder = True
L3 에이전트 모드 설정
- 네트워크 노드:
agent_mode = dvr_snat - 계산 노드:
agent_mode = dvr
네트워크 생성 절차
- 외부 네트워크 생성:
neutron net-create ext-net --router:external --provider:network_type flat --provider:physical_network external - 외부 서브넷 생성:
neutron subnet-create ext-net 203.0.113.0/24 --gateway 203.0.113.1 --allocation-pool start=203.0.113.101,end=203.0.113.200 --disable-dhcp - 테넌트 네트워크 생성:
neutron net-create tenant-net --provider:network_type vxlan - 라우터 생성 및 연결:
neutron router-create distributed-router neutron router-interface-add distributed-router tenant-subnet neutron router-gateway-set distributed-router ext-net
구성 검증
에이전트 상태 확인:
neutron agent-list
네트워크 노드에서 생성된 네임스페이스 확인:
ip netns | grep -E "(snat|qrouter|qdhcp)"
계산 노드에서 fip 네임스페이스 확인:
ip netns | grep fip
외부 게이트웨이 핑 테스트:
ping 203.0.113.101
인스턴스에 플로팅 IP 할당 후 외부에서 핑 테스트 수행으로 최종 연결성 검증