🚀 요약
SUMMARY
다양한 CNI 후보 중, eBPF 기반의 뛰어난 성능과 확장성을 제공하는 Cilium을 최종 선정했다. 이 글은 Calico, Flannel 등 주요 CNI를 비교하고 Cilium을 선택한 이유를 설명한다.
💡 개요
컨테이너 네트워크 인터페이스(Container Network Interface, CNI)는 쿠버네티스와 같은 컨테이너 오케스트레이션 시스템(Container Orchestration System)에서 파드(Pod) 간의 네트워크 연결, IP 주소 할당, 네트워크 정책 적용 등을 담당하는 핵심 구성 요소다.
📋 선정 배경
단순히 파드 통신만을 고려했다면 Flannel 이 아주 간단한 설정으로 도입이 빨랐을 것이다. 하지만 전반적인 네트워크의 성능, 보안 규칙, 클러스터 외부에서 Pod IP 나 Service IP 로의 접근 등을 고려하는 것이 이번 선정의 주된 목표였다. 이러한 요구사항을 충족시킬 수 있는 최적의 CNI 솔루션을 찾고자 했다.
📊 비교
쿠버네티스 생태계에는 다양한 CNI 구현체가 존재하며, 각각 고유한 특징과 장단점을 가진다. 주요 후보들을 간략히 비교해보았다.
CNI 구현체 | 특징 | 장점 | 단점 |
---|---|---|---|
Calico | 강력한 네트워크 정책, BGP 기반 라우팅 | 뛰어난 확장성, 보안 강화 | 복잡한 설정, 리소스 사용량 높음 |
Flannel | 간단하고 가벼운 오버레이 네트워크 | 설정 용이, 낮은 리소스 사용량 | 고급 기능 제한, 성능 최적화 부족 |
Cilium | eBPF 기반 고성능 네트워킹, 보안, 가시성 | 뛰어난 성능, kube-proxy 대체 가능, 서비스 메시 통합, 풍부한 가시성 | 상대적으로 높은 학습 곡선 |
1. Calico
Calico는 강력한 네트워크 정책(Network Policy) 기능과 뛰어난 확장성을 제공하는 CNI다. BGP(Border Gateway Protocol)를 사용하여 라우팅 정보를 교환하며, 복잡한 네트워크 환경에서도 안정적인 통신을 보장한다. 보안에 중점을 둔 환경이나 대규모 클러스터에 적합하다는 평가를 받는다.
2. Flannel
Flannel은 간단하고 가벼운 CNI 구현체로, 주로 오버레이 네트워크(Overlay Network) 방식을 사용하여 파드 간 통신을 지원한다. 설정이 용이하고 리소스 사용량이 적어 소규모 클러스터나 학습 환경에서 많이 사용된다. 하지만 고급 네트워크 정책 기능이나 성능 최적화 측면에서는 다른 CNI에 비해 제한적일 수 있다.
3. Cilium
Cilium은 리눅스 커널의 eBPF(extended Berkeley Packet Filter) 기술을 활용하여 고성능 네트워킹, 보안, 가시성을 제공하는 CNI다. 커널 레벨에서 패킷 처리를 최적화하여 기존 CNI들이 가지는 성능 병목 현상을 해결하고, 강력한 네트워크 정책 및 서비스 메시 기능을 통합적으로 제공한다.
✅ 선정 사유
주요 CNI 구현체들을 검토한 결과, 다음과 같은 구체적인 이유로 Cilium을 Kubernetes 클러스터의 CNI 구현체로 최종 선정했다.
1. eBPF 기술의 적극적인 활용
Cilium은 eBPF 기술을 활용하여 네트워크 패킷 처리를 커널 레벨에서 효율적으로 수행한다. eBPF는 샌드박스 환경에서 커널 기능을 확장하게 해주어, 기존의 iptables
나 ipvs
기반의 네트워크 처리 방식보다 훨씬 빠르고 유연하게 네트워크 정책을 적용하고 로드 밸런싱을 할 수 있다.
NOTE
개인적으로 이 부분이 가장 매력적이었다. eBPF를 통해 커널 수준에서 최적화된 패킷 처리가 가능하다는 점은 대규모 클러스터 환경에서 특히 중요하다고 생각한다.
2. MetalLB 없이 LoadBalancer 타입 서비스 생성 가능
일반적으로 온프레미스 환경에서 쿠버네티스 로드밸런서(LoadBalancer) 타입의 서비스를 사용하려면 MetalLB와 같은 외부 솔루션이 필요하다. 하지만 Cilium은 자체적으로 BGP 또는 L2 모드를 통해 LoadBalancer
타입 서비스를 외부에 노출할 수 있는 기능을 제공한다.
NOTE
MetalLB 없이
LoadBalancer
서비스를 사용할 수 있다는 점은 온프레미스 환경에서 운영 효율성을 크게 높여준다.
3. kube-proxy 완전 비활성화 및 성능 향상
Cilium은 kube-proxy
를 완전히 비활성화하고 eBPF 기반의 로드 밸런싱 및 네트워크 정책 적용 기능을 자체적으로 수행할 수 있다. kube-proxy
는 iptables
또는 ipvs
규칙을 관리하여 서비스 로드 밸런싱을 처리하는데, 이는 대규모 클러스터에서 성능 병목 현상을 유발할 수 있다. Cilium은 이 부분을 eBPF로 대체하여 더 효율적이고 빠르게 데이터를 처리한다.
NOTE
kube-proxy
를 제거할 수 있다는 점은 클러스터의 네트워크 스택을 훨씬 간결하게 만든다는 의미이기도 하다. 이는 운영 복잡도를 줄이고 잠재적인 문제 발생 가능성을 낮춘다.
4. Envoy를 사용한 서비스 메시 구성 연계
Cilium은 Envoy 프록시와의 통합을 통해 서비스 메시(Service Mesh) 기능을 제공한다. 이를 통해 L7(Application Layer) 기반의 네트워크 정책, 트래픽 관리, 가시성 확보 등 고급 서비스 메시 기능을 클러스터 내에서 구현할 수 있다. 이는 마이크로서비스 아키텍처의 복잡성을 관리하고 서비스 간 통신을 더욱 견고하게 만드는 데 기여한다.
NOTE
Cilium의 서비스 메시 기능은 별도의 솔루션(예: Istio)을 도입하지 않고도 일부 서비스 메시의 이점을 누릴 수 있게 하여 운영 부담을 줄여준다.
5. Hubble UI를 이용한 네트워크 가시성 확보
Cilium은 Hubble이라는 강력한 네트워크 가시성 및 모니터링 도구를 제공한다. Hubble UI를 통해 클러스터 내의 네트워크 흐름, 정책 적용 상태, 서비스 간 통신 지연 등을 시각적으로 확인할 수 있다. 이는 네트워크 문제 해결 및 성능 분석에 매우 유용하며, 운영 효율성을 크게 향상시킨다.
NOTE
눈으로 직접 네트워크 흐름을 볼 수 있다는 점은 트러블슈팅 시 큰 도움이 된다. 특히 복잡한 마이크로서비스 환경에서 문제의 원인을 빠르게 파악하는 데 필수적이다.
6. Cilium Gateway API 연계
Kubernetes 게이트웨이 API(Gateway API)는 Ingress API의 차세대 버전으로, 더 유연하고 확장 가능한 트래픽 관리 기능을 제공한다. Cilium은 Gateway API와 연계하여 클러스터 외부 트래픽을 효율적으로 관리하고, 고급 라우팅 및 정책 적용을 할 수 있다. 이는 클러스터의 Ingress/Egress 트래픽 관리를 더욱 정교하게 만든다.
NOTE
Gateway API와의 연동은 향후 트래픽 관리의 유연성과 확장성을 크게 향상시킬 것으로 기대된다.
7. BGP 지원을 통한 외부 네트워크 연동
Cilium은 BGP(Border Gateway Protocol)를 지원하여 클러스터 외부의 네트워크 장비와 라우팅 정보를 교환할 수 있다. 이를 통해 클러스터 내부의 파드(Pod)와 서비스(Service) 네트워크를 서브넷이 다른 외부 네트워크까지 안정적으로 노출하고 통신할 수 있다.
사내에서 사용하는 UTM 장비(FortiGate) 와 BGP 연동을 통해, 클러스터 내부의 파드 및 서비스 IP 대역을 외부 네트워크에 동적으로 광고(Advertising)할 수 있다. 이는 별도의 NAT(Network Address Translation) 설정이나 복잡한 라우팅 규칙 없이도 외부에서 클러스터 내부의 파드와 서비스에 직접 접근할 수 있게 해주어 네트워크 구성의 유연성과 확장성을 크게 높여준다.
NOTE
왜 L2(ARP)가 아닌 BGP를 선택했을까? MetalLB나 Cilium이 외부 서비스를 노출할 때 사용하는 대표적인 방식은 L2와 L3(BGP)이다.
- L2 방식의 한계: 이 방식은 특정 IP에 대한 주소 결정 프로토콜(Address Resolution Protocol, ARP) 요청에 응답하여 동작한다. 특정 노드가 해당 IP를 소유하고 “그 IP는 저에게 보내세요”라고 알리는 것과 같다. 하지만 ARP는 동일한 로컬 네트워크(L2 도메인) 내에서만 유효하며, 라우터를 넘어 다른 서브넷까지 경로를 전파하지 못한다.
- L3 (BGP) 방식의 장점: BGP는 라우터 간의 통신 프로토콜이다. Cilium이 BGP를 통해 외부 라우터(예: FortiGate)와 연동하면, “특정 파드나 서비스 IP 대역으로 가려면 우리 클러스터로 트래픽을 보내”라고 라우팅 경로 자체를 알려준다. 라우터는 이 정보를 받아 다른 네트워크에 전파하므로, 서브넷이 다른 외부 네트워크에 있는 클라이언트도 파드나 서비스 IP로 원활하게 통신할 수 있다. 이것이 바로 BGP가 더 복잡한 네트워크 환경에서 강력한 확장성을 제공하는 이유이다.