- Bottlerocket은 컨테이너 호스팅에 맞춘 Linux 기반 OS로, Kubernetes 같은 오케스트레이터가 관리하는 클러스터 워커 노드의 기본 운영체제로 쓰임
- 범용 배포판의 패키지, 도구, 인터프리터를 덜어낸 최소 구성으로 운영 부담과 공격 표면을 줄이고, 환경별 variant로 필요한 조합만 제공함
- 셸과 패키지 관리자를 두지 않고, 권한 있는 host 컨테이너와 API로 시스템을 다루며 업데이트는 이미지와 파티션 전환으로 원자적으로 적용됨
- 설정은 API 기반으로 관리되어 버전 간 마이그레이션과 롤백이 가능하고, 업데이트 관리는 수동 또는 오케스트레이터별 도구로 처리할 수 있음
- 불변 루트 파일시스템, dm-verity, 제한적 SELinux, Rust와 일부 Golang 구현을 통해 시스템 변조와 검증되지 않은 코드 실행 경로를 줄임
컨테이너 클러스터용 기본 OS
- Bottlerocket은 컨테이너 호스팅에 최적화된 Linux 기반 운영체제임
- 무료 오픈소스 소프트웨어이며 GitHub에서 공개 개발됨
- 컨테이너가 실행되는 머신이나 인스턴스의 기본 운영체제로 설치됨
- Kubernetes 같은 컨테이너 오케스트레이터와 함께 동작하도록 설계되어, 클러스터 안의 컨테이너 수명주기 자동화를 지원함
- 클라우드와 데이터센터에서 실행 가능함
- 설계 목표는 Minimal, Safe Updates, Security Focused 세 가지로 정리됨
최소 구성과 환경별 variant
- 컨테이너 호스팅만 목표로 하므로 범용 Linux 배포판에 기본 포함되는 많은 패키지, 도구, 인터프리터, 의존성을 제거함
- 불필요한 소프트웨어가 줄어들어 운영 오버헤드와 보안 오버헤드도 함께 낮아짐
- 다양한 오케스트레이터, 플랫폼, 아키텍처 요구사항은 호환 조합별 빌드인 variant로 관리됨
- variant는 특정 환경에서 실행하는 데 필요한 요소를 조립한 형태임
- 적절한 variant를 선택하면 클러스터에 조인하는 데 추가 요소가 필요하지 않음
- Bottlerocket 자체에는 셸이 없음
- 시스템 접근은 셸이 있는 권한 있는 host 컨테이너를 통해 가능함
- host 컨테이너에서는 기반 OS를 탐색하고 API로 실행 중인 시스템 설정을 변경할 수 있음
이미지 기반 안전 업데이트
- Bottlerocket은 업데이트 가능하도록 설계됐지만 패키지 관리자를 포함하지 않음
- 업데이트는 특정 파티션으로 다운로드되는 이미지로 전달됨
- 업데이트 시 오케스트레이터가 노드를 drain한 뒤 Bottlerocket에 업데이트 적용과 재부팅을 지시함
- Bottlerocket은 파티션을 교체하고 새 버전으로 원자적으로 부팅함
- 시스템 설정은 API로 관리되어 Bottlerocket이 버전 간 설정 마이그레이션을 처리할 수 있음
- 업데이트 중 문제가 생기면 설정을 유지한 채 이전에 동작하던 버전으로 되돌릴 수 있음
- 업데이트 관리는 수동으로 하거나 오케스트레이터별 도구를 사용할 수 있음
보안 중심 설계
- 최소 구성과 업데이트 방식은 Bottlerocket의 보안 중심 설계를 뒷받침함
- variant가 이미지로 전달되므로 시스템을 변경해 보안 문제를 만들 수 있는 패키지 레지스트리나 관리자가 필요하지 않음
- Bottlerocket의 고유 기능은 Rust와 일부 Golang으로 작성됨
- 두 언어는 컴파일 언어이며 메모리 안전 문제에 대한 내장 보호를 제공함
- 모든 코드가 미리 컴파일된 이미지로 전달되어 셸과 인터프리터가 필요하지 않고, 검증되지 않은 코드 실행 경로가 줄어듦
- 루트 파일시스템은 불변임
- dm-verity가 루트 파일시스템의 투명한 무결성 검사를 제공함
- 기반 블록 디바이스 변경이 감지되면 커널이 재시작함
- 변경 가능한 파일시스템에는 항상 활성화되고 강제되는 제한적 SELinux 정책이 적용됨
- 컨테이너가 root로 실행되더라도 위험한 작업을 실행하지 못하도록 돕는 정책임