Bottlerocket
专为容器运行设计的 Linux 操作系统,以最小化占用实现安全性和可运维性
概述
Bottlerocket 是 AWS 开发的容器工作负载专用 Linux 操作系统。它从通用 Linux 发行版中彻底移除了容器运行不需要的组件 (包管理器、Shell 登录、通用库等),将攻击面最小化。配备不可变根文件系统、API 驱动的配置管理和自动更新机制,大幅降低大规模容器集群的运维负担。
不可变文件系统与安全模型
Bottlerocket 的根文件系统以 dm-verity 验证完整性的只读分区形式挂载。从结构上防止 OS 二进制文件和库在运行时被篡改,即使发生容器逃逸,也无法改写宿主 OS 的文件。SSH 守护进程默认禁用,排除了对宿主的直接登录。需要调试时,可临时启用管理容器 (admin container) 并通过 SSM Session Manager 访问。SELinux 默认启用,在容器运行时和宿主 OS 之间应用强制访问控制。内核锁定功能还限制了内核模块的动态加载。通过这些多层防御,在 OS 层面自动满足 CIS 基准和 DISA STIG 的大部分要求。与通用 Linux 相比,已安装的软件包数量大幅减少,因此受 CVE 影响的概率本身就较低,补丁应用的频率和紧迫性也相应降低。
API 驱动的配置管理与更新
Bottlerocket 的配置变更不像传统 Linux 那样直接编辑配置文件,而是通过 API 服务器进行。通过 apiclient 命令或 HTTP API,以结构化数据的形式设置网络配置、DNS、NTP、容器运行时参数等。配置以 TOML 格式序列化,经过验证后才会应用,从而防止因语法错误导致的系统故障。OS 更新采用 A/B 分区方式实施。将新版本写入与当前运行分区不同的分区,重启时进行切换。如果更新失败,会自动回滚到原始分区,因此更新导致故障的风险极低。在 EKS 环境中,Bottlerocket Update Operator 会依次更新集群内的节点,自动化 Pod 驱逐 (drain) 和节点重启。更新的应用是整个镜像的替换,不进行单独的软件包更新。
在 ECS 和 EKS 中运行与变体选择
Bottlerocket 以针对每种编排器优化的变体形式提供。面向 EKS 的 aws-k8s-1.29、aws-k8s-1.30 等变体内置了 kubelet 和 containerd,可作为 EKS 的托管节点组或自管理节点组启动。面向 ECS 的 aws-ecs-2 变体内置了 ECS 代理,作为 ECS 集群的容器实例运行。变体的选择由启动时的 AMI 决定,之后无法更改。在 EKS 托管节点组中使用时,需在启动模板中指定 Bottlerocket AMI,并在用户数据中以 TOML 格式编写配置。需要注意这与 Amazon Linux 2 的 bash 脚本格式不同。针对 GPU 工作负载还提供了内置 NVIDIA 驱动的变体。AMI 由 AWS 定期更新,可从 SSM Parameter Store 获取最新的 AMI ID,在 Terraform 或 CloudFormation 中动态引用。