개요
OpenStack Neutron은 프로젝트 네트워크에 L3 라우팅 서비스를 제공합니다. 라우터는 같은 프로젝트 내의 서로 다른 네트워크는 물론, 외부 네트워크(업스트림)와의 통신을 가능하게 하는 핵심 요소입니다.
OpenStack 배포 시 기본적으로 중앙 집중식 라우팅(Centralized Routing) 모델이 사용되며, 필요에 따라 분산 가상 라우팅(DVR) 으로 전환할 수 있습니다.
OpenStack 라우팅 흐름
OpenStack에서 발생하는 트래픽은 라우팅 목적과 방향에 따라 세 가지 주요 흐름으로 나눌 수 있습니다.
- East-West 라우팅: 동일 프로젝트 내, 서로 다른 네트워크 간의 트래픽 라우팅
- North-South 라우팅 (유동 IP): 인스턴스에 유동 IP를 할당하여 외부와 통신하는 트래픽
- North-South 라우팅 (SNAT)
- 유동 IP가 없는 VM이 외부와 통신하는 트래픽
- 라우터의 PAT 서비스를 통해 외부와 통신
- 다만, 외부의 사용자는 해당 인스턴스에 직접 접속할 수 없음
중앙 집중식 라우팅 (기본 방식)
중앙 집중식 모델은 구조가 단순하여 구현이 쉽지만, 트래픽이 한 곳에 집중되는 구조적 문제점을 내포하고 있습니다.
원리와 구조
- 배포 위치: 모든 프로젝트의 가상 라우터는 Neutron L3 Agent가 관리하며, 네트워크 노드 또는 컨트롤 노드에 배포됩니다.
- 트래픽 경로: 라우팅 기능(L3, SNAT, Floating IP)이 필요할 때마다 모든 트래픽은 토폴로지의 전용 노드(네트워크 or 컨트롤러 노드)를 통과해야 합니다.
문제점
중앙 집중식 모델은 다음과 같은 이유로 성능 저하와 비효율적인 트래픽 흐름을 야기합니다.
- 비효율적인 East-West 트래픽 흐름
같은 컴퓨팅 노드에 있는 두 VM이 L3 라우팅을 통해 서로 통신해야 하는 경우에도, 트래픽은 불필요하게 긴 경로를 거칩니다. 트래픽은 Compute Node → Network Node(Controller) → Compute Node로 통신해야 하므로, 불필요한 레이턴시가 발생하고 성능에 부정적인 영향을 미칩니다. - 확장성 및 병목 현상
Floating IP 트래픽과 SNAT 트래픽 모두 중앙 노드의 외부 네트워크 게이트웨이 인터페이스에 집중됩니다. 대규모 환경에서는 이 컨트롤러 노드가 트래픽 부하의 영향을 매우 크게 받으며, 이는 성능 및 확장성에 직접적인 악영향을 미칩니다. 이 때문에 대규모 환경에서는 컨트롤러 노드에 트래픽 부하가 집중되어 성능 저하가 발생합니다.
분산 가상 라우팅 (Distributed Virtual Routing, DVR)
- 분산 가상 라우팅(DVR)*은 중앙 집중식 라우팅의 구조적 문제를 해결하기 위한 대안으로 나왔습니다. DVR은 L3 에이전트를 모든 컴퓨팅 노드에 배포하고 라우터를 예약하여 네트워크 트래픽을 최적화하고 컨트롤러 노드의 장애 도메인을 격리합니다.
주요 특성 및 이점
- East-West 트래픽 최적화: East-West 트래픽은 분산 방식으로 처리되며, 라우팅이 필요한 경우 트래픽이 컴퓨팅 노드 내에서 직접 라우팅되어 불필요하게 중앙 노드를 거치지 않습니다.
- Floating IP 트래픽 분산: 유동 IP를 사용한 North-South 트래픽 처리 기능도 컴퓨팅 노드에 분산되어 라우팅됩니다. 이는 중앙 컨트롤러 노드에 집중되던 Floating IP 부하를 컴퓨팅 노드로 분산시켜 확장성을 높입니다. 다만, 이 기능을 사용하려면 외부 네트워크가 모든 컴퓨팅 노드에 연결되어 있어야 합니다.
- SNAT 기능 분리 및 전용화: 유동 IP가 없는 VM의 SNAT 처리 기능은 분산되지 않습니다. SNAT 트래픽만 제공하도록 전용 컨트롤러 노드가 필요하며, 이 노드의 L3 에이전트는 dvr_snat 모드를 사용하여 구성됩니다.
Kolla-Ansible에서의 DVR 구현 방법
Kolla-Ansible은 OpenStack을 Docker 컨테이너 기반으로 배포하는 도구로, DVR 환경 구축을 코드 수준에서 매우 쉽게 설정할 수 있습니다.
컴퓨팅 노드 외부 네트워크 연결
Kolla-Ansible 설정에서 neutron_external_interface로 지정될 인터페이스가 모든 컴퓨팅 노드에 물리적으로(또는 논리적으로) 구성되어 있어야 합니다.DVR 활성화 (globals.yml)
OpenStack 배포 전, Kolla-Ansible의 전역 설정 파일인 globals.yml에서 DVR 기능을 활성화합니다.# globals.yml neutron_enable_dvr: "yes"Inventory에 L3 에이전트 역할 추가
globals.yml 파일에서 DVR을 활성화하면 Kolla-Ansible은 L3 에이전트와 메타데이터 에이전트의 역할을 인벤토리 그룹에 따라 자동으로 Neutron L3 Agent와 Neutron Metadata Agent가 분산 배포됩니다.만약 인벤토리 파일에서 L3 에이전트와 메타데이터 에이전트를 명시적으로 compute 및 network 그룹에 걸쳐 배포하고자 한다면 다음과 같이 지정할 수 있습니다.
# DVR(Distributed Virtual Routing)을 위한 L3 Agent, Metadata Agent 배포 [neutron-l3-agent:children] neutron compute [neutron-metadata-agent:children] neutron compute
DVR 동작 확인 방법
L3 에이전트 배포 및 구성 확인
가장 먼저 모든 노드에서 L3 에이전트가 정상적으로 배포되어 있는지 확인합니다.
(venv) root@control01:~# openstack network agent list --agent-type l3
+--------------------------------------+------------+-----------+-------------------+-------+-------+------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+------------+-----------+-------------------+-------+-------+------------------+
| c4d19224-ff6f-4a90-b921-2df540e3645b | L3 agent | compute01 | nova | :-) | UP | neutron-l3-agent |
...
| 5c54fbcd-9746-485f-9b2c-d2c0a60946ea | L3 agent | network01 | nova | :-) | UP | neutron-l3-agent |
+--------------------------------------+------------+-----------+-------------------+-------+-------+------------------+
다음으로 각 노드에서 neutron.conf 파일이나 실행 중인 에이전트의 구성을 확인합니다.
컴퓨터 노드 확인
root@compute01:~# docker exec neutron_l3_agent cat /etc/neutron/l3_agent.ini | grep 'agent_mode' agent_mode = dvrSNAT 노드 확인
root@network01:~# docker exec neutron_l3_agent cat /etc/neutron/l3_agent.ini | grep 'agent_mode' agent_mode = dvr_snat