BGP (Border Gateway Protocol)¶
인터넷의 핵심 라우팅 프로토콜인 BGP의 동작 원리와 쿠버네티스 환경에서의 활용 방법을 정리한다.
BGP는 인터넷을 구성하는 자율 시스템(AS) 간의 라우팅 정보를 교환하는 프로토콜이다. 온프레미스 쿠버네티스 환경에서는 MetalLB, Cilium BGP Control Plane과 함께 사용되어 외부 네트워크와 통신하는 핵심 역할을 수행한다.
BGP가 필요한 이유¶
클라우드 vs 온프레미스¶
클라우드 환경 (AWS/GCP/Azure):
- LoadBalancer 타입 Service 생성 → 자동으로 ELB/NLB/ALB 프로비저닝
- 클라우드 제공자가 외부 IP 할당 및 라우팅 처리
- BGP 설정 불필요
온프레미스 환경:
- LoadBalancer 타입 Service 생성 → 외부 IP 없음 (Pending 상태)
- 외부 라우터에게 "이 IP로 오는 트래픽은 우리 쿠버네티스 노드로 보내라"고 알려야 함
- BGP를 통해 외부 라우터와 경로 정보 교환 필요
해결 방법 비교¶
| 방법 | 설정 난이도 | 확장성 | HA | 사용 사례 |
|---|---|---|---|---|
| NodePort | 낮음 | 낮음 | 수동 | 개발/테스트 환경 |
| MetalLB (Layer 2) | 중간 | 중간 | GARP 기반 | 단일 L2 네트워크 |
| MetalLB (BGP) | 높음 | 높음 | ECMP | 멀티 라우터, 대규모 |
| Cilium BGP | 높음 | 매우 높음 | ECMP | CNI 통합, eBPF 활용 |
BGP를 사용하면 외부 라우터가 자동으로 쿠버네티스 Service IP로 가는 경로를 학습하고, ECMP(Equal-Cost Multi-Path)를 통해 여러 노드로 트래픽을 분산할 수 있다.
BGP 핵심 개념¶
AS (Autonomous System)¶
정의:
- 단일 라우팅 정책으로 관리되는 IP 네트워크 집합
- 고유한 AS 번호(ASN)로 식별
ASN 범위:
| 범위 | 용도 |
|---|---|
| 1 ~ 64,511 | Public ASN (IANA 할당) |
| 64,512 ~ 65,534 | Private ASN (내부 네트워크 전용) |
| 65,535 | 예약 |
온프레미스 쿠버네티스 환경:
- Private ASN 사용 (예: 64512)
- 외부 라우터 AS와 피어링
eBGP vs iBGP¶
| 구분 | eBGP (External BGP) | iBGP (Internal BGP) |
|---|---|---|
| 사용 목적 | AS 간 라우팅 | AS 내부 라우팅 |
| AS 번호 | 서로 다름 | 동일 |
| TTL | 1 (직접 연결) | 255 (멀티 홉 가능) |
| Next-Hop | 변경됨 | 유지됨 |
| 쿠버네티스 사용 | MetalLB ↔ 외부 라우터 | 노드 간 경로 동기화 |
쿠버네티스 환경에서의 구성:
BGP 동작 원리¶
BGP 피어링 과정¶
sequenceDiagram
participant Router as 외부 라우터<br/>(AS 65000)
participant MetalLB as MetalLB Speaker<br/>(AS 64512)
Router->>MetalLB: 1. TCP 연결 (Port 179)
MetalLB->>Router: 2. OPEN 메시지<br/>(ASN, Router ID)
Router->>MetalLB: 3. OPEN 메시지<br/>(ASN, Router ID)
MetalLB->>Router: 4. KEEPALIVE
Router->>MetalLB: 5. KEEPALIVE
Note over Router,MetalLB: Established 상태
MetalLB->>Router: 6. UPDATE<br/>(10.100.1.10/32 경로 광고)
Router->>MetalLB: 7. KEEPALIVE (ACK)
BGP 메시지 타입:
- OPEN: 피어링 시작, ASN 및 Router ID 교환
- UPDATE: 경로 정보 광고 또는 철회
- KEEPALIVE: 연결 유지 (기본 60초마다)
- NOTIFICATION: 에러 발생 시 연결 종료
경로 선택 알고리즘¶
BGP는 여러 경로 중 최적 경로를 선택할 때 다음 순서를 따른다.
우선순위 (높은 순):
- Weight (시스코 전용, 로컬 라우터에서만 유효)
- Local Preference (AS 내부에서 선호하는 경로)
- AS Path Length (짧을수록 우선)
- Origin Type (IGP > EGP > Incomplete)
- MED (Multi-Exit Discriminator) (낮을수록 우선)
- eBGP > iBGP
- IGP Metric (Next-Hop까지 비용)
- Router ID (낮을수록 우선)
쿠버네티스 환경에서 중요한 속성:
- Local Preference: 특정 노드를 선호하도록 설정 (Active-Standby)
- AS Path Prepending: AS 번호를 반복해서 경로 길이 증가 (우선순위 낮춤)
ECMP (Equal-Cost Multi-Path)¶
개념:
- 동일한 비용의 여러 경로가 있을 때 트래픽을 분산
- 외부 라우터가 여러 노드로 트래픽 로드 밸런싱
동작 방식:
3개 노드가 모두 동일한 Service IP(10.100.1.10)를 BGP로 광고하면, 외부 라우터는 ECMP를 통해 세 노드로 트래픽을 분산한다.
MetalLB BGP 모드¶
아키텍처¶
graph TB
subgraph External["외부 네트워크"]
Router[외부 라우터<br/>AS 65000]
end
subgraph K8s["쿠버네티스 클러스터 (AS 64512)"]
Speaker1[MetalLB Speaker<br/>Node 1]
Speaker2[MetalLB Speaker<br/>Node 2]
Speaker3[MetalLB Speaker<br/>Node 3]
Service[Service<br/>LoadBalancer<br/>10.100.1.10]
end
Router -->|eBGP 피어링| Speaker1
Router -->|eBGP 피어링| Speaker2
Router -->|eBGP 피어링| Speaker3
Speaker1 -.->|경로 광고| Service
Speaker2 -.->|경로 광고| Service
Speaker3 -.->|경로 광고| Service
설정 예시¶
MetalLB ConfigMap (BGP 모드):
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
peers:
- peer-address: 192.168.1.1 # 외부 라우터 IP
peer-asn: 65000 # 외부 라우터 ASN
my-asn: 64512 # MetalLB ASN
address-pools:
- name: default
protocol: bgp
addresses:
- 10.100.1.10-10.100.1.20 # Service IP 대역
외부 라우터 설정 (Cisco 예시):
router bgp 65000
neighbor 192.168.1.10 remote-as 64512 ! Node 1
neighbor 192.168.1.11 remote-as 64512 ! Node 2
neighbor 192.168.1.12 remote-as 64512 ! Node 3
maximum-paths 3 ! ECMP 3개 경로
동작 흐름¶
Service 생성 시:
- LoadBalancer 타입 Service 생성
- MetalLB Controller가 IP Pool에서 IP 할당 (예: 10.100.1.10)
- 모든 노드의 MetalLB Speaker가 외부 라우터에 BGP UPDATE 메시지로 경로 광고
- 외부 라우터가 ECMP를 통해 3개 노드로 트래픽 분산
트래픽 흐름:
외부 클라이언트 (10.100.1.10:80 요청)
↓
외부 라우터 (ECMP 선택: Node 2)
↓
Node 2의 kube-proxy (iptables/IPVS)
↓
Service Endpoint Pod (Node 1/2/3 중 하나)
Cilium BGP Control Plane¶
MetalLB vs Cilium BGP¶
| 구분 | MetalLB BGP | Cilium BGP |
|---|---|---|
| CNI 의존성 | 독립형 (모든 CNI 호환) | Cilium CNI 필수 |
| 구현 방식 | Go 표준 라이브러리 | GoBGP 라이브러리 |
| eBPF 활용 | 없음 | kube-proxy 대체 가능 |
| 확장성 | 중간 | 높음 |
| 고급 기능 | 제한적 | Service LB, Pod CIDR 광고 |
Cilium BGP 아키텍처¶
graph TB
subgraph External["외부 네트워크"]
ToR1[ToR 스위치 1<br/>AS 65000]
ToR2[ToR 스위치 2<br/>AS 65000]
end
subgraph K8s["쿠버네티스 클러스터"]
subgraph Node1["Node 1 (AS 64512)"]
Cilium1[Cilium Agent<br/>BGP Speaker]
Pod1[Pod CIDR<br/>10.244.1.0/24]
end
subgraph Node2["Node 2 (AS 64512)"]
Cilium2[Cilium Agent<br/>BGP Speaker]
Pod2[Pod CIDR<br/>10.244.2.0/24]
end
end
ToR1 -->|eBGP| Cilium1
ToR2 -->|eBGP| Cilium2
Cilium1 -.->|광고: 10.100.1.10/32| ToR1
Cilium1 -.->|광고: 10.244.1.0/24| ToR1
Cilium2 -.->|광고: 10.100.1.10/32| ToR2
Cilium2 -.->|광고: 10.244.2.0/24| ToR2
CiliumBGPPeeringPolicy 설정¶
apiVersion: cilium.io/v2alpha1
kind: CiliumBGPPeeringPolicy
metadata:
name: rack1
spec:
nodeSelector:
matchLabels:
rack: rack1
virtualRouters:
- localASN: 64512
exportPodCIDR: true # Pod CIDR 광고
neighbors:
- peerAddress: 192.168.1.1/32 # ToR 스위치
peerASN: 65000
주요 기능:
- Service LoadBalancer IP 광고: MetalLB와 동일
- Pod CIDR 광고: 외부에서 Pod IP로 직접 접근 가능 (Overlay 우회)
- 노드 단위 정책: 랙별로 다른 BGP 설정 적용
실무 트러블슈팅¶
BGP 피어링 실패¶
증상:
원인 및 해결:
| 원인 | 확인 방법 | 해결 방법 |
|---|---|---|
| 방화벽 차단 | telnet 192.168.1.1 179 |
TCP 179 포트 허용 |
| ASN 불일치 | 라우터 설정 확인 | ConfigMap ASN 수정 |
| Router ID 중복 | show ip bgp summary |
각 노드마다 고유 IP 사용 |
경로가 광고되지 않음¶
증상:
확인 방법:
# MetalLB Speaker 로그
kubectl logs -n metallb-system speaker-xxx | grep UPDATE
# Service IP 할당 확인
kubectl get svc my-service
# EXTERNAL-IP가 <pending>이면 IP Pool 부족
ECMP 트래픽 불균형¶
증상:
- 특정 노드로만 트래픽 집중
- 다른 노드는 트래픽 없음
원인:
- 외부 라우터 ECMP 비활성화
- 경로의 Local Preference 차이
해결:
BGP Session Flapping¶
증상:
원인:
- KEEPALIVE/Hold Timer 불일치
- 네트워크 지연 (패킷 손실)
해결:
# MetalLB ConfigMap
peers:
- peer-address: 192.168.1.1
peer-asn: 65000
my-asn: 64512
hold-time: 180s # 기본 90초 → 180초로 증가