CNI 네트워크
Kubernetes Container Network Interface의 동작 원리와 주요 구현체 비교
Kubernetes Container Network Interface의 동작 원리와 주요 구현체 비교
목표: CNI 선택 기준을 이해하고, 네트워크 문제를 진단할 수 있는 수준
🌐 CNI 개요
CNI란?
Container Network Interface — 컨테이너 네트워크의 표준 인터페이스.
graph TB
subgraph "Kubernetes Node"
KUBELET["🔧 kubelet"]
CNI["🌐 CNI Plugin"]
subgraph "Pod Network"
POD1["📦 Pod 1<br/>10.244.1.2"]
POD2["📦 Pod 2<br/>10.244.1.3"]
end
BRIDGE["🌉 cni0 bridge"]
VETH1["🔗 veth"]
VETH2["🔗 veth"]
end
KUBELET -->|"CNI 호출"| CNI
CNI -->|"네트워크 설정"| BRIDGE
BRIDGE --- VETH1 --- POD1
BRIDGE --- VETH2 --- POD2
CNI 동작 과정
# Pod 생성 시:
# 1. kubelet이 CNI 호출
# 2. CNI가 네트워크 네임스페이스 생성
# 3. veth pair 생성 (Pod ↔ Node)
# 4. IP 할당
# 5. 라우팅 설정
🔧 주요 CNI 비교
| CNI | 모델 | 특징 | 사용처 |
|---|---|---|---|
| Flannel | Overlay (VXLAN) | 단순, 가벼움 | 소규모, 개발 |
| Calico | BGP + Overlay | 정책, 모니터링 | 일반적, 프로덕션 |
| Cilium | eBPF | 고성능, 보안, 관측성 | 대규모, 보안 |
| Weave | Mesh | 자동 발견, 암호화 | 간편한 설정 |
Flannel
# 설치
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 확인
kubectl get pods -n kube-flannel
특징:
- VXLAN 기반 Overlay
- 간단한 설정
- NetworkPolicy 미지원
Calico
# 설치
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
# 확인
kubectl get pods -n calico-system
특징:
- BGP 기반 (Overlay 없이도 가능)
- NetworkPolicy 지원
- Felix (에이전트), BIRD (BGP), Typha (확장)
Cilium
# Helm 설치
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --namespace kube-system
# 확인
kubectl get pods -n kube-system -l k8s-app=cilium
특징:
- eBPF 기반 (커널 레벨)
- Hubble (관측성)
- L7 정책, mTLS
📡 네트워크 모델
Overlay vs Underlay
graph TB
subgraph "Overlay (VXLAN)"
O1["Pod Network<br/>10.244.0.0/16"]
O2["VXLAN Tunnel"]
O3["Node Network<br/>192.168.0.0/24"]
O1 --> O2 --> O3
end
subgraph "Underlay (BGP)"
U1["Pod Network<br/>10.244.0.0/16"]
U2["물리 네트워크"]
U1 --> U2
end
| 모델 | 장점 | 단점 |
|---|---|---|
| Overlay | 어떤 네트워크에서도 동작 | 성능 오버헤드 |
| Underlay | 최적의 성능 | 네트워크 팀 협업 필요 |
🐛 문제 해결
Pod 네트워크 연결 테스트
# Pod 내부에서 테스트
kubectl run -it --rm debug --image=busybox --restart=Never -- sh
# 내부 통신
wget -O- http://my-service:80
# 외부 통신
ping 8.8.8.8
nslookup google.com
# 노드 간 통신
ping <다른 Pod IP>
CNI 로그 확인
# Flannel
kubectl logs -n kube-flannel -l app=flannel
# Calico
kubectl logs -n calico-system -l k8s-app=calico-node
# Cilium
kubectl logs -n kube-system -l k8s-app=cilium
📋 체크리스트
- CNI 설치/확인
- Pod IP 할당 확인
- 노드 간 통신 테스트
- Service 통신 테스트
- CNI 로그 확인
- NetworkPolicy 동작 확인
🔗 관련 노트
- 02-04-NetworkPolicy — 네트워크 보안
- 02-05-DNS-서비스-발견 — 내부 DNS
- 01-06-Service-타입 — 서비스 노출
마지막 업데이트: 2026-06-01