Firecracker 가상화 개요
Source: Dev.to
Firecracker는 Amazon Web Services (AWS)에서 만든 오픈 소스 가상화 기술로, AWS Lambda Functions as a Service (FaaS) 서버리스 제품의 기반이 됩니다.
Firecracker는 2018년에 오픈소스화되었습니다[0], 이를 통해 누구나 이 매우 빠르고 안정적인 시스템을 자신의 프로젝트와 사용 사례에 활용할 수 있게 되었습니다.
생태계는 놀라울 정도로 유연합니다: AWS Lambda를 구동하지만 설계 자체가 그 제한된 환경에만 국한되지 않습니다. AWS 규모의 워크로드부터 단일 VM을 실행하는 홈 랩까지 활용할 수 있습니다.
Firecracker High Level Overview
단일 Firecracker MicroVM 인스턴스를 설치하고 시작하는 방법을 설명하는 좋은 빠른 시작 문서[1]와 블로그가 많이 있습니다. 따라서 기본 요구 사항은 다음과 같습니다:
- Firecracker 바이너리
- 커널 이미지
- 루트 파일시스템 (rootfs)
- 네트워킹 설정 (선택 사항)
firecracker 프로그램을 실행하여 Firecracker VM을 시작하면, 시작한 Firecracker 프로세스를 통해 관리할 수 있는 단일 VM 인스턴스가 실행됩니다. 관리 명령은 Unix 소켓을 통한 HTTP API로 전송됩니다. VM이 더 이상 필요 없을 때는 정상적으로 종료해야 합니다.
여러 Firecracker 프로세스를 동시에 실행할 수 있으며, 이는 여러 VM을 의미합니다—아마도 AWS가 수백만 개의 Lambda 함수를 실행하는 방식일 것입니다.
Configuration
VM은 두 가지 주요 방법으로 구성할 수 있습니다:
구성 파일이 게스트 커널과 rootfs를 지정하더라도, 추가 API 요청을 위해 소켓을 계속 사용할 수 있습니다. 이중 접근 방식은 시스템의 유연성을 보여줍니다.
HTTP API는 공식 Go SDK[4]로 래핑되어 있어, 프로그래밍 방식으로 Firecracker 인스턴스를 관리할 수 있습니다. AWS는 동일한 API를 통해 Lambda 함수를 프로비저닝하고 제어하기 위해 내부적으로 이 SDK를 사용하고 있을 가능성이 높습니다.
Initialization
Firecracker는 여러 메커니즘을 통해 초기화할 수 있습니다:
- 직접 명령줄 실행
- Systemd 유닛 파일
jailer도구 (아래 참고)
첫 두 가지는 일반적인 Linux 패턴이며, 세 번째는 다중 테넌트 시나리오를 위한 추가 격리를 제공합니다.
Enhanced Isolation using Jailer
jailer 도구[5]는 각 Firecracker 프로세스를 자체 chroot 감옥 디렉터리 안에 격리합니다. 이는 다중 테넌트 환경에 적합한 보안 레이어를 추가합니다. 신뢰할 수 있는 코드를 실행하는 홈 랩에서는 jailer 사용이 선택 사항입니다.
Demonstration
아래는 미리 다운로드한 커널과 rootfs를 사용해 Firecracker 마이크로 VM을 시작하는 최소 Bash 스크립트 예시입니다.
#!/usr/bin/env bash
firecracker="/usr/bin/firecracker"
uuid=$(/usr/bin/uuidgen)
# Start Firecracker in the background, exposing a Unix socket
nohup "$firecracker" --api-sock "/tmp/$uuid.socket" &
echo "created firecracker process running on socket: /tmp/$uuid.socket"
# Configure the kernel
curl --unix-socket "/tmp/$uuid.socket" -i \
-X PUT 'http://localhost/boot-source' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"kernel_image_path": "/tmp/firecracker-test/hello-vmlinux.bin",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
}'
# Attach the root filesystem
curl --unix-socket "/tmp/$uuid.socket" -i \
-X PUT 'http://localhost/drives/rootfs' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"drive_id": "rootfs",
"path_on_host": "/tmp/firecracker-test/hello-rootfs.ext4",
"is_root_device": true,
"is_read_only": false
}'
# Start the VM instance
curl --unix-socket "/tmp/$uuid.socket" -i \
-X PUT 'http://localhost/actions' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"action_type": "InstanceStart"
}'
echo "Started VM instance."
스크립트를 실행하면 다음과 유사한 출력이 나타납니다:
created firecracker process running on socket: /tmp/b214c708-e506-455b-a98d-647939a0ef0d.socket
nohup: appending output to 'nohup.out'
HTTP/1.1 204
Server: Firecracker API
Connection: keep-alive
HTTP/1.1 204
Server: Firecracker API
Connection: keep-alive
HTTP/1.1 204
Server: Firecracker API
Connection: keep-alive
Started VM instance.
그 후 nohup.out 파일에 VM 부팅 로그가 표시됩니다:
[ ok ]
* Mounting persistent storage (pstore) filesystem ...
[ ok ]
Starting default runlevel
[ 1.088111] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x2879b124109, max_idle_ns: 440795245440 ns
Welcome to Alpine Linux 3.8
Kernel 4.14.55-84.37.amzn2.x86_64 on an x86_64 (ttyS0)
localhost login:
VM이 부팅되어 로그인 프롬프트가 나타납니다 (예제에서는 네트워킹이나 SSH 키를 설정하지 않았습니다). 이 스크립트는 HTTP API와 Unix 소켓을 이용해 Firecracker 마이크로 VM을 얼마나 간단히 시작할 수 있는지를 보여줍니다.
Firecracker Ecosystem Discrepancies Compared to Lambda
AWS re:Invent 강연(예: Julian Wood의 2022년 세션 A closer look at AWS Lambda (SVS404‑R) [video])에서는 Lambda 데이터 플레인을 동기식 및 비동기식 호출을 처리하는 서비스들의 집합으로 설명합니다.
동기식 서비스
- Frontend Invoke Service
- Counting Service
- Assignment Service
- Worker Hosts
- Placement Service
비동기식 서비스
- Poller Fleet
- Queue Manager
- State Manager
- Stream Tracker
- Leasing Service
이러한 관리 서비스들은 수백만, 수십억 개의 Lambda 호출을 오케스트레이션합니다. 이들은 오픈소스 Firecracker 프로젝트의 일부가 아니며, 경량 가상화 레이어에만 집중합니다. 따라서 Firecracker가 기본 VM 런타임을 제공하는 반면, Lambda 전용 제어 플레인은 AWS에 의해 독점적으로 유지됩니다.