隨著我們的客戶越來越多地采用容器來運行其工作負(fù)載,從頭開始設(shè)計以運行容器的Linux發(fā)行版成了一種時尚,比如追求小巧Alpine,Redhat的CoreOS等操作系統(tǒng)用來跑容器。
日前著名云廠商亞馬遜宣布,發(fā)布自己的容器Linux發(fā)行版Bottlerocket。Bottlerocket立足于安全性,操作和規(guī)模管理,使用它能夠自動管理數(shù)千個運行容器的主機。
Bottlerocket,本質(zhì)上是一個新Linux發(fā)行版,用來跑容器。他內(nèi)置了安全性增強功能有助于簡化安全性合規(guī)性,并提供事務(wù)更新機制使使用容器編排器自動化操作系統(tǒng)更新并降低運營成本。
Bottlerocket目前已在GitHub創(chuàng)建開源組,并全開源。今天我們就一起來了解一下這個系統(tǒng)。
技術(shù)架構(gòu)
Bottlerocket的開發(fā)源于,Amazon AWS云中客戶如何使用Amazon Linux運行容器以及從運行服務(wù)(例如AWS Fargate)中學(xué)到的知識來設(shè)計和構(gòu)建的。在設(shè)計中,充分對Bottlerocket進行了優(yōu)化,以提高安全性,性能并簡化維護流程。
最少組件、SELinux增強
Bottlerocket中只包含運行容器所需的軟件,以減少安全攻擊面,從而提高了安全性。除了使用標(biāo)準(zhǔn)Linux內(nèi)核技術(shù)在容器化工作負(fù)載(例如控制組(cgroup),名稱空間和seccomp)之間實現(xiàn)隔離之外,還以強制模式使用安全性增強的Linux(SELinux)來增強容器與主機操作系統(tǒng)之間的隔離。
Device-mapper和eBPF
Bottlerocket使用Device-mapper的verity目標(biāo)(dm-verity),這是一種Linux內(nèi)核功能,可提供完整性檢查,以幫助防止攻擊者在操作系統(tǒng)上持續(xù)存在威脅,例如覆蓋核心系統(tǒng)軟件。
Bottlerocket Linux內(nèi)核中包括了eBPF,這減少了許多低級系統(tǒng)操作對內(nèi)核模塊的需求。
Rust開發(fā)
Bottlerocket的大部分內(nèi)容都是用Rust編寫的,Rust是一種現(xiàn)代編程語言,可幫助確保線程安全并防止與內(nèi)存相關(guān)的錯誤,例如可能導(dǎo)致安全漏洞的緩沖區(qū)溢出。
隔離容器管理
Bottlerocket還通過阻止與生產(chǎn)服務(wù)器的管理連接來實施可進一步提高安全性的操作模型。它適用于限制對單個主機的控制的大型分布式環(huán)境。
為了進行調(diào)試,可以使用Bottlerocket的API運行"管理容器"(通過用戶數(shù)據(jù)或AWS Systems Manager調(diào)用),然后使用SSH登錄以進行高級調(diào)試和故障排除。admin容器是Amazon Linux 2容器映像,包含用于對Bottlerocket進行故障排除和調(diào)試的實用程序,并以提升的特權(quán)運行。它允許安裝和使用標(biāo)準(zhǔn)調(diào)試工具,例如traceroute,strace,tcpdump。登錄到單個Bottlerocket實例的行為旨在作為高級調(diào)試和故障排除的操作。
自動更新
Bottlerocket通過使節(jié)點的管理和對集群中節(jié)點的自動更新更加容易,從而大規(guī)模地提高了操作和可管理性。與旨在支持以各種格式打包的應(yīng)用程序的通用Linux發(fā)行版不同,Bottlerocket是專門為運行容器而構(gòu)建的。對其他通用Linux發(fā)行版的更新是在逐個軟件包的基礎(chǔ)上應(yīng)用的,它們的軟件包之間的復(fù)雜依賴關(guān)系可能導(dǎo)致錯誤,從而使流程難以實現(xiàn)自動化。
操作靈活
Bottlerocke以原子方式應(yīng)用和回滾更新,這使得它們易于自動化,從而減少了管理開銷并降低了運營成本。
Bottlerocket與容器編排器集成在一起,可以對主機進行自動修補,以提高運營成本,可管理性和正常運行時間。Bottlerocket支持與任何容器編排器集成,AWS提供的編譯版本可與Amazon EKS(具有一般可用性)和Amazon ECS(具有預(yù)覽功能)一起使用。
Bottlerocket入門
Bottlerocke支持不包括編排系統(tǒng)的,作為獨立的OS運行進行開發(fā)和測試用例,官方還是建議建議將其與容器編排系統(tǒng)結(jié)合使用,以充分利用其所有優(yōu)點。
最簡單入門方法在AWS云中,使用AWS提供的Bottlerocket AMI與Amazon EKS或Amazon ECS結(jié)合使用。
可以通過使用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
在上述兩個示例的命令,可以指定是否在另一個區(qū)域中操作改變區(qū)域,或從x86_64的改變架構(gòu)arm64如果使用Graviton-動力實例。
得到AMI ID后,可以啟動EC2實例并將其連接到現(xiàn)有的EKS或ECS群集。要使用Bottlerocket的Kubernetes變體連接到EKS集群,在啟動EC2實例時,需要提供如下用戶數(shù)據(jù):
[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群集,可以提供以下用戶數(shù)據(jù):
[settings.ecs]
cluster="Your cluster name here"
自定義編譯Bottlerocket
除了使用AWS提供的Bottlerocket AMI外,還可以使用自己的更改生成定制的Bottlerocket構(gòu)建。
作為前提步驟,首先創(chuàng)建一個Rust開發(fā)環(huán)境。建議使用安裝最新的穩(wěn)定Rust版本。要組織構(gòu)建任務(wù),要使用cargo-make和cargo-deny:
cargo install cargo-make
cargo install cargo-deny--version 0.6.2
Bottlerocket使用Docker來協(xié)調(diào)打包和映像構(gòu)建。建議使用Docker 19.03或更高版本。需要安裝Docker并以您的用戶帳戶運行,以便能夠訪問Docker API。通??梢酝ㄟ^將用戶帳戶添加到docker組來啟用此功能。
要生成映像,請在更改源代碼后運行:
cargo make
所有軟件包將依次構(gòu)建,然后編譯目錄中的img文件build。
接下來,要注冊在Amazon EC2上使用的Bottlerocket AMI,需要設(shè)置aws-cli并運行:
cargo make ami
開源社區(qū)
Bottlerocket已經(jīng)完全開源,以使用戶能夠?qū)τ糜谶\行其基礎(chǔ)架構(gòu)的操作系統(tǒng)進行自定義(例如,與自定義協(xié)調(diào)器/內(nèi)核/容器運行時集成),將其提交上游并生成自定義版本。所有設(shè)計文檔,代碼,構(gòu)建工具,測試和文檔都將托管在GitHub上。使用GitHub的錯誤和功能跟蹤系統(tǒng)進行項目管理。支持可以使用標(biāo)準(zhǔn)GitHub工作流程查看并為Bottlerocket源代碼做貢獻(xiàn)。構(gòu)建,發(fā)行和測試基礎(chǔ)結(jié)構(gòu)的可用性使生成包含其更改的自定義構(gòu)建變得容易。ISV合作伙伴可以在客戶更新到最新版本的Bottlerocket之前快速驗證其軟件。
Bottlerocket包括標(biāo)準(zhǔn)的開放源代碼組件,例如Linux內(nèi)核,容器化容器運行時等。特定于Bottlerocket的附加項著重于可靠的更新以及基于API的機制來進行配置更改和觸發(fā)更新/回滾??梢赃x擇根據(jù)Apache 2.0許可證或MIT許可證來許可Bottlerocket代碼。諸如Linux內(nèi)核之類的底層第三方代碼仍受其原始許可證的約束。如果修改Bottlerocket,則可以根據(jù)策略準(zhǔn)則使用"Bottlerocket Remix"來引用構(gòu)建。