一般性问题

什么是 Bottlerocket?

Bottlerocket 是专为运行容器而打造的基于 Linux 的新开源操作系统。使用 Bottlerocket,您可以通过自动化容器基础设施的更新来提高容器化部署的可用性并降低运营成本。Bottlerocket 只包含运行容器所需的基本软件,从而提高资源使用率,减少安全攻击面,并降低管理开销。它还集成了容器编排器(如 Amazon EKS 和 Amazon ECS)以进一步减少管理和运营开销,同时更新集群中的容器主机。 

使用 Bottlerocket 有哪些好处?

a) 更高的正常运行时间,更低的运营成本和更低的管理复杂性:通过只包含运行容器所需的组件,与通用操作系统相比,Bottlerocket 具有更低的资源占用量、启动时间和安全攻击面。更小的内存占用有助于降低成本,因为存储、计算和网络资源的使用减少了。使用容器原语(而不是软件包管理器)运行软件可降低管理开销。

b) 通过自动的操作系统更新提高了安全性:对 Bottlerocket 的更新作为一个单元应用,可以在需要时回滚,这就消除了可能会使系统处于不可用状态的“拙劣”更新的风险。更新失败在通用操作系统中很常见,因为在逐包更新过程中会出现不可恢复的故障。在 Bottlerocket 中,安全更新可以在启用后立即以最小干扰方式自动应用,并在出现故障时进行回滚。

c) 开源和普遍可用性:开放开发模型可使客户、合作伙伴和所有感兴趣方对 Bottlerocket 进行代码和设计更改。

d) Premium Support:在 Amazon EC2 上使用 AWS 提供的 Bottlerocket 版本涵盖在相同的 AWS 支持计划下,该计划还涵盖 Amazon EC2、Amazon EKS、Amazon ECR 等 AWS 服务。

Bottlerocket 与 Amazon Linux 有何不同?

Amazon Linux 是一种通用型操作系统,可运行打包在 RPM 软件包管理器或容器中的各种应用程序。Amazon Linux 经过了优化,可以使用 yum、ssh、tcpdump、netconf 等传统工具,根据工作负载的需要配置每个实例。另一方面,Bottlerocket 专为运行容器而构建,它使您可以通过自动化方式统一管理大量容器主机。具体来说,Bottlerocket 与 Amazon Linux 的不同之处有以下几点:

  • Bottlerocket 没有软件包管理器,软件只能作为容器运行。对 Bottlerocket 的更新可在一个原子步骤中应用,并且可回滚,从而减少了更新错误。
  • 管理 Bottlerocket 主机的主要机制是使用 Amazon EKS 之类的容器编排器。与 Amazon Linux 不同的是,登录到单个 Bottlerocket 实例是一种不常见的操作,可用于高级调试和故障排除。

基于 Amazon Linux 2 的经过 EKS 和 ECS 优化的 AMI 是否将继续得到支持?

基于 Amazon Linux 且得到 EKS 优化的当前 AMI 将得到支持,并且会继续接收安全更新。请参阅 EKS 优化的 Amazon Linux 2 AMIECS 优化的 AMI 以了解有关支持生命周期的详细信息。 

Bottlerocket 的核心组件是什么?

Bottlerocket 的主要组件包括:

  • 包括 Linux 内核 (5.4)、软件系统并在容器运行时进行容器化的最小操作系统。
  • 在一个步骤中应用并回滚操作系统更新的原子更新机制。 
  • 与 Amazon EKS 等容器编排器的集成,以管理和编排更新。
  • 可选择性运行以进行高级故障排除和调试的“管理员容器”。

如何将更新应用于 Bottlerocket?

Bottlerocket 更新在可用时可自动从预配置的 AWS 存储库中下载。需要重新启动 Bottlerocket 来应用更新,可以手动启动或由编排器(如 Amazon EKS)管理。您需要根据应用程序对重新启动的容忍度和您的运营需求来选择适当的机制来处理重新重新启动。如果您的应用程序是无状态的,并且对重新启动具有弹性,则可以在下载更新后立即执行重新启动。如果您正在容器中运行有状态的传统工作负载(例如数据库、长时间运行的业务线应用程序等),而这些容器对重新启动无弹性,则您需要确保在重新启动之前保持状态。

可以通过编排器(如 Amazon EKS)管理 Bottlerocket 的重新启动,方法是跨主机清空和重新启动容器,以便在集群中滚动更新,从而减少中断。如果发生故障,还可以通过受支持的编排器或手动操作安全地回滚对 Bottlerocket 的更新。

使用 Kubernetes 部署和操作 Bottlerocket 的步骤是什么?

您可以使用以下步骤部署和服务 Bottlerocket:

步骤 1:您可以在虚拟机中以与任何其他操作系统相同的方式部署 Bottlerocket。在 AWS 上,您可以从控制器、API、CLI 中将 Bottlerocket 部署到 EC2 实例。您需要通过用户数据提供配置详细信息,以便每个 Bottlerocket 实例注册到 Amazon EKS 集群中。

步骤 2:要使用编排器操作 Bottlerocket,您需要部署一个集成组件到您的集群中。集成组件使编排器能够以最小干扰的方式启动重新启动、回滚更新和替换容器,从而进行进行滚动升级。

请参阅 Bottlerocket 文档,了解在 Amazon EKS 集群中部署和使用“Bottlerocket 更新运算符”的步骤。

我能否在不使用容器编排器的情况下使用 Bottlerocket?

是,在没有编排器的情况下,您可以将 Bottlerocket 作为一个独立的操作系统在您的手提电脑或服务器上运行,以用于开发和测试使用案例。您可以使用“管理员容器”中的实用程序来管理和更新 Bottlerocket。 

Bottlerocket 支持哪些计算平台和 EC2 实例类型?

AWS 的 Bottlerocket 版本在 HVM 和 EC2 裸机实例系列中受支持,但 P、G、F 和 INF 实例类型除外。Bottlerocket 至少需要 1vCPU 和 512MB 的 RAM。Bottlerocket 不支持 PV 实例类型。

如何开始在 AWS 上使用 Bottlerocket?

AWS 为 Bottlerocket 提供 Amazon Machine Image (AMI),您可以用它通过 AWS 控制台、CLI 和开发工具包在受支持的 EC2 实例类型上运行。AWS 将提供预先配置的 Bottlerocket 版本,以与 EKS 和 ECS 结合使用。您可以使用 EKS 在中断最少的情况下更新和管理操作系统,而不必登录到每个操作系统实例。Kubernetes 的 Bottlerocket 运算符可使您执行操作系统管理操作等活动,例如开始重新启动和在中断最少的情况下回滚更新。

如何在 Bottlerocket 上运行软件?

您可以使用容器编排器在正在运行的 Bottlerocket 实例上运行容器化应用程序,包括第三方 ISV 软件。您还可以在镜像自定义期间将您的软件和初创公司脚本包含在 Bottlerocket 中。有关详细信息,请参阅 Bottlerocket 文档

Bottlerocket 如何定价?

AWS 提供的 Bottlerocket 版本在所有受支持的平台上都可以免费使用。标准 Amazon EC2 适用于运行 Amazon EC2 实例。

您有公有路线图吗?

是的,我们有!

版本控制

Bottlerocket 版本如何进行版本控制?

AWS 提供的 Bottlerocket 版本遵照“major.minor.patch”语义版本控制方案。Bottlerocket 的次要版本将在一年内多次发布,包括对新的 EC2 平台的支持、对新的编排器代理的支持以及对开放源码组件的更新等更改。版本方案将指示更新是否包含突破性更改。

支持

AWS 为 Bottlerocket 提供哪种支持?

AWS 提供的 Bottlerocket 版本将收到安全更新、漏洞修复,并涵盖在 AWS 支持计划中。某个给定版本的支持期将取决于正在使用的容器编排器的版本。当相应的编排器版本被弃用时,Bottlerocket 版本将被弃用。例如,我们不再支持 aws-k8s-1.15,它是 Kubernetes 1.15 的 Bottlerocket 版本。这与 Kubernetes 1.15 不再接受上游支持一致。我们建议客户使用集群支持的更新版本替换 aws-k8s-1.15 节点。

此外,对 Bottlerocket 的社群支持在 GitHub 上提供,您可以在其中发布问题、功能请求和报告漏洞。关于 CVE 发布和修复的详细信息将发布在 Bottlerocket 更改日志中。

更新

Bottlerocket 提供哪些类型的更新?

AWS 为 Bottlerocket 提供预先测试的更新,这些更新在一个步骤中应用。这些更新还会在一个步骤中回滚到已知的良好状态。因此,使用 Bottlerocket 不会出现“拙劣的”更新,这些更新可能会导致系统无法使用,因为它们的状态不一致,需要手动修复。由于单步骤原子更新,复杂性更低,从而减少了更新故障。

如何将更新应用于 Bottlerocket?

AWS 提供的 Bottlerocket 版本的更新在可用时可自动从预配置的 AWS 存储库中下载。需要重新启动 Bottlerocket 来应用更新,可以手动启动或由编排器(如 Amazon EKS)管理。您需要根据应用程序对重新启动的容忍度和您的运营需求来选择适当的机制来处理重新重新启动。如果您的应用程序是无状态的,并且对重新启动具有弹性,则可以在下载更新后立即执行重新启动。如果您正在容器中运行有状态的传统工作负载(例如数据库、长时间运行的业务线应用程序等),而这些容器对重新启动无弹性,则您需要确保在重新启动之前保持状态。

可以通过编排器(如 Amazon EKS)管理 Bottlerocket 的重新启动,从而跨主机清空和重新启动容器,以便在集群中滚动更新,从而减少中断。默认情况下,Bottlerocket 将在启动时自动更新到最新的安全版本。如果发生故障,还可以通过受支持的编排器或手动操作安全地回滚对 Bottlerocket 的更新。

Bottlerocket 如何帮助确保更新带来的干扰最小?

与 Amazon EKS 等编排器的集成可帮助以最小的干扰对 Bottlerocket 进行更新。在更新过程中,编排器会清空正在更新的主机上的容器,并将它们放置在集群中的其他空闲主机上。如果更新失败,编排器还会回滚到主机,回滚到 Bottlerocket 的之前版本。

兼容性和迁移

我可以在 Bottlerocket 上的容器中运行哪些容器镜像?

Bottlerocket 可以运行满足 OCI 镜像格式规格和 Docker 镜像的所有容器镜像。

我是否能够将运行在 Amazon Linux 2 上的容器迁移到 Bottlerocket?

是的,您可以跨 Amazon Linux 2 和 Bottlerocket 移动容器,无需进行修改。

我什么时候不应该使用 Bottlerocket?

如果运行容器的操作工作流包括使用 yum 在主机操作系统上安装软件,直接 ssh 到实例中,单独自定义每个实例,或者运行未被容器化的第三方 ISV 软件(例如,用于日志记录和监控的代理),Amazon Linux 2 可能是更好的选择。Bottlerocket 经过优化,可运行和管理大型容器化部署,并且不容易允许许多这样的活动。

故障排除和安全性

我如何使用 Bottlerocket 调试问题?

您可以使用 Bottlerocket 的 API 运行“管理员容器”(通过用户数据或 AWS Systems Manager 调用),然后使用 SSH 登录以获得更高的权限进行高级调试和故障排除。AWS 提供了管理员容器,使您能够安装和使用 sosreport、traceroute、strace、tcpdump 之类的调试工具。登录到单个 Bottlerocket 实例的行为是一种不常见的操作,可用于高级调试和故障排除。

什么是管理员容器?

管理员容器是一种 Amazon Linux 容器镜像,包含用于故障排除和调试 Bottlerocket 的实用程序,并且能以更高的权限运行。可以通过用户数据或 Bottlerocket API 启动工具容器的运行。

Bottlerocket 提供哪些容器隔离和安全性功能?

Bottlerocket 支持自动安全更新,并通过仅包含托管容器必需的软件来减少遭受安全攻击的机会。Bottlerocket 使用容器控制组 (cgroups) 和内核命名空间来进行容器之间的隔离。它还在强制模式和 seccomp 下带有安全增强型 Linux (SELinux)。内核中的 eBPF 通过提供用于跟踪 I/O、文件系统运维、CPU 使用、入侵检测和故障排除的低开销跟踪框架,减少了很多低级系统运维对内核模块的需要。Bottlerocket 与 Linux 的一项内核功能 device-mapper-verity (dm-verity) 结合使用,该功能提供完整性检查,以帮助防止可保留根权限的 rootkit。

开源和商标

Bottlerocket 的开源许可是什么?

Bottlerocket 代码在 Apache 2.0 OR MIT 下获得许可。Amazon 在 Rust 中编写 Bottlerocket,因此我们选择了轻松适合该社群的许可证。第三方代码(例如 Linux 内核)的底层仍需遵照其原始许可证。

我如何查看并贡献对 Bottlerocket 的源代码更改?

Bottlerocket 作为托管在 GitHub 上的开源项目发布。设计文档、代码、构建工具、测试和文档将托管在 GitHub 上。我们将使用 GitHub 的漏洞和功能跟踪系统进行项目管理。您可以使用标准的 GitHub 工作流查看并对 Bottlerocket 源代码作出贡献。

如何生成包含我自己的更改的自定义 Bottlerocket 版本?

您可以对 GitHub 存储库进行分叉、进行您的更改并遵照我们的构建指南

我能否创建并重新分配我自己的 Bottlerocket 版本?

是。如果您从未修改的源构建 Bottlerocket 并重新分配结果,您可以使用“Bottlerocket”,但前提是仅当分配名称和与其相关的内容中明确表示,您的分配是 Amazon 的 Bottlerocket 的版本,而不是官方版本,且您必须识别构建它所使用的提交,而不是提交日期。

如何使用 Bottlerocket 商标来引用已针对不同容器编排器进行修改的我自己的 Amazon Bottlerocket 版本?

如果您修改了 Amazon 的 Bottlerocket 以与另一个容器编排器结合使用,您可以根据策略指南使用“Bottlerocket Remix”来引用您的版本。如果您有权以此方式使用该容器编排器的商标,则您可以将该容器编排器的名称附加到“Bottlerocket Remix”中。

我需要对已修改的 Bottlerocket 版本进行哪些操作系统更改才能符合此策略?

您必须修改 os-release 文件才能使用您的“Bottlerocket Remix”名称或删除 Bottlerocket 商标。可以通过修改 packages/release/release.spec 和 tools/rpm2img 来完成此操作。不需要更改系统根 (/x86_64-bottlerocket-linux-gnu/sys-root) 的名称、分区标签、目录路径和服务文件描述来符合此策略。