Spine-Leaf Deep Dive
Clos 네트워크 원형, East-West 트래픽 폭증 배경, BGP/VXLAN EVPN 구성, 실제 적용 사례
🎯 왜 Spine-Leaf인가?
트래픽 패턴의 변화
전통 데이터센터는 North-South 트래픽이 대부분이었음. 클라이언트가 서버에 요청하고 응답을 받는 단순한 구조.
flowchart TB subgraph Traditional["2000년대: North-South 중심"] Client["클라이언트"] Core["Core"] Server["서버"] Client <-->|"N-S 트래픽"| Core <--> Server end
그런데 2010년대 이후 상황이 바뀌었음:
| 변화 | 결과 |
|---|---|
| 서버 가상화 | VM 수백~수천 대, VM 간 통신 폭증 |
| vMotion/라이브 마이그레이션 | VM이 서버 간 이동 → 대용량 메모리 복사 |
| 분산 스토리지 | Ceph, vSAN, HDFS → 노드 간 복제 트래픽 |
| 마이크로서비스 | 서비스 간 API 호출이 수십~수백 배 증가 |
| 빅데이터/AI | MapReduce Shuffle, GPU 클러스터 간 통신 |
East-West 트래픽이 전체의 70~80%를 차지하게 되면서, 3-Tier 구조의 한계가 드러남.
3-Tier의 구조적 문제
flowchart TB Core["Core"] Agg1["Agg 1"] Agg2["Agg 2"] Acc1["Access 1 (Server A)"] Acc2["Access 2 (Server B)"] Core --> Agg1 --> Acc1 Core --> Agg2 --> Acc2 Acc1 -.->|"A-B: 최대 4홉, STP 제한"| Acc2
| 문제 | 설명 |
|---|---|
| STP 병목 | 루프 방지를 위해 링크 절반 비활성화 → 대역폭 낭비 |
| 가변 지연 | 같은 Agg 아래면 2홉, 다른 Agg면 4홉 → 예측 불가 |
| Aggregation 병목 | East-West 트래픽이 Agg 계층에 집중 |
| 확장 한계 | Agg 스위치 포트 수가 확장 상한 |
📐 Clos Network: 이론적 원형
Charles Clos (1953)
Spine-Leaf는 갑자기 나온 게 아님. 1953년 Bell Labs 엔지니어 Charles Clos가 전화 교환망을 위해 설계한 Clos Network가 원형임.
핵심 아이디어: 소규모 스위치를 여러 단계로 조합하면, 하나의 거대한 Non-blocking 스위치와 동일한 효과를 얻을 수 있음.
3-Stage Clos
flowchart LR subgraph Ingress["Ingress (입력)"] I1["Switch 1"] I2["Switch 2"] I3["Switch 3"] end subgraph Middle["Middle (중간)"] M1["Switch A"] M2["Switch B"] M3["Switch C"] end subgraph Egress["Egress (출력)"] E1["Switch 1"] E2["Switch 2"] E3["Switch 3"] end I1 --- M1 & M2 & M3 I2 --- M1 & M2 & M3 I3 --- M1 & M2 & M3 M1 --- E1 & E2 & E3 M2 --- E1 & E2 & E3 M3 --- E1 & E2 & E3
Clos의 조건:
- Middle 스위치 수 ≥ Ingress 스위치의 입력 포트 수 → Non-blocking (어떤 입력이든 출력으로 경로 보장)
Clos → Spine-Leaf
데이터센터에서는 3-Stage Clos를 접어서 2계층으로 만든 것이 Spine-Leaf다.
Clos 3-Stage: Ingress — Middle — Egress
↓ 접기 (Ingress = Egress)
Spine-Leaf: Leaf — Spine — Leaf
Leaf가 서버에 직접 연결되므로 Ingress이자 Egress 역할을 동시에 수행함.
🏗️ Spine-Leaf 상세 구조
기본 규칙
| 규칙 | 설명 |
|---|---|
| 모든 Leaf ↔ 모든 Spine 연결 | Full mesh (Leaf-Spine 간) |
| Leaf 간 직접 연결 없음 | 반드시 Spine을 경유 |
| Spine 간 직접 연결 없음 | 2-Stage에서는 불필요 |
| 서버는 Leaf에만 연결 | Spine에 서버 연결 안 함 |
홉 수 보장
flowchart LR SA["Server A (Leaf 1)"] S["Spine"] SB["Server B (Leaf 3)"] SA -->|"1홉"| S -->|"1홉"| SB
어떤 서버에서 어떤 서버로든 항상 최대 2홉. 지연이 예측 가능해짐.
5-Stage Clos (Super Spine)
대규모 데이터센터에서 Spine-Leaf 2계층으로 부족하면 Super Spine을 추가하여 5-Stage Clos로 확장함.
flowchart TB subgraph SS["Super Spine"] SS1["Super Spine 1"] SS2["Super Spine 2"] end subgraph Pod1["Pod 1"] S1["Spine"] L1["Leaf"] L2["Leaf"] L1 & L2 --- S1 end subgraph Pod2["Pod 2"] S2["Spine"] L3["Leaf"] L4["Leaf"] L3 & L4 --- S2 end S1 --- SS1 & SS2 S2 --- SS1 & SS2
| 규모 | 구조 | 홉 수 |
|---|---|---|
| 중소 | 2-Stage (Spine-Leaf) | 최대 2홉 |
| 대규모 | 5-Stage (Super Spine) | 최대 4홉 |
Facebook, Google, Microsoft 같은 하이퍼스케일러들이 이 구조를 사용함.
⚖️ ECMP 상세
STP의 한계
3-Tier에서 STP는 루프를 방지하기 위해 하나의 경로만 활성화함.
flowchart LR A["Switch A"] B["Switch B"] C["Switch C"] A -->|"✅ Active"| B A -.->|"❌ Blocked"| C B -->|"✅ Active"| C
링크가 2개 있어도 하나는 차단 → 대역폭 50% 낭비.
ECMP 동작 원리
ECMP (Equal-Cost Multi-Path): 동일 비용의 모든 경로를 동시에 사용하여 트래픽을 분산함.
flowchart TB L1["Leaf 1 (Server A)"] S1["Spine 1"] S2["Spine 2"] S3["Spine 3"] S4["Spine 4"] L2["Leaf 2 (Server B)"] L1 -->|"25%"| S1 -->|"25%"| L2 L1 -->|"25%"| S2 -->|"25%"| L2 L1 -->|"25%"| S3 -->|"25%"| L2 L1 -->|"25%"| S4 -->|"25%"| L2
ECMP 해싱: 각 플로우(src IP + dst IP + src port + dst port + protocol)를 해시하여 경로를 결정함. 같은 플로우는 항상 같은 경로로 → 패킷 순서 보장.
ECMP가 가능한 이유
Spine-Leaf에서는 L3 라우팅을 사용하기 때문에 STP가 필요 없음.
| 구분 | 3-Tier (L2 중심) | Spine-Leaf (L3 중심) |
|---|---|---|
| 루프 방지 | STP (링크 차단) | L3 라우팅 (TTL) |
| 경로 활용 | Active 1개 | ECMP로 전체 활용 |
| 장애 복구 | STP 수렴 (초~십초) | 라우팅 수렴 (초 이내) |
🔀 BGP in Datacenter
왜 BGP인가?
전통적으로 데이터센터 내부에서는 OSPF를 썼음. 그런데 대규모 Spine-Leaf 환경에서 문제가 생겼음:
| 프로토콜 | 문제 |
|---|---|
| OSPF | 단일 Area에 노드가 많으면 LSA 폭증, SPF 재계산 부하 |
| OSPF Multi-Area | Area 설계 복잡, ABR 병목 |
eBGP가 대안으로 부상한 이유:
| 장점 | 설명 |
|---|---|
| 확장성 | 수천 노드까지 안정적 |
| 경로 제어 | Policy 기반 세밀한 제어 |
| ECMP | Multi-path 네이티브 지원 |
| 수렴 속도 | BFD 연동으로 빠른 장애 감지 |
| 멀티벤더 | 모든 벤더가 지원 |
BGP Unnumbered
전통 BGP는 피어마다 IP를 할당해야 했음. Spine 4대 × Leaf 40대 = 160개 링크에 일일이 IP를 부여하면 관리가 힘듦.
BGP Unnumbered: 인터페이스의 IPv6 Link-Local 주소로 피어링. IP 할당 불필요.
# 전통 BGP (IP 필요)
Spine1 (10.0.1.1) ←→ Leaf1 (10.0.1.2) # /30 서브넷 할당
Spine1 (10.0.2.1) ←→ Leaf2 (10.0.2.2) # 또 할당...
Spine1 (10.0.3.1) ←→ Leaf3 (10.0.3.2) # 링크마다 IP 관리
# BGP Unnumbered (IP 불필요)
Spine1 (fe80::1) ←→ Leaf1 (fe80::2) # Link-Local 자동
→ IP 계획, 서브넷 관리가 필요 없음
ASN 설계
각 Leaf에 고유 ASN, 각 Spine에 고유 ASN을 부여하는 것이 일반적임.
flowchart TB subgraph Spines S1["Spine 1 (AS 65000)"] S2["Spine 2 (AS 65001)"] end subgraph Leaves L1["Leaf 1 (AS 65011)"] L2["Leaf 2 (AS 65012)"] L3["Leaf 3 (AS 65013)"] end S1 --- L1 & L2 & L3 S2 --- L1 & L2 & L3
eBGP 피어링 관계:
- Leaf 1 (AS 65011) ↔ Spine 1 (AS 65000): eBGP
- Leaf 1 (AS 65011) ↔ Spine 2 (AS 65001): eBGP
- 모든 연결이 eBGP → iBGP의 full-mesh/route-reflector 문제 없음
FRRouting 설정 예시
# Leaf 1 (AS 65011) — FRRouting (Cumulus Linux 등)
router bgp 65011
bgp router-id 10.0.0.11
bgp bestpath as-path multipath-relax # ECMP 활성화
neighbor fabric peer-group
neighbor fabric remote-as external # eBGP (상대 ASN 자동 감지)
neighbor swp1 interface peer-group fabric # Spine 1 연결
neighbor swp2 interface peer-group fabric # Spine 2 연결
address-family ipv4 unicast
network 10.0.0.11/32 # Loopback 광고
maximum-paths 4 # ECMP 최대 경로 수
exit-address-family🌐 VXLAN EVPN
문제: L2 확장
Spine-Leaf는 L3 라우팅 기반인데, VM은 같은 서브넷(L2) 안에서 이동해야 하는 경우가 있음. vMotion으로 VM이 Leaf 1에서 Leaf 3로 이동하면, IP는 그대로인데 물리적 위치가 바뀜.
flowchart TB subgraph Before["이동 전"] L1B["Leaf 1"] VMB["VM (10.0.1.5)"] L1B --- VMB end subgraph After["이동 후 (vMotion)"] L3A["Leaf 3"] VMA["VM (10.0.1.5)"] L3A --- VMA end Before -->|"vMotion"| After
L3 네트워크 위에 L2를 확장할 방법이 필요함 → VXLAN
VXLAN 동작
VXLAN (Virtual Extensible LAN): L2 프레임을 UDP로 캡슐화하여 L3 네트워크 위에 터널링.
flowchart LR VM_A["VM A<br/>10.0.1.5"] VTEP1["VTEP<br/>(Leaf 1)"] IP_Net["IP Network<br/>(Spine-Leaf)"] VTEP2["VTEP<br/>(Leaf 3)"] VM_B["VM B<br/>10.0.1.10"] VM_A -->|"L2 Frame"| VTEP1 -->|"UDP:4789<br/>VXLAN 캡슐화"| IP_Net -->|"UDP:4789"| VTEP2 -->|"L2 Frame"| VM_B
| 용어 | 설명 |
|---|---|
| VTEP | VXLAN Tunnel Endpoint. 캡슐화/역캡슐화 수행. 보통 Leaf 스위치 |
| VNI | VXLAN Network Identifier. VLAN ID의 확장판 (24비트 → 약 1,600만 개) |
| Underlay | 물리 네트워크 (Spine-Leaf, IP 라우팅) |
| Overlay | 가상 네트워크 (VXLAN 터널) |
EVPN: Control Plane
VXLAN만으로는 어떤 VM이 어떤 VTEP 뒤에 있는지 알 방법이 flood-and-learn(브로드캐스트)뿐임. 이러면 대규모에서 BUM 트래픽 폭증.
EVPN (Ethernet VPN): BGP를 확장하여 MAC/IP 주소 정보를 Control Plane으로 배포함.
flowchart TB subgraph CP["Control Plane (BGP EVPN)"] direction LR L1_CP["Leaf 1:<br/>VM-A(10.0.1.5) = MAC aa:bb<br/>→ BGP로 광고"] L3_CP["Leaf 3:<br/>학습! VM-A는 Leaf 1 뒤에 있구나"] L1_CP -->|"BGP EVPN<br/>Route Type 2"| L3_CP end subgraph DP["Data Plane (VXLAN)"] direction LR L1_DP["Leaf 1 (VTEP)"] L3_DP["Leaf 3 (VTEP)"] L1_DP <-->|"VXLAN 터널"| L3_DP end CP --> DP
EVPN Route Type:
| Type | 이름 | 용도 |
|---|---|---|
| 1 | Ethernet Auto-Discovery | 멀티호밍, 빠른 수렴 |
| 2 | MAC/IP Advertisement | MAC+IP 위치 광고 (핵심) |
| 3 | Inclusive Multicast | BUM 트래픽 처리 |
| 5 | IP Prefix | L3 라우팅 정보 |
VXLAN EVPN의 장점
| 장점 | 설명 |
|---|---|
| L2 확장 | L3 Underlay 위에서 L2 서브넷 자유롭게 확장 |
| 멀티테넌시 | VNI로 테넌트별 네트워크 완전 분리 (최대 ~16M) |
| VM 이동성 | 어떤 Leaf로 이동해도 IP/MAC 유지 |
| BUM 최소화 | Control Plane 학습으로 불필요한 브로드캐스트 제거 |
| 분산 게이트웨이 | 각 Leaf가 Anycast GW 역할 → 트래픽 최적화 |
🖥️ 화이트박스 스위치와 NOS
전통 vs 화이트박스
| 구분 | 전통 (Cisco, Arista 등) | 화이트박스 |
|---|---|---|
| 하드웨어 | 벤더 전용 | ODM 범용 (Edgecore, Dell 등) |
| OS | 벤더 전용 (IOS, EOS) | 선택 가능 (Cumulus, SONiC) |
| 비용 | 높음 | 낮음 (30~60% 절감) |
| 유연성 | 벤더 로드맵 의존 | 오픈소스 커뮤니티 |
주요 NOS (Network OS)
| NOS | 개발 | 특징 |
|---|---|---|
| Cumulus Linux | NVIDIA (인수) | Debian 기반 Linux, FRRouting 내장 |
| SONiC | Microsoft (오픈소스) | Azure에서 검증, SAI 추상화 |
| OpenSwitch (OPX) | Dell | Dell OS10 기반 |
| Arista EOS | Arista | Linux 기반이지만 상용, 자동화 강점 |
하이퍼스케일러들의 선택:
- Microsoft Azure → SONiC
- Facebook/Meta → FBOSS (자체 NOS)
- Google → 자체 NOS
- 일반 기업 → Cumulus Linux 또는 Arista EOS
🏢 실제 적용 사례
Facebook (Meta) — Data Center Fabric
2014년 발표. 기존 클러스터 단위 네트워크를 Fabric으로 전환.
| 항목 | 내용 |
|---|---|
| 규모 | 데이터센터당 수만 대 서버 |
| 구조 | 4-post Spine-Leaf (Pod 단위) + Fabric Spine |
| 특징 | 모든 서버 간 균일한 대역폭 |
| 효과 | 서비스 배치를 네트워크 토폴로지와 무관하게 자유롭게 |
Microsoft Azure
| 항목 | 내용 |
|---|---|
| 규모 | 60+ 리전, 리전당 수십만 서버 |
| 구조 | 5-Stage Clos (Super Spine 포함) |
| NOS | SONiC (자체 개발 → 오픈소스 공개) |
| 특징 | 화이트박스 + SONiC으로 비용 절감 |
국내 사례
| 환경 | 적용 패턴 |
|---|---|
| 공공 클라우드 IDC | HCI(Nutanix/VxRail) + Spine-Leaf 조합. 10G/25G Leaf |
| 금융 차세대 | VXLAN EVPN 기반 멀티테넌시. 망분리 요구 대응 |
| 통신사 NFV | 가상화된 네트워크 기능(VNF)의 East-West 트래픽 처리 |
| 대기업 프라이빗 클라우드 | VMware NSX + Spine-Leaf Underlay |
📐 설계 시 고려사항
용량 산정
[예시: 서버 500대, 서버당 25G]
1. Leaf 산정
- Leaf 스위치: 48포트 (서버) + 8포트 (Spine 업링크)
- 필요 Leaf: 500 ÷ 48 ≈ 11대
2. Spine 산정
- Leaf 업링크: 8포트 × 100G = 800G
- 서버 다운링크: 48포트 × 25G = 1,200G
- Oversubscription: 1,200G ÷ 800G = 1.5:1
- Spine 포트: 11개 Leaf 연결 → 최소 11포트
- Spine 스위치: 32포트 100G → 4대 (8포트씩 사용)
3. 결과
- Leaf 11대 (48×25G + 8×100G)
- Spine 4대 (32×100G)
- Oversubscription 1.5:1
주요 설계 파라미터
| 파라미터 | 일반 권장 | 설명 |
|---|---|---|
| Oversubscription | 1:1 ~ 3:1 | 1:1이면 Non-blocking |
| Spine 수 | 2~8대 | 이중화 최소 2대, ECMP 경로 수 |
| Leaf 업링크 속도 | 서버 포트의 4배 | 25G 서버 → 100G 업링크 |
| MTU | 9216 (Jumbo) | VXLAN 오버헤드(50B) 수용 |
| BFD | 활성화 | 빠른 장애 감지 (50~300ms) |
VXLAN 설계 시 추가 고려
| 항목 | 설명 |
|---|---|
| VNI 설계 | 테넌트/서브넷별 VNI 매핑 계획 |
| Anycast Gateway | 모든 Leaf에 동일 GW IP/MAC → 분산 라우팅 |
| ARP Suppression | EVPN으로 ARP 브로드캐스트 억제 |
| Route Reflector | 대규모 시 BGP RR로 피어링 수 줄임 |
📋 기술 스택 조합 예시
엔터프라이즈 (검증 우선)
HW: Cisco Nexus 9000 / Arista 7050X
NOS: NX-OS / Arista EOS
Underlay: eBGP
Overlay: VXLAN EVPN
관리: Cisco ACI / Arista CloudVision
비용 최적화 (오픈소스)
HW: Edgecore / Dell S5200 시리즈
NOS: Cumulus Linux / SONiC
Underlay: eBGP (FRRouting)
Overlay: VXLAN EVPN
관리: Ansible + NetBox (IPAM)
하이퍼스케일 (자체 운영)
HW: 화이트박스 (ODM 주문 제작)
NOS: SONiC / 자체 NOS
Underlay: eBGP
Overlay: 필요 시 VXLAN 또는 자체 Encap
관리: 자체 자동화 플랫폼
🔗 관련 문서
- Datacenter Network Topology — 3-Tier vs Spine-Leaf 개요 비교
- IP Model — 네트워크 계층 모델
- Subnet & Routing Basics — IP, 서브넷, 라우팅