云网牛站
所在位置:首页 > Linux新闻 > Bottlerocket详细介绍:为基于容器的工作负载提供可靠安全的平台

Bottlerocket详细介绍:为基于容器的工作负载提供可靠安全的平台

2020-03-12 10:37:52作者:戴进稿源:云网牛站

Bottlerocket是用于托管容器的基于Linux的免费开放源代码操作系统,它专注于安全性和可维护性,为基于容器的工作负载提供了可靠、一致且安全的平台,以下进行详细的介绍。

Bottlerocket详细介绍:为基于容器的工作负载提供可靠安全的平台

 

简介

基本操作系统具有可靠运行容器所需的一切,并由标准的开源组件构建。特定于Bottlerocket的附加功能专注于可靠的更新和API。您可以通过API调用来更改设置,而不必手动进行配置更改,并且这些更改将通过更新自动迁移。

一些值得注意的功能包括:

通过API访问权限来配置系统,并在需要时使用安全的带外访问方法。

基于分区翻转的更新,可实现快速可靠的系统更新。

通过更新自动迁移的建模配置。

安全是重中之重。

为了提高安全性,Bottlerocket映像中没有SSH服务器,甚至没有Shell。

 

关于Variant

首先,我们将重点放在将Bottlerocket用作AWS EKS Kubernetes集群中的主机操作系统。

构造了Bottlerocket,以便将来可以支持不同的云环境和容器编排器。支持不同功能或集成特性的Bottlerocket构建称为“Variant”。构建的工件将包括体系结构和Variant名称。例如,aws-k8s-1.15 variant的x86_64构建将生成一个名为bottlerocket-aws-k8s-1.15-x86_64-<version>-<commit>.img的图像。

我们第一个受支持的Variant,aws-k8s-1.15支持如上所述的EKS。

 

控制容器

Bottlerocket具有一个“Control”容器,默认情况下处于启用状态,该容器在协调器之外的单独容器实例中运行。该容器运行AWS SSM代理,该代理使您可以在EC2中的Bottlerocket实例上运行命令或启动Shell会话。

您需要为您的实例赋予SSM角色才能正常工作。

实例启动后,您可以启动会话:

转到AWS SSM的会话管理器。

选择“Start session”,然后选择您的Bottlerocket实例。

再次选择“Start session”以获取shell。

如果您喜欢命令行工具,则可以使用最新的AWS CLI和session-manager-plugin启动会话。然后,您将可以仅使用实例ID来启动会话,如下所示:

aws ssm start-session --target INSTANCE_ID

使用默认控件容器,您可以进行API调用以更改Bottlerocket主机中的设置。

 

管理员容器

Bottlerocket具有一个管理容器,默认情况下处于禁用状态,该管理容器在协调器之外的单独容器实例中运行。该容器具有SSH服务器,可让您使用EC2注册的SSH密钥以ec2用户身份登录。

要启用容器,您可以在启动Bottlerocket时更改用户数据中的设置,例如EC2实例用户数据:

[settings.host-containers.admin]

enabled = true

如果Bottlerocket已经在运行,则可以从默认控件容器中启用管理容器,如下所示:

enable-admin-container

如果您使用的是自定义控件容器,或者想直接进行API调用,则可以启用管理容器,如下所示:

apiclient -u /settings -m PATCH -d '{"host-containers": {"admin": {"enabled": true}}}'

apiclient -u /tx/commit_and_apply -m POST

进入管理容器后,您可以运行sheltie以在Bottlerocket主机中获取完整的root shell。小心:尽管您可以以root用户身份进行检查和更改,但Bottlerocket的文件系统和dm-verity设置将防止大多数更改在重新启动后仍然存在。

 

关于更新

Bottlerocket不是更新单个软件的程序包管理器,而是下载完整的文件系统映像并重新引导到其中。如果发生启动失败,它可以自动回滚,并且工作负载故障可以触发手动回滚。

当前,您可以使用CLI工具updog进行更新。您可以通过以下方式查看是否有更新:

updog check-update

这是您启动更新的方式:

updog update

reboot

如果您知道自己在做什么,现在想更新,则可以运行updog update --reboot --now。

如果无法启动,系统将自动回滚。如果更新对于给定的容器工作负载不起作用,则可以执行手动回滚:

signpost rollback-to-inactive

reboot

 

关于打包

Bottlerocket是使用容器工具链从源代码构建的。我们使用RPM软件包定义来构建单个软件包并将其安装到映像中。RPM本身不在映像中,它只是一种常见且方便的包定义格式。

当前,我们打包了以下主要的第三方组件,如下:

Linux kernel (background, packaging)

glibc (background, packaging)

Buildroot as build toolchain (background, via the SDK)

GRUB, with patches for partition flip updates (background, packaging)

systemd as init (background, packaging)

wicked for networking (background, packaging)

containerd (background, packaging)

Kubernetes (background, packaging)

aws-iam-authenticator (background, packaging)

 

关于更新

Bottlerocket映像具有两组相同的分区A和B。更新Bottlerocket时,分区表将更新为从A组指向B组,反之亦然。

我们还将跟踪成功的引导,如果出现故障,它将自动恢复为先前的工作分区集。

更新过程使用由TUF保护的映像。

 

关于API

与生产Bottlerocket实例进行交互的主要方法有两种:

第一种方法是通过容器编排器,用于您要运行或管理容器的时间。这将为您的协调器使用标准通道,例如,像kubectl这样的工具用于Kubernetes,参考安装及使用kubectl、kubectx和kubens轻松管理多个Kubernetes集群

第二种方法是通过Bottlerocket API,例如,当您要配置系统时。

有一个HTTP API服务器在本地Unix域套接字上侦听。对API的远程访问需要经过身份验证的传输。

apiclient可用于发出请求。它们只是HTTP请求,但API客户端使用Unix域套接字简化了发出请求。

为了简化配置,我们提供了Early-boot-config,它可以根据实例用户数据为您发送API请求。如果启动虚拟机(例如EC2实例),它将从用户数据中读取TOML格式的Bottlerocket配置,并将其发送到API服务器。这样,您可以配置Bottlerocket实例,而不必在启动后进行API调用。

服务器和客户端是API系统的面向用户的组件,但是还有许多其他组件可以协同工作,以确保您的设置被应用,并且可以在Bottlerocket升级后保留下来。

 

相关主题

了解AWS中的云存储选项:S3、EBS和EFS介绍

精选文章
热门文章