隨著我們的客戶越來越多地採用容器來運行其工作負載,從頭開始設計以運行容器的Linux發行版成了一種時尚,比如追求小巧Alpine,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"來引用構建。
更多信息請參考Bottlerocket Github官方倉庫。