[K8S]CILIUM XDP

진웅·2025년 4월 17일

CILIUM

목록 보기
1/14

XDP란 무엇인가?

  • XDP(eXpress Data Path)는 리눅스 커널에서 패킷을 매우 빠르게 처리하기 위한 패킷 처리 프레임워크 기술
  • 패킷이 커널의 네트워크 스택을 거치기 전에 처리할 수 있어 더 빠르다
  • 네트워크 드라이버 레벨에서 eBPF 프로그램을 실행.
  • Q. 그럼 NIC 카드가 중요하겠네? 카드 따라 안될수도 있고 , VM이면??
  • 아래는 패킷이 네트워크 카드(NIC)를 통해 들어와 애플리케이션에 도달하기까지의 과정을 설명한다.


리눅스 네트워크 스택 및 Cilium 개입 지점 분석

을 나타낸다. Cilium은 eBPF 기술을 사용하여 커널의 더 낮은 단계(XDP, TC)에서 패킷을 가로채 성능을 극대화한다.

단계별 처리 특성 요약

처리 지점작동 위치성능 (속도)주요 특징 및 역할
XDPNIC 드라이버 단계가장 빠름커널 스택 진입 전 패킷 처리. DDoS 방어 및 초고속 로드밸런싱에 최적이다.
TC (eBPF)커널 네트워크 진입 직후매우 빠름Cilium의 주력 동작 지점이다. L3/L4 보안 정책과 컨테이너 간 라우팅을 담당한다.
Netfilter커널 스택 내부보통 (기존 방식)iptables가 동작하는 지점이다. 규칙이 많아질수록 CPU 부하가 증가하고 속도가 느려진다.
Socket애플리케이션 접점가장 느림실제 사용자 프로세스가 데이터를 받는 단계이다. 커널 처리가 모두 끝난 상태이다.

핵심 결론

  1. 경로 단축: XDP와 TC는 패킷이 커널 깊숙이(Netfilter 이상) 들어가지 않게 중간에 가로채서 처리한다.
  2. 효율성: 하단(NIC와 가까운 쪽)에서 처리할수록 CPU 소모가 적고 응답 속도가 빠르다.
  3. Cilium의 강점: 기존 리눅스 방식이 Netfilter 단계에 의존할 때, Cilium은 XDP와 TC를 활용하여 네트워크 성능을 혁신적으로 끌어올린다.

Cilium XDP를 실제로 활성화했을 때의 성능 벤치마크 결과나, 특정 NIC 드라이버에서의 설정 방법이 궁금하신가요?


전통적인 네트워크 스택의 한계

일반적인 패킷 처리 과정

Network Card → Driver → Kernel Network Stack → Application
     ↓           ↓              ↓                    ↓
   하드웨어   인터럽트        프로토콜 처리         사용자 공간

 (출처 : SOSCON 2019 ‘Faster Packet Processing in Linux: XDP 이호연님)

문제점들

  • 다중 계층 통과: 여러 레이어를 거치면서 발생하는 오버헤드
  • 메모리 복사: 각 단계마다 패킷 데이터 복사
  • 컨텍스트 스위칭: 커널-사용자 공간 전환 비용
  • 인터럽트 오버헤드: 패킷마다 발생하는 CPU 인터럽트

XDP 접근 방식

XDP 패킷 처리 흐름

Network Card → XDP Program → Decision
     ↓              ↓            ↓
   하드웨어      eBPF 실행    즉시 결정


(출처 : SOSCON 2019 ‘Faster Packet Processing in Linux: XDP 이호연님)

XDP 액션 타입

XDP 프로그램은 패킷에 대해 다음 중 하나의 액션을 반환합니다:

// XDP 액션 타입들
enum xdp_action {
    XDP_ABORTED = 0,    // 오류로 인한 패킷 드롭
    XDP_DROP,           // 패킷 드롭
    XDP_PASS,           // 네트워크 스택으로 전달
    XDP_TX,             // 같은 인터페이스로 패킷 재전송
    XDP_REDIRECT,       // 다른 인터페이스로 리다이렉트
};

XDP 프로그램 예시

#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
SEC("xdp")
int xdp_drop_tcp(struct xdp_md *ctx)
{
    void *data_end = (void *)(long)ctx->data_end;
    void *data = (void *)(long)ctx->data;
        // 이더넷 헤더 파싱
    struct ethhdr *eth = data;
    if ((void *)(eth + 1) > data_end)
        return XDP_ABORTED;
        // IP 패킷인지 확인
    if (eth->h_proto != __constant_htons(ETH_P_IP))
        return XDP_PASS;
        // IP 헤더 파싱
    struct iphdr *ip = (void *)(eth + 1);
    if ((void *)(ip + 1) > data_end)
        return XDP_ABORTED;
       // TCP 패킷 드롭
    if (ip->protocol == IPPROTO_TCP)
        return XDP_DROP;
    return XDP_PASS;
}

Cilium에서의 XDP 활용

Cilium XDP 아키텍처

Pod Traffic → veth → XDP Program → Policy Decision
    ↓           ↓         ↓              ↓
  애플리케이션  네트워크   eBPF 실행    보안 정책 적용

주요 사용 사례

1. DDoS 방어

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: ddos-protection
spec:
  endpointSelector:
    matchLabels:
      app: web-server
  ingress:
  - fromEntities:
    - "world"
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        # XDP 레벨에서 즉시 처리
        l3_l4:
        - action: DENY
          source:
            cidr: "10.0.0.0/8"

2. 로드 밸런싱

// XDP 로드 밸런서 예시
SEC("xdp_lb")
int xdp_load_balancer(struct xdp_md *ctx)
{
    // 패킷 파싱
    if (parse_packet(ctx) < 0)
        return XDP_ABORTED;
        // 백엔드 서버 선택
    __u32 backend = select_backend();
        // NAT 수행
    if (do_nat(ctx, backend) < 0)
        return XDP_ABORTED;
        // 백엔드로 리다이렉트
    return bpf_redirect(backend_ifindex, 0);
}

3. 트래픽 필터링

# Cilium XDP 정책 확인
cilium bpf lb list
cilium bpf policy get <endpoint-id>
# XDP 프로그램 상태 확인
ip link show dev eth0
# xdpgeneric/id:123 <-- XDP 프로그램 로드됨

XDP 모드별 성능 비교

지원 모드

모드설명성능호환성
Native XDP하드웨어 드라이버에서 직접 실행최고드라이버 지원 필요
Offloaded XDPNIC 하드웨어에서 실행극한특수 하드웨어 필요
Generic XDP커널 네트워크 스택에서 실행보통모든 인터페이스

성능 벤치마크

# XDP 성능 테스트 결과 예시
Traditional Stack: 1.2 Mpps (Million packets per second)
Generic XDP:       2.5 Mpps (2배 향상)
Native XDP:        14.7 Mpps (12배 향상)
Offloaded XDP:     25+ Mpps (20배 이상 향상)

Cilium XDP 설정 및 관리

설치 시 XDP 활성화

# values.yaml
datapathMode: "veth"
bpf:
  preallocateMaps: true
  # XDP 관련 설정
  lbMapMax: 65536
  policyMapMax: 16384
  monitorAggregation: "medium"
# XDP 모드 설정
xdpMode: "native"  # native, generic, disabled

런타임 설정

# Cilium ConfigMap 수정
kubectl edit configmap cilium-config -n kube-system
# XDP 관련 설정 추가
data:
  enable-xdp-prefilter: "true"
  xdp-mode: "native"
  xdp-device: "eth0"

모니터링 및 디버깅

# XDP 프로그램 상태 확인
cilium status --verbose
# XDP 메트릭 확인
cilium metrics list | grep xdp
# BPF 맵 상태 확인
cilium bpf lb list
cilium bpf policy get <endpoint-id>
# 패킷 플로우 추적
cilium monitor --type=drop
cilium monitor --type=trace

실제 사용 시나리오

1. 마이크로서비스 간 통신 최적화

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: microservice-optimization
spec:
  endpointSelector:
    matchLabels:
      app: payment-service
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: order-service
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      # XDP에서 즉시 처리되는 정책

2. 클러스터 외부 트래픽 처리

# 외부 로드 밸런서 설정
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: frontend-lb
  annotations:
    service.cilium.io/xdp-offload: "true"
spec:
  type: LoadBalancer
  selector:
    app: frontend
  ports:
  - port: 80
    targetPort: 8080
EOF

3. 보안 정책 최적화

// 고성능 보안 필터링
SEC("xdp_security")
int security_filter(struct xdp_md *ctx)
{
    // IP 블랙리스트 체크 (해시맵 O(1) 조회)
    if (is_blacklisted_ip(src_ip))
        return XDP_DROP;
        // Rate limiting (per-IP)
    if (exceeds_rate_limit(src_ip))
        return XDP_DROP;
        // 정상 트래픽은 통과
    return XDP_PASS;
}

1. XDP 모드 선택

# 드라이버 XDP 지원 확인
ethtool -i eth0 | grep driver
# 지원되는 경우 native 모드 사용
# XDP 모드 설정
cilium config set xdp-mode native

2. 메모리 최적화

# BPF 맵 크기 조정
bpf:
  mapSizePolicy: "static"
  policyMapMax: 32768    # 정책 맵 크기
  lbMapMax: 131072       # 로드밸런서 맵 크기
  natMapMax: 524288      # NAT 맵 크기

3. CPU 바인딩

# XDP 처리를 특정 CPU 코어에 바인딩
echo 2 > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo 4 > /sys/class/net/eth0/queues/rx-1/rps_cpus

문제 해결 가이드

일반적인 문제들

XDP 프로그램 로드 실패

# 문제 진단
dmesg | grep -i xdp
journalctl -u cilium-agent | grep -i xdp
# 해결 방법
# 1. 커널 버전 확인 (4.8+ 필요)
uname -r
# 2. 드라이버 XDP 지원 확인
ethtool -k eth0 | grep xdp
# 3. Generic 모드로 폴백
cilium config set xdp-mode generic

성능 저하 문제

# 성능 모니터링
cilium metrics list | grep -E "(xdp|drop|redirect)"
# BPF 맵 사용률 확인
cilium bpf lb list | wc -l
cilium bpf nat list | wc -l
# 맵 크기 조정이 필요한 경우
kubectl edit configmap cilium-config -n kube-system

XDP 가치 요약

  • 극한 성능: 기존 대비 10-20배 성능 향상
  • 효율성: CPU 사용률 대폭 감소
  • 확장성: 대규모 클러스터에서도 선형적 성능
  • 유연성: 프로그래밍 가능한 네트워크 로직
profile
bytebliss

0개의 댓글