2025-08-15 4:31 AM
Kubernetes 클러스터를 운영하다 보면 필연적으로 네트워킹 성능과 확장성 문제에 부딪히게 됩니다. 그 중심에는 늘 kube-proxy가 있습니다. 기본적으로 제공되는 컴포넌트지만, 서비스 개수가 늘어날수록 iptables 규칙이 기하급수적으로 증가하며 성능 저하를 유발하죠.
이번 글에서는 Kube-proxy를 완전히 제거하고, eBPF 기반의 Cilium으로 이를 대체하는 방법(Kube-proxy Replacement)과, 왜 그렇게 해야 하는지 성능 관점에서 깊이 있게 다뤄보겠습니다.
Kube-proxy의 기본 모드인 iptables 모드는 리눅스 커널의 패킷 필터링 기능을 사용하여 서비스(ClusterIP) 트래픽을 백엔드 파드로 로드밸런싱합니다.
문제는 iptables 규칙이 리스트 형태(Sequential List)로 처리된다는 점입니다. 서비스 하나를 찾기 위해 수천, 수만 개의 규칙을 순차적으로 평가해야 할 수도 있습니다.
IPVS 모드가 대안으로 나왔지만, 여전히 연결 추적(Conntrack) 테이블 고갈 문제나 복잡한 관리 포인트가 남습니다.
Cilium은 리눅스 커널의 eBPF(Extended Berkeley Packet Filter) 기술을 활용합니다. 네트워크 패킷을 커널 레벨에서 샌드박싱된 프로그램으로 처리하죠.
이제 실제로 Kube-proxy를 걷어내고 Cilium만으로 클러스터를 구성해 봅시다.
kube-proxy를 애초에 설치하지 않거나, 설치 후 비활성화해야 합니다.Cilium 설치 시 kubeProxyReplacement 값을 true로 설정하는 것이 핵심입니다.
helm install cilium cilium/cilium \
--namespace kube-system \
--set kubeProxyReplacement=true \
--set k8sServiceHost=API_SERVER_IP \
--set k8sServicePort=API_SERVER_PORT \
# 필요 시 추가 설정
--set socketLB.enabled=true \
--set bpf.masquerade=truekubeProxyReplacement=true: Cilium이 kube-proxy 역할을 대신합니다.socketLB.enabled=true: 소켓 레벨 로드밸런싱을 활성화하여 사이드카 프록시를 거치지 않고도 파드 통신을 최적화합니다.bpf.masquerade=true: iptables 대신 eBPF 기반의 고성능 Masquerading(NAT)을 사용합니다.실제 벤치마크 결과(서비스 10,000개 기준)를 비교해보면 그 차이는 명확합니다.
eBPF 기반의 XDP(eXpress Data Path)까지 활용하면, 네트워크 카드로 들어온 패킷을 OS 네트워크 스택을 거치지 않고 바로 처리할 수 있어, iptables 대비 최대 5~6배 이상의 처리량을 보여주기도 합니다.
대규모 클러스터나 마이크로서비스 아키텍처(MSA) 환경에서 Kube-proxy Free (Cilium) 모드는 선택이 아닌 필수 전락하고 있습니다.
단순히 "빠르다"는 것을 넘어, 운영의 복잡성을 줄이고 예측 가능한 성능을 보장한다는 점에서 강력히 추천합니다. 지금 바로 여러분의 클러스터에서 레거시 iptables를 걷어내 보세요.
Note: 기존 클러스터에서 마이그레이션할 경우, 다운타임이 발생할 수 있으므로 신중한 계획이 필요합니다.