티스토리 뷰
실제 경험과 인사이트를 AI와 함께 정리한 글
Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(5)
pak2251 2025. 10. 26. 19:274단계: 네트워킹 심화 이해
시리즈: Oracle Cloud + Tailscale + Kubernetes 완벽 가이드
← 이전: 3단계: Kubernetes + Cilium 구축 | 다음: 5단계: 실전 경험과 교훈 →
Tailscale + Cilium 네트워킹 스택의 동작 원리 완벽 분석
📋 이 문서의 목적
Kubernetes 클러스터가 정상 동작한다면, 이제 왜 이렇게 구성했는지 이해할 차례입니다.
패킷이 어떻게 흐르는지, 각 구성요소가 어떤 역할을 하는지 깊이 있게 살펴봅니다.
🏗️ 전체 네트워킹 스택
┌──────────────────────────────────────────────┐
│ Application Layer │
│ (Pod/Container) │
├──────────────────────────────────────────────┤
│ Cilium eBPF (CNI) │
│ • kube-proxy replacement │
│ • VXLAN encapsulation │
│ • Service load balancing │
├──────────────────────────────────────────────┤
│ Tailscale (WireGuard VPN) │
│ • Peer-to-peer mesh │
│ • NAT traversal │
├──────────────────────────────────────────────┤
│ Linux Network Stack │
│ • netfilter/iptables │
│ • routing tables │
├──────────────────────────────────────────────┤
│ Physical Network (Oracle VCN) │
│ • Public IP │
│ • Security Lists │
└──────────────────────────────────────────────┘🔄 Phase 1: Tailscale 네트워킹
WireGuard 터널링
Tailscale은 WireGuard 프로토콜을 사용하여 암호화 터널을 생성합니다:
Node A (100.64.0.1) Node B (100.64.0.2)
│ │
│ WireGuard Handshake │
│<─────────────────────────>│
│ │
│ Encrypted UDP Tunnel │
│ (Port 41641) │
│<═════════════════════════>│Tailscale 인터페이스 분석
# Tailscale 인터페이스 정보
ip addr show tailscale0
# 3: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP>
# inet 100.64.0.1/32 scope global tailscale0
# 라우팅 테이블
ip route | grep tailscale
# 100.64.0.2 dev tailscale0 scope link
# 100.64.0.3 dev tailscale0 scope link특징:
- Point-to-Point: 각 피어와 직접 연결
- /32 주소: 단일 IP만 할당
- 동적 라우팅: 피어 추가/제거 시 자동 업데이트
NAT Traversal (STUN/DERP)
실제 네트워크 경로:
Oracle VCN A (NAT) Internet Oracle VCN B (NAT)
│ │ │
Node A ──────> STUN Server <────── Node B
│ (연결 조정) │
│ │
└──────────> Direct P2P <───────────┘
(최종 직접 연결)🌐 Phase 2: Cilium CNI 동작
VXLAN 오버레이 네트워크
Cilium이 VXLAN을 사용하는 이유:
- Tailscale 네트워크와 독립적인 Pod 네트워크 구성
- 다양한 네트워크 토폴로지 지원
VXLAN 캡슐화:
┌──────────────┐
│ Original L2 │ Pod → Pod 원본 프레임
├──────────────┤
│ VXLAN │ VNI: 1234 (가상 네트워크 ID)
├──────────────┤
│ UDP │ Port: 8472
├──────────────┤
│ IP │ Src: 100.64.0.1, Dst: 100.64.0.2
├──────────────┤
│ WireGuard │ Tailscale 암호화
└──────────────┘eBPF 프로그램 위치
# eBPF 프로그램 확인
cilium bpf list
# Loaded BPF programs:
# - cil_from_container (TC ingress)
# - cil_to_container (TC egress)
# - cil_sock_ops (socket operations)
# - cil_lb (load balancer)각 프로그램의 역할:
| 프로그램 | 위치 | 역할 |
|---|---|---|
cil_from_container |
veth ingress | Pod에서 나가는 패킷 처리 |
cil_to_container |
veth egress | Pod로 들어오는 패킷 처리 |
cil_sock_ops |
Socket layer | 연결 추적, 정책 적용 |
cil_lb |
XDP/TC | Service 로드밸런싱 |
kube-proxy 대체 동작
Service (ClusterIP) 접근 흐름:
1. Pod A → Service IP (10.96.0.10)
↓
2. eBPF LB Map lookup
┌──────────────────────┐
│ 10.96.0.10:80 → │
│ - 10.244.0.5:80 │
│ - 10.244.1.6:80 │
└──────────────────────┘
↓
3. DNAT to selected endpoint
↓
4. VXLAN encapsulation
↓
5. Tailscale tunneling🔀 Phase 3: 패킷 플로우 상세 분석
시나리오 1: 같은 노드 내 Pod 통신
Pod A (10.244.0.5) → Pod B (10.244.0.6)
1. Pod A veth → cilium_host
2. eBPF redirect (no kernel stack)
3. Direct to Pod B veth
4. Pod B receives
Total hops: 0 (eBPF fast path)시나리오 2: 다른 노드 Pod 통신
Node 1: Pod A (10.244.0.5) → Node 2: Pod B (10.244.1.10)
1. Pod A → cilium_vxlan
└─ eBPF: policy check, VXLAN encap
2. cilium_vxlan → tailscale0
└─ Routing: 10.244.1.0/24 via 100.64.0.2
3. tailscale0 → WireGuard tunnel
└─ Encryption, UDP 41641
4. Internet traversal
└─ Oracle VCN → Public IP → Oracle VCN
5. Node 2: tailscale0 → cilium_vxlan
└─ Decryption, VXLAN decap
6. cilium_vxlan → Pod B
└─ eBPF: policy enforcement시나리오 3: Pod → 외부 인터넷
Pod (10.244.0.5) → google.com (142.250.x.x)
1. Pod → cilium_host
└─ Default route via node
2. eBPF Masquerade
└─ SNAT: 10.244.0.5 → Node IP
3. Node routing decision
└─ Default route via enp0s6 (NOT tailscale0)
4. Oracle VCN NAT Gateway
└─ SNAT: Private IP → Public IP
5. Internet🔍 Phase 4: 디버깅과 관찰
tcpdump로 패킷 캡처
# VXLAN 트래픽 확인
sudo tcpdump -i tailscale0 -nn 'udp port 8472' -c 10
# 특정 Pod의 트래픽
sudo tcpdump -i cali12345678 -nn
# WireGuard 트래픽
sudo tcpdump -i any -nn 'udp port 41641'eBPF 맵 확인
# Service 엔드포인트 맵
cilium bpf lb list
# 연결 추적 테이블
cilium bpf ct list global
# 정책 맵
cilium bpf policy get네트워크 경로 추적
# Pod에서 경로 확인
kubectl run debug --rm -it --image=nicolaka/netshoot -- bash
# netshoot Pod 내부에서
traceroute 100.64.0.2 # 다른 노드
traceroute 8.8.8.8 # 외부
# MTU 경로 발견
ping -M do -s 1472 100.64.0.2⚙️ Phase 5: 성능 최적화
MTU 최적화
최적 MTU 계산:
Base Ethernet MTU: 1500
- WireGuard overhead: -60
- VXLAN overhead: -50
- Safety margin: -10
─────────────────────────────
Optimal MTU: 1380
실제 설정: 1200 (보수적)eBPF 최적화
# Cilium 성능 튜닝
bpf:
preallocateMaps: true # BPF 맵 사전 할당
masquerade: true # eBPF 기반 마스커레이드
clockSource: ktime # 정확한 타임스탬프
# 연결 추적 최적화
conntrack:
accounting: false # 통계 비활성화 (성능)
maxEntries: 524288 # 최대 연결 수 증가Tailscale 최적화
# UDP 수신 버퍼 증가
sudo sysctl -w net.core.rmem_default=26214400
sudo sysctl -w net.core.rmem_max=26214400
# WireGuard 키 교환 간격
sudo tailscale set --key-expiry-warning=24h🛠️ Phase 6: 트러블슈팅 가이드
문제: Pod가 외부 접속 불가
증상: Pod → google.com 실패
진단 체크리스트:
- ✓ CoreDNS 동작 확인
- ✓ Masquerade 설정 확인
- ✓ Default route 확인
- ✓ Oracle VCN NAT Gateway
# 진단 명령어
kubectl exec <pod> -- nslookup google.com
kubectl exec <pod> -- ping 8.8.8.8
kubectl exec <pod> -- wget -O- http://checkip.amazonaws.com문제: 노드 간 통신 불안정
증상: 간헐적 패킷 로스
진단 체크리스트:
- ✓ Tailscale 직접 연결 확인
- ✓ VXLAN 인터페이스 상태
- ✓ MTU 불일치 확인
# Tailscale 연결 품질
tailscale ping --verbose 100.64.0.2
# VXLAN 인터페이스 통계
ip -s link show cilium_vxlan📊 모니터링 메트릭
주요 관찰 지표
| 메트릭 | 명령어 | 정상 범위 |
|---|---|---|
| Tailscale 지연시간 | tailscale ping |
< 50ms |
| VXLAN 패킷 드롭 | ip -s link show |
0 |
| eBPF 프로그램 오류 | cilium metrics list |
0 |
| 연결 추적 테이블 사용률 | conntrack -C |
< 80% |
Prometheus 메트릭 (선택)
# Cilium 메트릭 활성화
prometheus:
enabled: true
serviceMonitor:
enabled: true
# 주요 메트릭
- cilium_bpf_syscall_duration_seconds
- cilium_datapath_errors_total
- cilium_endpoint_state
- cilium_kubernetes_events_total🎯 핵심 이해 포인트
1. 왜 VXLAN over Tailscale?
- 격리: Pod 네트워크와 노드 네트워크 분리
- 유연성: 다양한 underlay 네트워크 지원
- 호환성: 표준 Kubernetes 네트워킹 모델
2. 왜 kube-proxy 대체?
- 성능: iptables 규칙 대신 eBPF 사용
- 확장성: O(1) 룩업 시간
- 기능: 고급 로드밸런싱 알고리즘
3. 왜 devices 설정이 중요한가?
# ❌ 잘못된 설정
devices: tailscale0 # 외부 통신 불가
# ✅ 올바른 설정
devices: "" # 자동 감지 (enp0s6, tailscale0)- Cilium은 지정된 인터페이스만 사용
- 외부 통신은 물리 인터페이스 필요
- Tailscale은 피어 간 통신만 처리
📚 참고 자료
공식 문서
추가 학습
- eBPF 프로그래밍 기초
- WireGuard 프로토콜 상세
- Kubernetes 네트워킹 모델
🔄 다음 단계
네트워킹을 완전히 이해했다면:
- Ingress Controller 추가 (Traefik/Nginx)
- 모니터링 스택 구성 (Prometheus/Grafana)
- GitOps 파이프라인 구축
이제 당신은 Tailscale + Cilium 네트워킹의 전문가입니다!
'실제 경험과 인사이트를 AI와 함께 정리한 글' 카테고리의 다른 글
| Kubernetes Pod Security Standards: nginx-unprivileged로 보안 강화하기 (0) | 2025.10.26 |
|---|---|
| Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(6) (0) | 2025.10.26 |
| Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(4) (0) | 2025.10.26 |
| Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(3) (0) | 2025.10.26 |
| Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(2) (0) | 2025.10.26 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- PYTHON
- backend
- frontend
- Go
- Tailwind CSS
- LangChain
- authentication
- react
- Ontology
- Kubernetes
- AI
- LLM
- authorization
- Next.js
- 개발 도구
- SHACL
- workflow
- Rag
- AI Development
- api gateway
- claude code
- security
- Tax Analysis
- architecture
- AI agent
- knowledge graph
- Developer Tools
- troubleshooting
- ai 개발 도구
- Claude
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
글 보관함
