Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- gitlab ci
- Crawling
- helm
- DevOps
- CD
- CI/CD
- 모의해킹
- 스크레이핑
- ECR
- scraping
- Kubernetes
- gitlab cd
- CI
- Prometheus
- 웹 취약점
- Resource
- 웹 해킹
- sonarqube
- deploy
- Monitoring
- linkerd
- GitLab
- opentelemetry
- eks
- Jenkins
- Grafana
- Service Mesh
- argocd
- 크롤링
- docker
Archives
- Today
- Total
ㅡ.ㅡ
[ETC] eBPF 본문
Kernel
시스템의 가장 낮은 수준에서 동작하는 운영체제의 핵심 요소로 소프트웨어와 하드웨어 간의 상호 작용을 관리하고 조정하는 중요한 역할을 담당한다.
- 프로세스 관리(cpu) : 프로세스 생성, 실행, 중지 및 프로세스 간 통신 등
- 메모리 관리 : 메모리 할당 및 해제, 메모리 보호, 가상 메모리 관리 등의 기능을 담당한다.
- 장치 드라이버와의 통신 : 하드웨어 장치 드라이버와의 통신을 관리하여 하드웨어와 소프트웨어 간의 상호 작용이 가능하다.
- 시스템 호출과 인터페이스 제공 : 사용자 프로그램이 하드웨어 자원을 안전하고 효율적으로 사용할 수 있도록 시스템 호출 인터페이스를 제공
- 보안과 권한 관리 : 커널은 시스템의 보안을 유지하며, 사용자 권한을 관리합니다. 이는 사용자가 시스템 자원에 접근하거나 변경할 때 필요한 권한을 확인하는 과정을 포함합니다.
BPF (Berkeley Packet Filter)와 eBPF 차이
BPF(Berkeley Packet Filter)
네트워크 트래픽 처리 및 모니터링에 사용되는 기술로 커널 레벨에서 bytecode 형태로 동작하는 경령화된 가상 머신으로 커널 레벨에서 사용자가 원하는 동작을 수행하여 성능이 좋고 오버헤드가 감소한다는 장점이 있지만 네트워크 트래픽 처리 및 모니터링과 같은 제한적인 용도로만 가능하다.
eBPF (extended Berkeley Packet Filter)
eBPF는 BPF의 기본적인 패킷 필터링 기능을 넘어 시스템 모니터링, 보안 강화, 로깅 등 다양한 커널 기능을 수행할 수 있으며 사용자 공간(User Space)에서 C언어와 유사한 구문의 프로그래밍 코드를 사용하여 커널을 새로 빌드하지 않고도 커널 코드를 안전하게 수행할 수 있다
- 레지스터 크기: cBPF는 32비트 레지스터를 사용하는 반면 eBPF는 64비트 레지스터를 사용하여 큰 데이터와 복잡한 연산을 처리할 수 있다.
- 레지스터의 수: cBPF는 32비트 레지스터를 두 개(accumulator, index) 제공하는 반면 eBPF는 10개의 64비트 레지스터를 제공합니다. 이 중 6개는 함수 인자로 사용되며, 나머지 4개는 함수 호출 시 사용된다.
- 프로그램 크기: cBPF는 프로그램 크기는 최대 4096 바이트(4KB)로 제힌이 있었으나, eBPF는 이러한 제한을 대폭 완화하여 훨씬 더 긴 프로그램을 지원하며, 이를 통해 더 복잡한 로직을 구현할 수 있다.
- 스택과 맵의 도입: eBPF는 별도의 스택과 데이터를 저장하고 공유하기 위한 맵을 제공하여 프로그램 간의 데이터를 공유하여 효율적인 데이터 관리가 가능하다.
- 커널과의 상호작용: eBPF는 사용자 공간과 커널 공간 사이의 상호작용을 효율적으로 관리하기 위한 헬퍼 함수를 제공한다.
eBPF의 동작 방식
eBPF 프로그램 작성 및 컴파일(eBPF Hook)
eBPF 프로그램은 C, Python, Go와 같은 고수준 언어를 통해 이벤트를 감지할 Hook을 작성 후 LLVM/Clang와 같은 컴파일러를 사용하여 eBPF 바이트코드로 변환된다.
- kprobes: 커널 함수의 시작 부분에 프로그램을 연결합니다. 이를 통해 함수 호출 시 정보를 수집하거나 수정할 수 있습니다.
- uprobes: 사용자 공간의 프로그램에서 특정 함수 또는 지점에 프로그램을 연결합니다. 이는 kprobes와 유사하지만, 사용자 공간의 프로세스에 적용됩니다.
- tracepoints: 커널에서 미리 정의된 이벤트에 프로그램을 연결합니다. 이러한 트레이스포인트는 커널 개발자에 의해 정의되며, 시스템의 특정 작업에 대한 세부적인 모니터링을 가능하게 합니다.
- XDP (eXpress Data Path): 네트워크 패킷이 네트워크 인터페이스를 통과할 때 실행되는 프로그램입니다. XDP를 사용하면 매우 빠른 속도로 패킷 처리 및 필터링이 가능합니다.
- Socket Filter: 소켓 수준에서 네트워크 패킷을 필터링합니다. 이를 통해 사용자 공간에서 네트워크 데이터를 분석하거나 수정할 수 있습니다.
- cgroup BPF: 컨트롤 그룹(cgroup)에 연결된 eBPF 프로그램으로, 시스템 리소스 사용을 모니터링하거나 제한하는 데 사용됩니다.
- TC (Traffic Control): 네트워크 인터페이스의 트래픽 컨트롤러에 eBPF 프로그램을 연결하여, 네트워크 트래픽을 조절하거나 분석할 수 있습니다.
커널에 로드 및 검증
1. Verification
- 안전성 검사: 검증기는 eBPF 프로그램이 커널의 안정성을 위협하지 않는지 확인합니다. 이는 프로그램이 잘못된 메모리 접근을 시도하거나, 커널에 해를 끼칠 수 있는 다른 위험한 동작을 하는지 검사합니다.
- 필터링 규칙 확인: 네트워크 필터링과 같은 목적으로 사용되는 eBPF 프로그램의 경우, 검증 과정에서 해당 규칙이 올바른지 확인합니다.
- 루프 및 복잡성 제한: eBPF 프로그램은 무한 루프에 빠지지 않도록 설계되어야 합니다. 검증기는 프로그램이 끝나지 않는 루프에 빠지지 않도록 검사합니다.
- 타입 안정성: 메모리 타입 안정성을 보장하기 위해, 변수 타입과 메모리 접근이 올바르게 사용되는지 확인합니다.
2.JIT(Just-In-Time) Compilation
검증을 통과한 eBPF 프로그램은 선택적으로 JIT 컴파일러에 의해 기계어로 번역되어 실행하게된다.
- 성능 최적화: JIT 컴파일러는 eBPF 바이트코드를 머신 코드로 변환하여, 커널에서 더 빠르게 실행할 수 있게 합니다. 이는 바이트코드를 직접 해석하여 실행하는 것보다 훨씬 효율적입니다.
- 플랫폼 특화 최적화: 다양한 하드웨어 아키텍처에 대해 최적화된 머신 코드를 생성합니다. 이는 하드웨어의 특성을 최대한 활용하여 성능을 향상시키는 데 도움이 됩니다.
- 실행 시간 단축: JIT 컴파일을 통해 생성된 머신 코드는 실행 시간을 줄여주며, 이는 특히 고성능 네트워킹이나 시스템 모니터링 작업에 중요합니다.
Reference
'ETC' 카테고리의 다른 글
[K8S Event] kubernetes-event-exporter (0) | 2023.10.22 |
---|---|
[K8S Resource] ClusterAutoScaler (0) | 2023.10.22 |
[K8S Resource] Goldilocks (0) | 2023.10.22 |
[K8S Resource] Descheduler (0) | 2023.10.22 |
[AWS] EFS (0) | 2021.10.21 |