본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Calico eBPF 알아보기

원문 보기 위키 갱신

eBPF는 요즘 쿠버네티스 네트워킹에서 가장 주목받는 커널 기술 중 하나예요. 이 문서에서는 eBPF가 무엇인지, 그리고 Calico의 eBPF 데이터 플레인이 표준 Linux 데이터 플레인과 비교해 처리량, 지연 시간, 소스 IP 보존 측면에서 어떤 차이를 만드는지 소개해요. 데이터 플레인을 고르기 전에 꼭 알아야 할 배경 지식을 담았어요.

출처: 문서

본문

eBPF란 무엇인가요?

Linux 커널은 네트워킹, 옵저버빌리티, 보안 기능을 만들기에 강력하지만, 역사적으로 개발자들에게는 여러 난제를 안겨 줬어요. 커널 모듈을 추가하거나 커널 소스 코드를 수정하는 작업은 복잡한 추상화와 얽힌 시스템 사이를 헤쳐 나가야 하는 경우가 많아 디버깅도 어려웠어요. eXtended Berkeley Packet Filter(eBPF)는 바로 이런 고충을 풀어 주는 해법이에요.

eBPF는 Linux 커널 4.4 버전부터 완전히 통합된 커널 기술로, 외부 커널 모듈이나 커널 소스 코드 수정 없이도 프로그램을 실행할 수 있게 해 줘요. Linux 커널 안에서 직접 동작하는 가볍고 샌드박스 처리된 가상 머신이라고 생각하면 좋아요. 덕분에 개발자는 커널의 특정 자원을 활용할 수 있는 바이트코드를 실행할 수 있어요.

eBPF를 사용하면 커널 소스 코드를 바꿔야 한다는 요구 사항이 사라지고, 소프트웨어가 기존 커널 계층을 활용하는 능력이 한층 강해져요. 그 결과 이 기술은 옵저버빌리티, 보안, 네트워킹 같은 핵심 서비스의 제공 방식을 근본적으로 바꿀 잠재력을 갖고 있어요.

Calico의 eBPF 데이터 플레인

Calico의 eBPF 데이터 플레인은 표준 Linux 데이터 플레인(iptables 기반)의 대안이에요. 표준 데이터 플레인이 kube-proxy와 여러분이 직접 작성한 iptables 규칙과의 상호 운용이라는 호환성에 초점을 맞추는 반면, eBPF 데이터 플레인은 성능, 지연 시간, 그리고 표준 데이터 플레인에서는 불가능한 기능으로 사용자 경험을 개선하는 데 초점을 맞춰요. 그 일환으로 eBPF 데이터 플레인은 kube-proxy를 eBPF 구현으로 대체해요. 대표적인 "사용자 경험" 기능은 NodePort로 트래픽이 들어올 때 클러스터 외부에서 온 트래픽의 소스 IP를 그대로 보존하는 것이에요. 이 덕분에 그 경로에서 서버 측 로그와 네트워크 정책이 훨씬 유용해져요.

기능 비교

eBPF 데이터 플레인에는 표준 Linux 데이터 플레인에 없는 기능이 있지만, 그 반대도 마찬가지예요.

요소 표준 Linux 데이터 플레인 eBPF 데이터 플레인
처리량 10GBit+ 기준 설계 40GBit+ 기준 설계
첫 패킷 지연 시간 낮음 (kube-proxy 서비스 지연이 더 큰 요인) 더 낮음
이후 패킷 지연 시간 낮음 더 낮음
클러스터 내부 소스 IP 보존 예 예
외부 소스 IP 보존 externalTrafficPolicy: Local을 쓸 때만 예
Direct Server Return 지원하지 않음 지원 (호환되는 기반 네트워크 필요)
커넥션 트래킹 Linux 커널 conntrack 테이블 (크기 조정 가능) BPF map (크기 조정 또는 자동 조정 가능)
정책 규칙 iptables 규칙으로 매핑 BPF 명령으로 매핑
정책 셀렉터 IP set으로 매핑 BPF map으로 매핑
Kubernetes 서비스 kube-proxy iptables 또는 IPVS 모드 BPF 프로그램과 map. kube-proxy 대체 기능이 데이터 플레인과 긴밀하게 결합되어 더 높은 성능을 제공
IPIP 지원 지원
VXLAN 지원 지원
WireGuard 지원 (IPv4 및 IPv6) 지원 (IPv4 및 IPv6)
기타 라우팅 지원 지원
서드파티 CNI 플러그인 지원 예 (호환되는 플러그인만) 예 (호환되는 플러그인만)
다른 iptables 규칙과의 호환성 예 (다른 규칙 위나 아래에 규칙을 작성할 수 있음) 부분적; 워크로드 트래픽은 iptables를 우회
호스트 엔드포인트 정책 지원 지원
Enterprise 버전 제공됨 제공됨
XDP DoS 보호 지원 지원
IPv6 지원 지원

아키텍처 개요

Calico의 eBPF 데이터 플레인은 각 Calico 인터페이스와 여러분의 데이터·터널 인터페이스의 tc 훅에 eBPF 프로그램을 붙여요. 덕분에 Calico는 워크로드 패킷을 일찍 발견하고, iptables와 커널이 원래 수행하는 다른 패킷 처리를 우회하는 패스트 패스로 처리할 수 있어요.

eBPF를 사용할 때 파드 간 네트워킹의 패킷 경로를 보여주는 다이어그램. 클라이언트 파드의 veth 인터페이스에 BPF 프로그램이 붙고, BPF map에서 conntrack 조회를 한 뒤 iptables를 우회해 두 번째 파드로 패킷을 바로 전달해요

로드 밸런싱과 패킷 파싱을 구현하는 로직은 미리 컴파일되어 있고, NAT 프론트엔드와 백엔드 정보를 저장하는 BPF map 집합에 의존해요. 하나의 map은 서비스의 메타데이터를 저장해 externalTrafficPolicy와 "sticky" 서비스를 지킬 수 있게 해 줘요. 두 번째 map은 백엔드 파드의 IP를 저장해요.

eBPF 모드에서 Calico는 정책을 최적화된 eBPF 바이트코드로 변환하고, 정책 셀렉터가 매칭하는 IP set을 BPF map에 저장해요.

패킷이 별도의 (생성된) 정책 프로그램으로 전달됨을 보여주는 BPF 프로그램 상세 그림

서비스 성능을 높이기 위해 Calico는 소켓 BPF 훅을 활용해 connect-time 로드 밸런싱도 수행해요. 프로그램이 Kubernetes 서비스로 연결을 시도하면 Calico가 그 연결 시도를 가로채고, 소켓이 백엔드 파드의 IP로 바로 연결되도록 구성해요. 이로써 서비스 연결에서 NAT 오버헤드를 전부 없애요.

소켓 connect 호출에 붙은 BPF 프로그램을 보여주는 다이어그램. connect 시점에 NAT를 수행해요

추가 리소스

더 알아보기 (Learn more)

eBPF 데이터 플레인의 가장 큰 실용적 장점은 클러스터 외부 트래픽의 소스 IP 보존이에요. 기능 비교 표를 살펴보고 여러분 환경의 우선순위(성능, 호환성, 지연 시간)에 맞는 데이터 플레인을 선택해 보세요.