Kubernetes Tools/Cilium

EP02. eBPF란 무엇인가? | Cilium의 핵심 엔진 이해하기

ygtoken 2025. 3. 21. 16:51
728x90

이 글에서는 Cilium의 핵심 기술인 eBPF(extended Berkeley Packet Filter)에 대해 알아보겠습니다. eBPF가 무엇인지, 기존 네트워킹 방식과 어떤 차이가 있는지, 그리고 이 기술이 네트워크, 보안, 모니터링 영역에 어떤 혁신을 가져왔는지 살펴보겠습니다. 기술적인 내용을 쉽게 이해할 수 있도록 실제 사례와 비유를 통해 설명하겠습니다.


📌 eBPF의 정의와 역사

eBPF는 리눅스 커널 내에서 샌드박스 환경으로 실행되는 프로그램을 작성할 수 있게 해주는 기술입니다. 커널을 수정하지 않고도 커널의 동작을 확장하고 프로그래밍할 수 있게 해주는 혁신적인 기술입니다.

eBPF의 시작과 발전

eBPF는 원래 네트워크 패킷 필터링을 위해 만들어진 BPF(Berkeley Packet Filter)에서 시작되었습니다. 이후 확장되어 현재의 eBPF(extended BPF)가 되었습니다.

# eBPF의 역사적 진화
# 1992년: BPF 최초 소개 (패킷 필터링용)
# 2014년: eBPF 소개 (Linux 커널 3.15)
# 2016년: XDP(eXpress Data Path) 추가
# 2017년: Cilium 최초 릴리스 (eBPF 기반 CNI)
# 2018년: BPF LSM(Linux Security Module) 도입
# 2020년: 대부분의 클라우드 네이티브 기업에서 eBPF 기술 채택 시작

# 위 타임라인에서 볼 수 있듯이, eBPF는 단순 패킷 필터에서 
# 네트워킹, 보안, 모니터링 등을 아우르는 강력한 기술로 발전했습니다.
# 특히 2017년 Cilium이 등장하면서 쿠버네티스 네트워킹에 혁신을 가져왔습니다.

eBPF의 핵심 개념

eBPF는 커널 내에서 안전하게 실행되는 미니 프로그램을 작성할 수 있게 해줍니다. 이 프로그램들은 다양한 '훅 포인트'에 연결되어 커널 이벤트를 가로채고 처리할 수 있습니다.

 

▶️ eBPF의 주요 특징

  1. 안전성: 검증기(Verifier)를 통해 프로그램이 안전한지 확인
  2. 성능: JIT(Just-In-Time) 컴파일러로 네이티브 성능 확보
  3. 다용도: 네트워킹, 보안, 모니터링, 추적 등 다양한 용도로 활용
  4. 동적 로드: 커널을 재컴파일하거나 재부팅 없이 프로그램 로드/언로드 가능

📌 eBPF 아키텍처 이해하기

eBPF의 내부 구조와 작동 방식을 이해하면 왜 이 기술이 혁신적인지 파악할 수 있습니다.

eBPF 아키텍쳐

 

eBPF 프로그램 실행 흐름

eBPF 프로그램이 어떻게 작성되고 실행되는지 살펴보겠습니다.

// eBPF 프로그램 예시 (C 언어로 작성)
// 이 예시는 XDP(eXpress Data Path) 프로그램으로, 패킷을 드롭하는 간단한 코드입니다.

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

SEC("xdp")
int xdp_drop_all(struct xdp_md *ctx) {
    // 모든 패킷을 드롭
    return XDP_DROP;
}

// 위 코드는 XDP 훅에 연결되어 모든 패킷을 드롭하는 단순한 예시입니다.
// SEC("xdp")는 이 프로그램이 XDP 훅에 연결될 것임을 나타냅니다.
// xdp_md 구조체는 패킷 메타데이터를 담고 있습니다.
// XDP_DROP은 패킷을 드롭하라는 반환 값입니다.

// 실제로는 더 복잡한 로직을 구현할 수 있으며,
// 헤더 파싱, 맵 조회, 패킷 수정 등의 작업이 가능합니다.

eBPF 프로그램의 실행 흐름은 다음과 같습니다:

  1. 작성: 개발자가 C 언어로 eBPF 프로그램 작성
  2. 컴파일: LLVM/Clang으로 eBPF 바이트코드로 컴파일
  3. 로딩: bpf() 시스템 콜을 통해 커널에 프로그램 로드
  4. 검증: 커널의 검증기가 프로그램의 안전성 검사
  5. JIT 컴파일: 바이트코드를 네이티브 머신 코드로 변환
  6. 연결: 특정 훅 포인트에 프로그램 연결
  7. 실행: 이벤트 발생 시 프로그램 실행

 

eBPF 맵(Maps)

eBPF 맵은 eBPF 프로그램과 사용자 공간 간의 데이터 공유를 위한 키-값 저장소입니다. 다양한 유형의 맵이 존재하며, 각각 다른 용도로 사용됩니다.

// eBPF 맵 정의 예시
struct {
    __uint(type, BPF_MAP_TYPE_HASH);  // 해시 맵 타입
    __uint(max_entries, 1024);        // 최대 항목 수
    __type(key, __u32);               // 키 타입 (32비트 정수)
    __type(value, struct flow_stats); // 값 타입 (사용자 정의 구조체)
} flow_map SEC(".maps");

// 이 맵 정의는 flow_map이라는 이름의 해시 맵을 생성합니다.
// 이 맵은 최대 1024개의 항목을 저장할 수 있으며,
// 32비트 정수를 키로, flow_stats 구조체를 값으로 사용합니다.
// SEC(".maps")는 이 맵이 eBPF 맵 섹션에 속함을 나타냅니다.

주요 맵 유형:

  • 해시(Hash): 키-값 조회에 최적화
  • 배열(Array): 인덱스 기반 빠른 조회
  • LRU 해시: 최근 사용 항목 유지
  • 링 버퍼(Ring Buffer): 이벤트 로깅 및 사용자 공간으로의 데이터 전송
  • 프로그램 맵: 다른 eBPF 프로그램에 대한 참조 저장

 

eBPF 맵 구조 및 유형

 

eBPF 훅 포인트

eBPF 프로그램은 다양한 커널 훅 포인트에 연결될 수 있습니다. 이러한 훅 포인트는 eBPF 프로그램이 언제 실행될지를 결정합니다.

주요 훅 포인트:

  1. XDP (eXpress Data Path): 네트워크 드라이버 수준에서 패킷 처리
  2. TC (Traffic Control): 네트워크 스택 내에서 패킷 처리
  3. 소켓: 소켓 수준에서 네트워크 오퍼레이션 처리
  4. kprobe/uprobe: 커널/사용자 함수 진입점에서 실행
  5. tracepoint: 커널 내 정의된 트레이스 포인트에서 실행
  6. perf 이벤트: 성능 이벤트 발생 시 실행

 

리눅스 커널의 eBPF 훅 포인트

 


📌 전통적인 iptables 방식과 eBPF 비교

쿠버네티스 네트워킹에서 전통적으로 사용되던 iptables 방식과 eBPF 방식의 차이점을 살펴보겠습니다.

eBPF vs iptables 비교

 

iptables의 한계

iptables는 리눅스 방화벽 툴로, 쿠버네티스의 초기 네트워킹과 서비스 구현에 사용되었습니다. 하지만 대규모 환경에서는 여러 한계점이 드러났습니다.

# 대규모 쿠버네티스 클러스터에서 iptables 규칙 증가 시뮬레이션
# 100개 서비스가 있는 클러스터를 가정

# iptables 규칙 수 계산
# 각 서비스당 평균 3개의 iptables 규칙 생성
# 추가로 각 엔드포인트(Pod)마다 1개의 규칙 생성
# 서비스당 평균 3개의 Pod가 있다고 가정

# 총 규칙 수 = (서비스 수 * 서비스당 규칙 수) + (서비스 수 * Pod 수 * Pod당 규칙 수)
# 총 규칙 수 = (100 * 3) + (100 * 3 * 1) = 300 + 300 = 600개

# 1000개 서비스로 확장 시
# 총 규칙 수 = (1000 * 3) + (1000 * 3 * 1) = 3,000 + 3,000 = 6,000개

# 규칙이 너무 많아지면 패킷 처리 시 선형적으로 규칙을 검사해야 하므로
# 처리 지연과 CPU 사용량 증가로 이어집니다.

 

iptables의 주요 한계점:

  1. 확장성 문제: 규칙 수가 증가할수록 성능 저하
  2. O(n) 복잡도: 규칙 검색이 선형적으로 이루어짐
  3. 원자적 업데이트: 규칙 변경 시 전체 규칙 재로드 필요
  4. 기능 제한: L3/L4 수준의 필터링만 효율적으로 지원

eBPF의 장점

eBPF는 이러한 한계를 극복하고 더 효율적인 네트워킹 솔루션을 제공합니다.

// eBPF를 사용한 효율적인 서비스 라우팅 예시 (개념적 코드)

// 연결 추적 맵 정의
struct {
    __uint(type, BPF_MAP_TYPE_LRU_HASH);
    __uint(max_entries, 1000000);
    __type(key, struct flow_key);
    __type(value, struct flow_value);
} conn_track SEC(".maps");

// 서비스 맵 정의
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 10000);
    __type(key, struct service_key);
    __type(value, struct service_value);
} services SEC(".maps");

// XDP 프로그램 (패킷 처리)
SEC("xdp")
int service_routing(struct xdp_md *ctx) {
    void *data_end = (void *)(long)ctx->data_end;
    void *data = (void *)(long)ctx->data;
    struct ethhdr *eth = data;
    
    // 헤더 검증 및 파싱
    // ...
    
    // 연결 추적 맵에서 기존 연결 확인
    struct flow_key key = { /* 헤더에서 추출한 정보 */ };
    struct flow_value *existing = bpf_map_lookup_elem(&conn_track, &key);
    
    if (existing) {
        // 기존 연결이 있으면 해당 백엔드로 라우팅
        // ...
        return XDP_TX;
    }
    
    // 새 연결이면 서비스 맵에서 서비스 정보 조회
    struct service_key svc_key = { /* 헤더에서 추출한 서비스 정보 */ };
    struct service_value *svc = bpf_map_lookup_elem(&services, &svc_key);
    
    if (!svc) {
        // 서비스가 없으면 기본 처리
        return XDP_PASS;
    }
    
    // 로드 밸런싱 알고리즘으로 백엔드 선택
    // ...
    
    // 패킷 수정하여 선택된 백엔드로 라우팅
    // ...
    
    // 연결 정보 저장
    struct flow_value new_flow = { /* 선택된 백엔드 정보 */ };
    bpf_map_update_elem(&conn_track, &key, &new_flow, BPF_ANY);
    
    return XDP_TX;
}

// 위 코드는 eBPF를 사용한 서비스 라우팅의 개념적 예시입니다.
// 실제 구현은 더 복잡하지만, 핵심 아이디어는 다음과 같습니다:
// 1. 해시 맵을 사용하여 O(1) 시간에 서비스 및 연결 정보 조회
// 2. 첫 패킷에만 로드 밸런싱 결정을 내리고, 이후 패킷은 캐시된 정보 사용
// 3. 커널 내에서 직접 처리하여 컨텍스트 전환 감소
// 4. 규칙 수에 관계없이 일정한 성능 유지

eBPF의 주요 장점:

  1. O(1) 복잡도: 해시 맵을 통한 상수 시간 조회
  2. 성능: 커널 내에서 직접 처리하여 컨텍스트 전환 최소화
  3. 세밀한 제어: 패킷 처리 경로의 여러 지점에서 프로그래밍 가능
  4. 유연한 업데이트: 개별 프로그램 또는 맵만 업데이트 가능
  5. L3-L7 지원: 애플리케이션 계층까지 인식 가능

성능 비교

eBPF와 iptables의 성능 차이를 간단히 비교해보겠습니다.

# 성능 비교를 위한 간단한 벤치마크 시나리오
# 1000개의 서비스가 있는 쿠버네티스 클러스터

# iptables 처리 경로
# 1. 패킷 수신
# 2. 넷필터 훅 호출
# 3. PREROUTING 체인 검사 (규칙 수에 비례하는 시간)
# 4. 라우팅 결정
# 5. FORWARD 또는 INPUT 체인 검사
# 6. (필요시) POSTROUTING 체인 검사
# 7. 패킷 전달

# eBPF(Cilium) 처리 경로
# 1. 패킷 수신
# 2. XDP 또는 TC 프로그램 실행
# 3. 해시 맵에서 O(1) 시간에 정책 및 라우팅 정보 조회
# 4. 패킷 처리 결정 (드롭, 수정, 전달 등)
# 5. 패킷 전달

# 대략적인 처리 시간 비교
# iptables: 100μs ~ 1ms (규칙 수에 따라 증가)
# eBPF: 1-10μs (규칙 수에 관계없이 일정)

# 실제 벤치마크에서는 서비스 수가 많은 클러스터에서
# eBPF가 iptables보다 최대 10-40배 빠른 처리 속도를 보여주었습니다.

📌 eBPF가 네트워크, 보안, 모니터링에 끼친 변화

eBPF 기술은 클라우드 네이티브 환경의 여러 영역에 혁신을 가져왔습니다. 각 영역별로 주요 변화를 살펴보겠습니다.

네트워킹 분야의 혁신

eBPF는 컨테이너 네트워킹에 획기적인 변화를 가져왔습니다.

▶️ 로드 밸런싱 향상

  • 커널 내에서 직접 로드 밸런싱 수행
  • 연결 추적 및 일관된 해싱으로 세션 유지
  • 기존 kube-proxy보다 훨씬 효율적인 서비스 구현

▶️ 네트워크 정책 구현

  • 복잡한 정책도 효율적으로 적용 가능
  • L3/L4뿐 아니라 L7 정책까지 지원
  • 정책 수에 관계없이 일정한 성능 유지

▶️ 멀티 클러스터 네트워킹

  • 클러스터 간 직접 라우팅 지원
  • 전통적인 오버레이 네트워크보다 낮은 오버헤드
  • 글로벌 서비스 개념 구현 용이

보안 분야의 혁신

eBPF는 컨테이너 보안에도 혁신적인 접근 방식을 제공합니다.

▶️ 런타임 보안

  • 시스템 콜 모니터링 및 제한
  • 권한 에스컬레이션 시도 탐지
  • 파일 액세스 패턴 모니터링
// 런타임 보안 모니터링을 위한 eBPF 프로그램 예시 (개념적 코드)

// 특정 시스템 콜 추적을 위한 tracepoint 프로그램
SEC("tracepoint/syscalls/sys_enter_execve")
int trace_execve(struct trace_event_raw_sys_enter *ctx) {
    // 실행되는 프로그램 정보 수집
    char comm[16];
    bpf_get_current_comm(&comm, sizeof(comm));
    
    // 프로세스 ID 가져오기
    u32 pid = bpf_get_current_pid_tgid() >> 32;
    
    // 실행 인자 가져오기
    const char __user *filename = (char *)ctx->args[0];
    char buf[256];
    bpf_probe_read_user_str(buf, sizeof(buf), filename);
    
    // 수상한 활동 감지 (예: 권한 상승 시도)
    if (is_suspicious_command(buf)) {
        // 이벤트 기록
        struct event e = {
            .pid = pid,
            .timestamp = bpf_ktime_get_ns(),
        };
        __builtin_memcpy(e.comm, comm, sizeof(comm));
        __builtin_memcpy(e.filename, buf, sizeof(buf));
        
        // 링 버퍼에 이벤트 전송 (사용자 공간 에이전트가 처리)
        bpf_ringbuf_output(&events, &e, sizeof(e), 0);
        
        // 필요시 액세스 차단 가능
        return -1; // EPERM으로 시스템 콜 실패 처리
    }
    
    return 0;
}

// 이 예시 코드는 execve 시스템 콜을 추적하여 수상한 명령 실행을 탐지합니다.
// 1. 현재 실행 중인 프로세스와 실행하려는 명령을 식별
// 2. 의심스러운 패턴이 감지되면 이벤트 로깅 및 차단
// 3. 사용자 공간 에이전트에 알림 전송

 

▶️ 네트워크 보안

  • 세밀한 액세스 제어 정책
  • 투명한 암호화 (WireGuard)
  • DDoS 및 서비스 공격 방어

▶️ 취약점 완화

  • 커널 취약점 노출 감소
  • 샌드박싱 및 격리 향상
  • 권한 분리 강화

모니터링 분야의 혁신

eBPF는 성능 모니터링과 관찰성에 새로운 차원을 열었습니다.

 

▶️ 네트워크 흐름 가시성

  • 마이크로서비스 간 통신 패턴 시각화
  • 연결 지연 시간 및 오류 추적
  • L7 프로토콜 내용 검사 및 분석

▶️ 리소스 사용 모니터링

  • CPU, 메모리, 디스크 I/O 세밀한 추적
  • 프로세스 및 컨테이너별 리소스 사용량
  • 핫스팟 및 병목 현상 식별

▶️ 분산 추적 통합

  • 마이크로서비스 호출 체인 추적
  • 지연 시간 분석 및 성능 병목 식별
  • 전체 시스템 성능 병목 시각화

📌 Cilium에서의 eBPF 활용

Cilium은 eBPF를 핵심 기술로 활용하여 쿠버네티스 네트워킹, 보안, 그리고 관찰성을 혁신적으로 개선합니다.

 

Cilium의 eBPF 활용 구조

 

Cilium의 eBPF 데이터 플레인

Cilium은 eBPF 프로그램을 사용하여 효율적인 데이터 플레인을 구현합니다.

# Cilium 아키텍처의 주요 구성 요소

# 1. Cilium Agent: 각 노드에서 실행
#    - eBPF 프로그램 생성 및 로드
#    - 네트워크 정책 구현
#    - 엔드포인트(Pod) 관리

# 2. eBPF 데이터 플레인
#    - XDP 프로그램: 패킷 필터링 및 초기 처리
#    - TC 프로그램: 상세 패킷 처리 및 라우팅
#    - 소켓 프로그램: 소켓 기반 로드 밸런싱

# 3. Cilium Operator: 클러스터 수준 컨트롤러
#    - IPAM 관리
#    - 멀티 클러스터 조정
#    - 클러스터 전체 리소스 관리

# 4. Hubble: 네트워크 흐름 모니터링
#    - eBPF 기반 관찰성
#    - 네트워크 흐름 시각화
#    - 성능 및 보안 모니터링

Cilium의 주요 eBPF 활용 사례

Cilium이 eBPF를 활용하는 주요 영역을 살펴보겠습니다.

 

eBPF 기반 L3-L7 정책 처리

 

▶️ 네트워크 정책 Cilium은 eBPF를 사용하여 쿠버네티스 네트워크 정책을 효율적으로 구현합니다.

# Cilium 네트워크 정책 예시
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "api-access"
spec:
  endpointSelector:
    matchLabels:
      app: backend-api
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:
        - method: "GET"
          path: "/api/v1/users"

# 이 정책은 'backend-api' 레이블이 있는 Pod로의 트래픽을 제한합니다.
# 'frontend' 레이블이 있는 Pod에서만 접근 가능하며,
# TCP 8080 포트로의 연결만 허용합니다.
# 더 세밀하게는 HTTP GET 메소드와 "/api/v1/users" 경로만 허용합니다.
# 이러한 L7 정책은 eBPF의 소켓 필터와 프로그램을 통해 구현됩니다.

 

 

 

 

▶️ 로드 밸런싱 Cilium은 kube-proxy를 대체하여 eBPF 기반 로드 밸런싱을 제공합니다.

 

kube-proxy vs Cilium eBPF 로드 밸런싱 비교

 

# 전통적인 kube-proxy vs Cilium eBPF 서비스 구현 비교

# kube-proxy (iptables 모드):
# 1. 서비스 IP로 패킷 수신
# 2. PREROUTING 체인에서 DNAT 규칙 적용
# 3. 연결 추적(conntrack) 테이블 업데이트
# 4. 백엔드 Pod로 패킷 라우팅
# 5. 응답 패킷은 역변환 필요

# Cilium eBPF:
# 1. 서비스 IP로 패킷 수신
# 2. eBPF 해시 맵에서 O(1) 시간에 서비스 정보 조회
# 3. 백엔드 선택 (해시 기반 로드 밸런싱)
# 4. 패킷 헤더 직접 수정 (DNAT 대체)
# 5. 소켓 리다이렉션 또는 직접 라우팅

# 장점:
# - 중간 NAT 단계 제거로 지연 시간 감소
# - conntrack 의존성 제거로 성능 향상
# - 서비스 수에 관계없이 일정한 성능
# - DSR(Direct Server Return)

 

📌 Cilium에서의 eBPF 활용

▶️ 투명한 암호화 Cilium은 eBPF와 WireGuard를 결합하여 Pod 간 통신을 투명하게 암호화합니다.

# Cilium 투명 암호화 설정 예시
# cilium cli를 사용한 설정

# 1. WireGuard 기반 암호화 활성화
$ cilium config set encrypt=true

# 2. 암호화 상태 확인
$ cilium status --verbose
# 출력에서 Encryption: Wireguard 확인

# 설정 후 모든 노드 간 Pod 트래픽은 자동으로 암호화됩니다.
# 애플리케이션 수정이나 추가 설정 없이 작동합니다.
# eBPF는 패킷을 WireGuard 인터페이스로 리다이렉션하고,
# 암호화/복호화 작업을 투명하게 처리합니다.

# 이는 기존 IPsec 방식보다 성능이 우수하며,
# eBPF로 필요한 트래픽만 선택적으로 암호화할 수 있습니다.

 

▶️ 관찰성 (Hubble) Cilium의 Hubble 컴포넌트는 eBPF를 사용하여 네트워크 흐름을 모니터링합니다.

# Hubble을 사용한 네트워크 흐름 모니터링 예시

# 1. 모든 HTTP 흐름 관찰
$ hubble observe --protocol http

# 2. 특정 Pod의 트래픽만 필터링
$ hubble observe --pod web

# 3. 거부된 트래픽 확인
$ hubble observe --verdict DROPPED

# 4. L7 HTTP 상태 코드로 필터링
$ hubble observe --protocol http --http-status 404

# Hubble은 eBPF 프로그램을 사용하여 패킷을 가로채고,
# 중요한 메타데이터를 추출하여 사용자 공간에 전달합니다.
# 이를 통해 네트워크 흐름, 지연 시간, 오류 등을
# 실시간으로 모니터링할 수 있습니다.

Cilium의 eBPF 활용 이점

Cilium이 eBPF를 활용하여 얻는 주요 이점을 요약하면:

  1. 성능 향상: 커널 내에서 직접 패킷 처리로 지연 시간 감소
  2. 확장성: 서비스 및 정책 수에 관계없이 일정한 성능
  3. 세밀한 제어: L3부터 L7까지 모든 수준의 네트워크 정책 지원
  4. 가시성: 모든 네트워크 통신에 대한 상세한 모니터링
  5. 보안 강화: ID 기반 보안 모델 및 암호화 지원

📌 Docker Desktop에서 eBPF 기능 확인하기

Docker Desktop 환경에서 eBPF 기능을 확인하고 간단한 예제를 실행해보겠습니다.

eBPF 지원 확인

먼저 시스템의 eBPF 지원 여부를 확인합니다.

# 커널 버전 확인
$ uname -r
# 출력: 5.10.76-linuxkit (또는 이와 유사한 버전)

# Docker Desktop은 기본적으로 eBPF를 지원하는 커널 버전을 사용합니다.
# 최소 요구사항: 리눅스 커널 4.9 이상 (Cilium의 모든 기능은 5.2+ 권장)

# BPF 파일 시스템 확인
$ mount | grep bpf
# 출력: bpffs on /sys/fs/bpf type bpf (rw,relatime)

# BPF 프로그램 확인
$ ls /sys/fs/bpf
# 여러 디렉토리와 파일이 보일 것입니다.

# 현재 로드된 eBPF 프로그램 확인
$ bpftool prog list
# Cilium이 설치된 경우 여러 프로그램이 표시됩니다.

# 위 명령들을 통해 eBPF 지원과 현재 상태를 확인할 수 있습니다.
# Docker Desktop 최신 버전에서는 일반적으로 eBPF가 지원됩니다.

간단한 eBPF 프로그램 실행

Docker Desktop에서 bcc 도구를 사용하여 간단한 eBPF 프로그램을 실행해보겠습니다.

# bcc 도구를 포함한 컨테이너 실행
$ docker run --rm -it --privileged \
  --pid=host \
  cloudflare/ebpf-tools

# 컨테이너 내에서 간단한 eBPF 프로그램 실행
# 예: execsnoop (프로세스 실행 모니터링)
$ /usr/share/bcc/tools/execsnoop
# 이제 새로운 프로세스가 실행될 때마다 출력을 확인할 수 있습니다.

# 다른 터미널에서 명령 실행
$ docker exec -it <container_id> ls -la

# execsnoop 출력에서 'ls -la' 명령이 표시되는 것을 확인할 수 있습니다.
# 이는 eBPF 프로그램이 커널에서 execve 시스템 콜을 가로채서
# 실행되는 모든 프로세스를 추적하고 있음을 보여줍니다.

Cilium eBPF 기능 확인

Docker Desktop에 Cilium이 설치된 경우, eBPF 맵과 프로그램을 확인할 수 있습니다.

# kubectl exec를 사용하여 Cilium Pod 내에서 명령 실행
$ kubectl -n kube-system exec -it ds/cilium -- cilium status

# Cilium 상태 및 eBPF 맵 정보 확인
$ kubectl -n kube-system exec -it ds/cilium -- cilium bpf maps

# 엔드포인트 리스트 확인
$ kubectl -n kube-system exec -it ds/cilium -- cilium endpoint list

# 특정 엔드포인트의 eBPF 정책 확인
$ kubectl -n kube-system exec -it ds/cilium -- cilium endpoint get <endpoint_id> -o json

# eBPF 기반 서비스 목록 확인
$ kubectl -n kube-system exec -it ds/cilium -- cilium service list

# 이러한 명령들을 통해 Cilium이 어떻게 eBPF를 사용하고 있는지 확인할 수 있습니다.
# 특히 맵과 프로그램의 구조 및 상태를 살펴볼 수 있습니다.

📌 실무에서의 eBPF 활용 사례

실제 환경에서 eBPF와 Cilium이 어떻게 활용되고 있는지 몇 가지 사례를 살펴보겠습니다.

대규모 쿠버네티스 클러스터

많은 기업들이 대규모 쿠버네티스 클러스터에서 eBPF 기반 네트워킹 솔루션을 채택하고 있습니다.

▶️ Netflix의 사례

  • 5,000+ 노드 클러스터에서 Cilium 사용
  • iptables 확장성 문제 해결
  • 마이크로서비스 간 보안 정책 강화

▶️ Capital One의 사례

  • 규제 환경에서의 보안 준수 요구사항 충족
  • 세밀한 네트워크 정책으로 PCI-DSS 준수
  • 네트워크 흐름 모니터링 강화

서비스 메시 대체/보완

eBPF는 전통적인 서비스 메시의 대안으로 부상하고 있습니다.

▶️ Isovalent(Cilium 개발사)의 접근

  • 사이드카 없는 서비스 메시 구현
  • L7 가시성 및 정책 제공
  • 기존 메시보다 오버헤드 감소

▶️ Datadog의 eBPF 활용

  • APM(Application Performance Monitoring)에 eBPF 활용
  • 사이드카 없이 서비스 간 통신 추적
  • 처리량 및 지연 시간 개선

보안 강화

많은 보안 솔루션이 eBPF를 활용하여 런타임 보안을 강화하고 있습니다.

▶️ Sysdig의 Falco

  • eBPF를 사용한 런타임 위협 탐지
  • 컨테이너 내부 활동 모니터링
  • 최소한의 오버헤드로 보안 위반 감지

▶️ Cilium Tetragon

  • eBPF 기반 보안 관찰성 도구
  • 시스템 콜 수준 모니터링
  • 런타임 보안 정책 시행

📌 Summary

이번 글에서는 eBPF 기술의 기본 개념부터 Cilium에서의 활용까지 살펴보았습니다. 주요 내용을 요약하면:

  • eBPF는 리눅스 커널 내에서 안전하게 실행되는 프로그램을 작성할 수 있게 해주는 혁신적인 기술입니다.
  • 전통적인 iptables 방식은 확장성 문제와 성능 제한이 있었지만, eBPF는 이를 해결합니다.
  • eBPF는 O(1) 복잡도의 해시 맵을 사용하여 규칙 수에 관계없이 일정한 성능을 제공합니다.
  • eBPF는 네트워킹, 보안, 모니터링 영역에서 혁신적인 변화를 가져왔습니다.
  • Cilium은 eBPF를 핵심 기술로 활용하여 쿠버네티스 네트워킹을 개선합니다.
  • Cilium의 주요 eBPF 활용 사례는 네트워크 정책, 로드 밸런싱, 암호화, 관찰성입니다.
  • 실무에서는 대규모 클러스터, 서비스 메시, 보안 강화 등에 eBPF가 활용되고 있습니다.
728x90