隨著我們的客戶越來越多地使用容器來運行其工作負載,設計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”來引用構建。
評論
查看更多