OpenStack DVR 기반 고가용성 네트워킹 아키텍처 구현

본 문서는 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-vlanbr-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 인스턴스의 북-남 트래픽

  1. 인스턴스는 탭 인터페이스를 통해 패킷을 qbr Linux 브리지로 전달
  2. 보안 그룹(iptables)이 상태 추적 수행
  3. br-int 브리지에서 VXLAN 터널링을 위해 내부 VLAN 태그 삽입
  4. 계산 노드의 qrouter 네임스페이스에서 SNAT 목적지 MAC 주소 확인
  5. 터널 브리지 br-tun이 패킷을 VXLAN으로 캡슐화하여 네트워크 노드로 전송
  6. 네트워크 노드에서 디캡슐화 후 br-intsnat 네임스페이스 → br-ex를 거쳐 외부 네트워크로 송출
  7. SNAT는 iptables를 통해 수행되며, 외부 게이트웨이 IP를 소스로 변환

공인 IP 인스턴스의 양방향 트래픽

외부 → 인스턴스 (Ingress)

  1. 외부 인터페이스가 br-ex로 패킷 수신
  2. fip 네임스페이스의 fg 인터페이스가 플로팅 IP ARP 요청 응답
  3. DVR 내부 IP(DA1, DA2)를 경유해 qrouter 네임스페이스로 라우팅
  4. DNAT 규칙 적용 후 qr 인터페이스를 통해 br-int로 전달
  5. Linux 브리지를 거쳐 최종적으로 인스턴스의 탭 인터페이스로 도달

인스턴스 → 외부 (Egress)

  1. 인스턴스가 탭 인터페이스를 통해 패킷 송신
  2. qrouter 네임스페이스에서 rfp 인터페이스를 소스로 SNAT 수행
  3. DVR 내부 링크를 통해 fip 네임스페이스로 전달
  4. fg 인터페이스를 통해 br-ex로 송출

동일 라우터 상 다중 테넌트 네트워크 간 동-서 트래픽

  1. 계산 노드 1의 인스턴스가 br-int를 통해 qrouter 네임스페이스로 패킷 전달
  2. 라우터가 목적지 네트워크(192.168.2.0/24) 식별 후 VXLAN 캡슐화
  3. br-tun을 통해 계산 노드 2로 전송
  4. 계산 노드 2에서 디캡슐화 후 br-int → Linux 브리지 → 탭 인터페이스 순으로 전달
  5. 이 과정에서 네트워크 노드는 관여하지 않음

실제 구성 예시

컨트롤러 노드 설정

[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

네트워크 생성 절차

  1. 외부 네트워크 생성:
    neutron net-create ext-net --router:external --provider:network_type flat --provider:physical_network external
  2. 외부 서브넷 생성:
    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
  3. 테넌트 네트워크 생성:
    neutron net-create tenant-net --provider:network_type vxlan
  4. 라우터 생성 및 연결:
    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 할당 후 외부에서 핑 테스트 수행으로 최종 연결성 검증

태그: openstack Neutron DVR ML2 OVS

8월 11일 09:11에 게시됨