Part 6: eBPF 데이터플레인

지원 버전: Calico v3.29+ / Kubernetes 1.28+ / Linux Kernel 5.3+ 마지막 업데이트: 2026년 2월 23일

개요

Calico는 전통적인 iptables 기반 데이터플레인과 함께 현대적인 eBPF 기반 데이터플레인을 제공합니다. eBPF 모드는 더 높은 성능, 더 낮은 지연 시간, 그리고 kube-proxy 없이도 Kubernetes 서비스를 처리할 수 있는 능력을 제공합니다.

이 문서에서는 eBPF의 기본 개념부터 Calico에서의 활용, 마이그레이션 방법, 그리고 성능 최적화까지 심층적으로 다룹니다.

spinner

eBPF 기본 개념

eBPF란?

eBPF(extended Berkeley Packet Filter)는 Linux 커널 내에서 샌드박스된 프로그램을 실행할 수 있게 해주는 기술입니다. 커널을 수정하거나 모듈을 로드하지 않고도 커널의 동작을 확장할 수 있습니다.

spinner

eBPF 핵심 구성 요소

구성 요소
역할
설명

Verifier

안전성 검증

무한 루프, 메모리 위반 방지

JIT Compiler

성능 최적화

바이트코드를 네이티브 코드로 변환

BPF Maps

데이터 저장

커널-사용자 공간 데이터 공유

Helper Functions

커널 기능 접근

안전한 커널 API 호출

Hook Points

실행 지점

XDP, TC, Socket 등

eBPF Hook Points

spinner

Hook Point별 특징:

Hook Point
위치
성능
컨텍스트
사용 사례

XDP

드라이버 레벨

최고

제한적

DDoS 방어, 패킷 드롭

TC Ingress

네트워크 스택 진입

높음

풍부함

NAT, 정책, 라우팅

TC Egress

네트워크 스택 출구

높음

풍부함

NAT, 정책, 터널링

Socket Ops

소켓 레벨

보통

소켓 정보

연결 시간 LB

Cgroup

cgroup 레벨

보통

컨테이너 정보

컨테이너별 정책

Calico eBPF vs iptables 아키텍처

Calico 데이터플레인: iptables vs eBPF

iptables 모드 아키텍처

spinner

iptables 모드의 문제점:

  1. 선형 검색: 규칙이 많아질수록 성능 저하

  2. 규칙 증가: 서비스/엔드포인트 수에 비례하여 규칙 폭발

  3. 높은 지연: 체인 순회에 따른 오버헤드

  4. 복잡한 NAT: kube-proxy의 NAT 규칙 복잡성

eBPF 모드 아키텍처

spinner

eBPF 모드의 장점:

  1. O(1) 검색: BPF Map을 통한 해시 기반 검색

  2. 단일 처리 경로: 정책, NAT, 라우팅을 한 번에 처리

  3. 낮은 지연: 커널 내 최적화된 실행

  4. kube-proxy 대체: 내장 서비스 처리

성능 비교

상세 성능 비교표:

항목
iptables
eBPF
개선율

처리량

1.2M pps

2.0M pps

+67%

지연 시간

120µs

75µs

-38%

CPU 사용량 (1000 서비스)

70%

30%

-57%

메모리 사용량

높음 (규칙 수 비례)

낮음 (일정)

가변

규칙 확장성

O(n) 검색

O(1) 검색

크게 향상

연결 설정 시간

느림

빠름

-50%

Calico eBPF 프로그램 구조

주요 eBPF 프로그램

Calico는 다양한 eBPF 프로그램을 사용하여 네트워킹 기능을 구현합니다:

spinner

BPF Map 구조

Direct Server Return (DSR)

DSR은 로드밸런서 응답 트래픽이 로드밸런서를 거치지 않고 직접 클라이언트로 전송되는 방식입니다.

DSR 동작 원리

spinner

DSR 모드 비교

항목
Non-DSR
DSR

응답 경로

LB 노드 경유

직접 클라이언트로

LB 노드 부하

양방향 트래픽 처리

요청만 처리

지연 시간

높음 (추가 홉)

낮음

비대칭 라우팅

없음

있음

MTU 고려

불필요

터널링 오버헤드 고려

DSR 설정

Connect-Time Load Balancing

연결 시점에 로드밸런싱을 수행하여 성능을 최적화합니다.

동작 원리

spinner

Connect-Time LB의 장점:

  1. NAT 우회: 패킷 레벨 NAT 불필요

  2. conntrack 감소: 연결 추적 엔트리 감소

  3. 성능 향상: 패킷당 처리 오버헤드 제거

  4. 지연 감소: 직접 연결로 홉 감소

설정

XDP 가속

XDP(eXpress Data Path)는 네트워크 드라이버 레벨에서 패킷을 처리하여 최고의 성능을 제공합니다.

XDP 모드

모드
설명
성능
호환성

Native

드라이버 내장 XDP

최고

드라이버 지원 필요

Generic

커널 네트워크 스택

낮음

모든 드라이버

Offload

NIC 하드웨어

매우 높음

특정 NIC만

XDP 설정

XDP 지원 확인

eBPF 모드 요구사항

시스템 요구사항

요구사항
최소
권장
비고

Linux 커널

5.3

5.8+

5.10+ LTS 권장

아키텍처

x86_64 / ARM64

x86_64

ARM64 완전 지원

BTF 지원

필수

필수

CONFIG_DEBUG_INFO_BTF=y

BPF 파일시스템

필수

필수

/sys/fs/bpf 마운트

cgroup v2

권장

권장

Connect-time LB용

커널 설정 확인

지원 환경

iptables → eBPF 마이그레이션

마이그레이션 전 체크리스트

단계별 마이그레이션

Step 1: 환경 검증

Step 2: Calico 업그레이드 (필요시)

Step 3: eBPF 모드 활성화

Step 4: kube-proxy 비활성화

Step 5: 검증

롤백 절차

eBPF 디버깅

bpftool 사용

TC 필터 확인

Felix 로그 분석

Conntrack 확인

일반적인 문제 해결

kube-proxy 대체 모드

완전한 kube-proxy 대체

Calico eBPF는 kube-proxy의 모든 기능을 대체할 수 있습니다:

kube-proxy 기능
Calico eBPF 구현

ClusterIP 서비스

BPF NAT Map

NodePort 서비스

BPF + XDP

LoadBalancer 서비스

BPF + DSR

ExternalIP

BPF NAT

Session Affinity

BPF Affinity Map

IPVS 모드 기능

BPF Hash LB

서비스 처리 흐름

spinner

설정 예시

제한사항 및 주의사항

알려진 제한사항

제한사항
설명
대안

externalTrafficPolicy: Local

NodePort에서 제한적 지원

Tunnel 모드 사용

Host-networked Pods

일부 시나리오 제한

별도 정책 적용

IPv6 전용 클러스터

완전 지원 아님

Dual-stack 사용

특정 커널 버전

5.3 이전 버전 미지원

커널 업그레이드

Windows 노드

eBPF 미지원

iptables 모드

주의사항

성능 튜닝


참고 자료

이전: Part 5 - Network Policy 심화 | 다음: Part 7 - 운영 및 트러블슈팅arrow-up-right | 메인 페이지로 돌아가기

마지막 업데이트