随着我们的客户越来越多地使用容器来运行其工作负载,设计Linux发行版以从头开始运行容器已经变得很流行。 例如,Compact Alpine Research,Redhat的CoreOS和其他操作系统用于运行容器。
日前著名云厂商亚马逊宣布,发布自己的容器Linux发行版Bottlerocket。Bottlerocket立足于安全性,操作和规模管理,使用它能够自动管理数千个运行容器的主机。
Bottlerocket,本质上是一个新Linux发行版,用来跑容器。他内置了安全性增强功能有助于简化安全性合规性,并提供事务更新机制使使用容器编排器自动化操作系统更新并降低运营成本。
Bottlerocket目前已在GitHub创建开源组,并全开源。今天我们就一起来了解一下这个系统。
技术架构
Bottlerocket的开发源于,Amazon AWS云中客户如何使用Amazon Linux运行容器以及从运行服务(例如AWS Fargate)中学到的知识来设计和构建的。在设计中,充分对Bottlerocket进行了优化,以提高安全性,性能并简化维护流程。
最少组件、SELinux增强
Bottlerocket中只包含运行容器所需的软件,以减少安全攻击面,从而提高了安全性。除了使用标准Linux内核技术在容器化工作负载(例如控制组(cgroup),名称空间和seccomp)之间实现隔离之外,还以强制模式使用安全性增强的Linux(SELinux)来增强容器与主机操作系统之间的隔离。
Device-mapper和eBPF
Bottlerocket使用Device-mapper的verity目标(dm-verity),这是一种Linux内核功能,可提供完整性检查,以帮助防止攻击者在操作系统上持续存在威胁,例如覆盖核心系统软件。
Bottlerocket Linux内核中包括了eBPF,这减少了许多低级系统操作对内核模块的需求。
Rust开发
Bottlerocket的大部分内容都是用Rust编写的,Rust是一种现代编程语言,可帮助确保线程安全并防止与内存相关的错误,例如可能导致安全漏洞的缓冲区溢出。
隔离容器管理
Bottlerocket还通过阻止与生产服务器的管理连接来实施可进一步提高安全性的操作模型。它适用于限制对单个主机的控制的大型分布式环境。
为了进行调试,可以使用Bottlerocket的API运行”管理容器”(通过用户数据或AWS Systems Manager调用),然后使用SSH登录以进行高级调试和故障排除。admin容器是Amazon Linux 2容器映像,包含用于对Bottlerocket进行故障排除和调试的实用程序,并以提升的特权运行。它允许安装和使用标准调试工具,例如traceroute,strace,tcpdump。登录到单个Bottlerocket实例的行为旨在作为高级调试和故障排除的操作。
自动更新
Bottlerocket通过使节点的管理和对集群中节点的自动更新更加容易,从而大规模地提高了操作和可管理性。与旨在支持以各种格式打包的应用程序的通用Linux发行版不同,Bottlerocket是专门为运行容器而构建的。对其他通用Linux发行版的更新是在逐个软件包的基础上应用的,它们的软件包之间的复杂依赖关系可能导致错误,从而使流程难以实现自动化。
操作灵活
Bottlerocke以原子方式应用和回滚更新,这使得它们易于自动化,从而减少了管理开销并降低了运营成本。
Bottlerocket与容器编排器集成在一起,可以对主机进行自动修补,以提高运营成本,可管理性和正常运行时间。Bottlerocket支持与任何容器编排器集成,AWS提供的编译版本可与Amazon EKS(具有一般可用性)和Amazon ECS(具有预览功能)一起使用。
Bottlerocket入门
Bottlerocke支持不包括编排系统的,作为独立的OS运行进行开发和测试用例,官方还是建议建议将其与容器编排系统结合使用,以充分利用其所有优点。
最简单入门方法在AWS云中,使用AWS提供的Bottlerocket AMI与Amazon EKS或Amazon ECS结合使用。
可以通过使用AWS CLI查询SSM来找到这些AMI的ID,如下所示。
要查找Bottlerocket aws-k8s-1.17变体的最新AMI ID,请运行:
aws ssm get-parameter –region us-west-2 \
–name “/aws/service/bottlerocket/aws-k8s-1.17/x86_64/latest/image_id” \
–query Parameter.Value –output text
要查找Bottlerocket aws-ecs-1变体的最新AMI ID,运行:
aws ssm get-parameter –region us-west-2 \
–name “/aws/service/bottlerocket/aws-ecs-1/x86_64/latest/image_id” \
–query Parameter.Value –output text
在上述两个示例的命令,可以指定是否在另一个区域中操作改变区域,或从x86_64的改变架构arm64如果使用Graviton-动力实例。
得到AMI ID后,可以启动EC2实例并将其连接到现有的EKS或ECS群集。要使用Bottlerocket的Kubernetes变体连接到EKS集群,在启动EC2实例时,需要提供如下用户数据:
[settings.kubernetes]
api-server = “Your EKS API server endpoint here”
cluster-certificate = “Your base64-encoded cluster certificate here”
cluster-name = “Your cluster name here”
要使用Bottlerocket的ECS变体连接到ECS群集,可以提供以下用户数据:
[settings.ecs]
cluster = “Your cluster name here”
自定义编译Bottlerocket
除了使用AWS提供的Bottlerocket AMI外,还可以使用自己的更改生成定制的Bottlerocket构建。
作为前提步骤,首先创建一个Rust开发环境。建议使用安装最新的稳定Rust版本。要组织构建任务,要使用cargo-make和cargo-deny:
cargo install cargo-make
cargo install cargo-deny –version 0.6.2
Bottlerocket使用Docker来协调打包和映像构建。建议使用Docker 19.03或更高版本。需要安装Docker并以您的用户帐户运行,以便能够访问Docker API。通常可以通过将用户帐户添加到docker组来启用此功能。
要生成映像,请在更改源代码后运行:
cargo make
所有软件包将依次构建,然后编译目录中的img文件build。
接下来,要注册在Amazon EC2上使用的Bottlerocket AMI,需要设置aws-cli并运行:
cargo make ami
开源社区
Bottlerocket已经完全开源,以使用户能够对用于运行其基础架构的操作系统进行自定义(例如,与自定义协调器/内核/容器运行时集成),将其提交上游并生成自定义版本。所有设计文档,代码,构建工具,测试和文档都将托管在GitHub上。使用GitHub的错误和功能跟踪系统进行项目管理。支持可以使用标准GitHub工作流程查看并为Bottlerocket源代码做贡献。构建,发行和测试基础结构的可用性使生成包含其更改的自定义构建变得容易。ISV合作伙伴可以在客户更新到最新版本的Bottlerocket之前快速验证其软件。
Bottlerocket包括标准的开放源代码组件,例如Linux内核,容器化容器运行时等。特定于Bottlerocket的附加项着重于可靠的更新以及基于API的机制来进行配置更改和触发更新/回滚。可以选择根据Apache 2.0许可证或MIT许可证来许可Bottlerocket代码。诸如Linux内核之类的底层第三方代码仍受其原始许可证的约束。如果修改Bottlerocket,则可以根据策略准则使用”Bottlerocket Remix”来引用构建。