一款跑在云上的定制容器专属 OS 来了——LifseaOS | 龙蜥技术
簡介:如果可以把運(yùn)維 API 化,那我們是不是可以把 OS 也作為一個(gè) K8S 可以管理的資源,讓 K8S 像管理容器一樣管理OS?
引言
在 2021 年 10 月的云棲大會(huì)上,為云原生而生的 OS Lifsea 正式對(duì)外發(fā)布,并集成進(jìn)入阿里云容器服務(wù) ACK Pro 的托管節(jié)池,成為可選的操作系統(tǒng)選項(xiàng)。
不久前,LifseaOS 核心代碼正式在龍蜥社區(qū)開源,用戶可以基于 LifseaOS 開源代碼構(gòu)建、定制一個(gè)屬于自己的容器專屬 OS。
WHY LifseaOS?
說到 LifseaOS,不得不提到其主要面向的場景:容器。
從最早的 UNIX chroot,到 Linux 的 LXC,早期以 cgroup、namespace 為基礎(chǔ)的容器運(yùn)行時(shí)技術(shù)一直在持續(xù)演進(jìn),但并沒有出現(xiàn)階段性的突破。直到 2013 年,docker 的出現(xiàn)直接推進(jìn)了容器的快速普及,經(jīng)過短短幾年的發(fā)展,容器已經(jīng)成為了主流的 IT基礎(chǔ)設(shè)施技術(shù)被廣泛地應(yīng)用。容器的快速發(fā)展 docker 功不可沒,而我們回顧當(dāng)時(shí) docker 最初的工作,可以發(fā)現(xiàn)其并沒有進(jìn)行顛覆性的技術(shù)變革,其核心創(chuàng)新主要包括以下兩個(gè)部分:
- 定義了容器分層鏡像標(biāo)準(zhǔn)以及鏡像倉庫:容器鏡像將應(yīng)用運(yùn)行環(huán)境,包括代碼、依賴庫、工具、資源文件和元信息等,打包成一種操作系統(tǒng)發(fā)行版無關(guān)的不可變更軟件包
- 定義了覆蓋容器全生命周期 restful API:restful API 的將整個(gè)容器的創(chuàng)建、監(jiān)控、銷毀過程標(biāo)準(zhǔn)化,部署、運(yùn)維人員可以在一個(gè)集群內(nèi)對(duì)大量的容器進(jìn)行統(tǒng)一化的管理
這兩個(gè)關(guān)鍵創(chuàng)新帶來了整個(gè)開發(fā)、集成、部署的革命。首先鏡像能力為 devops 提供了一條便捷的道路,開發(fā)人員可以在開發(fā)過程中便完成對(duì)于整個(gè)運(yùn)行環(huán)境的把控,將自己開發(fā)成果直接上線部署生產(chǎn)投入,無需再去考慮操作系統(tǒng)兼容、庫依賴等環(huán)境因素,實(shí)現(xiàn)了 docker 的口號(hào)“Build,Ship and Run Any App,Anywhere”。其次,restful API 出現(xiàn)使得容器的生命周期管理愈加的便捷,利用編排工具對(duì)容器的管理,SRE 可以快速、無差別地進(jìn)行應(yīng)用的部署、升級(jí)、下線,實(shí)現(xiàn)了針對(duì)應(yīng)用管理由“寵物”到“牛群”的質(zhì)的飛越。
伴隨著容器一起發(fā)展的是以容器為基礎(chǔ)衍生而出的容器編排、容器存儲(chǔ)、容器網(wǎng)絡(luò)等領(lǐng)域,這些領(lǐng)域緊密結(jié)合形成了“云原生”生態(tài),并且在 2015 年開始,圍繞著 K8S 逐步形成了一套完整的“云原生操作系統(tǒng)”。通過 K8S,用戶可以在一個(gè)分布式集群內(nèi)快速、高效地部署容器,無需再去關(guān)注復(fù)雜的集群資源分配、容器調(diào)度等工作。為了完整地支持 K8S,云廠商也進(jìn)行了大量的 K8S 的支撐對(duì)接,紛紛提供適配自身 I 層基礎(chǔ)設(shè)施的 CNI(Container Network Interface)、CSI(Container Storage Interface)以及相對(duì)應(yīng)的 cluster-autoscaler 等組件,讓 K8S 可以完美的管理自己的存儲(chǔ)、網(wǎng)絡(luò)、計(jì)算資源。
在基礎(chǔ)設(shè)施紛紛“云原生化”的過程中,有一個(gè)同屬于 Infra 的組件卻步驟緩慢,這就是操作系統(tǒng),也就是我們一直說的 OS。雖然存在感并不是很強(qiáng),但是 OS 作為下接硬件、上接業(yè)務(wù)的底層軟件,默默地為應(yīng)用提供了單機(jī)資源管理、運(yùn)行環(huán)境構(gòu)建等能力,發(fā)揮著舉足輕重的作用。但是在云原生場景下,傳統(tǒng)操作系統(tǒng)已經(jīng)逐漸表現(xiàn)出各種“不適”:
- 體積臃腫:傳統(tǒng)的操作系統(tǒng)為了兼容不同的使用場景,包含了各種各樣的硬件驅(qū)動(dòng)、軟件包、系統(tǒng)庫、系統(tǒng)服務(wù)等,操作系統(tǒng)后臺(tái)服務(wù)繁多,體積也顯得龐大。在云原生容器場景下,必要的服務(wù)大都已經(jīng)被容器化,以容器的方式被部署到節(jié)點(diǎn)上,通過容器的方式來實(shí)現(xiàn)版本、配置的管理,逐步取代了傳統(tǒng) OS 上的系統(tǒng)服務(wù);同時(shí),云上硬件資源通過云廠商的虛擬化抽象往往更加地簡化,并不需要去支持各種硬件。而容器鏡像本身就有運(yùn)行時(shí)自包含的能力,因此很多傳統(tǒng) OS 上的能力會(huì)顯得厚重而冗余,這些厚重的組件還會(huì)使整個(gè) OS 啟動(dòng)變慢并占用相當(dāng)?shù)南到y(tǒng)資源(CPU、內(nèi)存等)。
- 版本零散:為了能夠支持不同的訴求,操作系統(tǒng)提供了各種各樣不同的軟件,并以軟件包為粒度進(jìn)行版本管理,每個(gè)軟件包有自己獨(dú)立的功能以及代碼、版本號(hào),由用戶根據(jù)自身的需求進(jìn)行軟件包的增、刪。這樣每臺(tái)宿主機(jī)上的 OS 狀態(tài)是由大量不同軟件包版本號(hào)組成的,而在日常運(yùn)維時(shí)一般是針對(duì)某一個(gè)軟件包進(jìn)行管理。在云原生的場景下,集群計(jì)算節(jié)點(diǎn)日趨增多,生產(chǎn)過程中由于 bugfix、問題定位等可能在某一節(jié)點(diǎn)上針對(duì)某個(gè)包進(jìn)行管理(升級(jí)、配置修改等),如果沒有一套完整的集群 OS 運(yùn)維機(jī)制,極容易出現(xiàn)集群內(nèi) OS 狀態(tài)不統(tǒng)一的情況,如果在灰度的過程中出現(xiàn)依賴組件版本不一,可能會(huì)導(dǎo)致整個(gè)發(fā)布流程受阻,給運(yùn)維人員帶來極大的困難。
- 安全風(fēng)險(xiǎn):一方面,傳統(tǒng)操作系統(tǒng)包含了大量云原生場景下不需要的軟件包和系統(tǒng)服務(wù),帶來更大的攻擊面。另一方面,傳統(tǒng)操作系統(tǒng)的運(yùn)維人員大多通過 ssh 登錄進(jìn)系統(tǒng)進(jìn)行黑屏的運(yùn)維操作,過程難以追溯,誤操作極易帶來災(zāi)難性的后果。
以上的問題主要還是體現(xiàn)在運(yùn)維上,這時(shí)我們回頭看下,在 docker 出現(xiàn)之前,應(yīng)用的運(yùn)維人員也有類似的問題:如何保障應(yīng)用在不同條件下運(yùn)行環(huán)境的匹配一致、如何便捷快速地管理應(yīng)用等。而 docker 很好地解決了應(yīng)用層的問題,那是不是我們可以借鑒 docker 的思路來解決 OS 運(yùn)維的問題?
其實(shí)在業(yè)界已經(jīng)有了一些容器優(yōu)化版操作系統(tǒng),即我們常說的 ContainerOS,包括 AWS 的 bottlerocket、Redhat 的 Fodera CoreOS 以及 Rancher 的 RancherOS 等,它們大多具有以下特點(diǎn):
- 輕量化:操作系統(tǒng)僅僅包含足夠支撐容器運(yùn)行所需的軟件包與系統(tǒng)服務(wù),大大減少攻擊面,啟動(dòng)快。
- 原子升級(jí)回滾:基于不可變基礎(chǔ)設(shè)施的設(shè)計(jì)原則,提供只讀根文件系統(tǒng)保證系統(tǒng)不被惡意篡改,操作系統(tǒng)的管理以鏡像為粒度,不提供 YUM 等包管理軟件,整個(gè)系統(tǒng)以鏡像為粒度進(jìn)行升級(jí)與回滾。Bottlerocket 采用了 A/B 雙分區(qū)的方式實(shí)現(xiàn)鏡像的原子升級(jí),CoreOS 則通過 rpm-ostree 像管理一個(gè) git 代碼倉一樣管理一個(gè) OS 版本,而 RancherOS 則更加激進(jìn)地把所有的系統(tǒng)服務(wù)全部容器化,實(shí)現(xiàn)用容器"管理"操作系統(tǒng)鏡像。
- 默認(rèn)集成云原生組件:默認(rèn)安裝 docker/containerd/kubernetes 等云原生組件,操作系統(tǒng)開箱即用,不需要用戶進(jìn)行額外的安裝操作,簡單易用。
- 受控的運(yùn)維通道:系統(tǒng)去除 sshd 服務(wù),不允許直接登錄系統(tǒng)進(jìn)行運(yùn)維,同時(shí)提供豐富的 API 接口用于主機(jī)的運(yùn)維,另外還提供專用的運(yùn)維容器作為最后的“退路”用以登錄系統(tǒng)。
這些特點(diǎn)其實(shí)也印證了我們的思考:用鏡像的方式解決版本零散的問題,用 API 解決集群運(yùn)維的問題,而我們更是發(fā)現(xiàn),如果可以把運(yùn)維 API 化,那我們是不是可以把 OS 也作為一個(gè) K8S 可以管理的資源,讓 K8S 像管理容器一樣管理OS?
LifseaOS:為云而生的操作系統(tǒng)
基于以上的思考,我們推出了 LifSeaOS,一款為云原生而生的 OS。
LifseaOS 延續(xù)了 CoreOS rpm-ostree 的技術(shù)流派,基于由龍蜥社區(qū)(OpenAnolis)發(fā)布的龍蜥操作系統(tǒng)(Anolis OS) 作為軟件包選型基礎(chǔ)。
LifseaOS 使用了 rpm-ostree 的功能,實(shí)現(xiàn)鏡像的原子性升級(jí)回滾,讓用戶可以在集群維度對(duì) OS 鏡像進(jìn)行 rolling upgrade,像管理牛群一樣管理一整個(gè)集群的操作系統(tǒng);同時(shí)做了大量的裁剪優(yōu)化,使整體 OS 更輕、更快、更安全。
同時(shí),我們提供了一個(gè)用于 OS 運(yùn)維的小工具(功能還在持續(xù)豐富中),將常規(guī)的 OS 運(yùn)維抽象出來并進(jìn)行收斂,借助阿里云云助手或自動(dòng)化運(yùn)維編排服務(wù),用戶針對(duì) OS 的運(yùn)維操作通過調(diào)用運(yùn)維工具的方式進(jìn)行,減少針對(duì)操作系統(tǒng)的開放性操作,并進(jìn)行相應(yīng)的審計(jì)。
API 化運(yùn)維更重要的作用是將 OS 運(yùn)維往云原生的方向牽引,我們可以通過一個(gè) K8s 的 controller 對(duì)接運(yùn)維 API,結(jié)合上述的 OS 版本化,讓 K8s 像管理一個(gè)容器一樣管理一個(gè) HostOS。
當(dāng)然,LifseaOS 的特征不僅僅是以上描述的鏡像版本化和運(yùn)維 API 化,它的名字也直接闡述了 LifseaOS 作為一個(gè)為云而生、為容器而生的 OS 所具備的特質(zhì):
Lightweight
LifseaOS 默認(rèn)集成 containerd、kubernetes 組件,僅僅保留 kubernetes pods 運(yùn)行所需的系統(tǒng)服務(wù)與軟件包,整個(gè)系統(tǒng)大約只有 200 左右的軟件包,相比傳統(tǒng)操作系統(tǒng)(Alibaba Cloud Linux 2/3、CentOS)500+ 軟件包而言,數(shù)量減少 60%,更加的輕量。
繁重的 cloud-init(云廠商常用的云主機(jī)元數(shù)據(jù)管理組件)套件被替換為 CoreOS 的 Ignition,且裁剪了大量不需要的功能,僅保留最基礎(chǔ)的磁盤擴(kuò)容、hostname 配置、chronyd 時(shí)區(qū)同步服務(wù)器配置與執(zhí)行 user-data 腳本的功能。去除了不必要的內(nèi)核模塊、 systemd 服務(wù)(比如 systemd-logind、systemd-resolved)以及 systemd 附帶的許多實(shí)用性極低的小工具。
Fast
LifseaOS 的定位是跑在云上虛擬機(jī)的操作系統(tǒng),所以不會(huì)涉及到太多的硬件驅(qū)動(dòng),必要的內(nèi)核驅(qū)動(dòng)模塊修改為 built-in 模式,去除了 initramfs,udev 規(guī)則也被大大簡化,這樣,啟動(dòng)速度得到了大幅提升,以 ecs.g7.large 規(guī)格的 ECS 實(shí)例為例,LifseaOS 的首次啟動(dòng)時(shí)間保持在 2s 左右:
傳統(tǒng)的操作系統(tǒng),以 Alibaba Cloud Linux 3 為例,首次啟動(dòng)時(shí)間則在 1min 以上:
Security
LifseaOS 根文件系統(tǒng)為只讀權(quán)限,只有 /etc 和 /var 目錄可寫以滿足基礎(chǔ)的系統(tǒng)配置需求。這種設(shè)計(jì)既符合云原生場景下的基礎(chǔ)設(shè)施不可變?cè)瓌t,又能防止逃逸容器篡改主機(jī)文件系統(tǒng)。不支持 python 但仍然保留了 shell(因?yàn)?ACK 在集群部署階段需要執(zhí)行一系列的 shell 腳本來進(jìn)行初始化工作,后續(xù)會(huì)考慮進(jìn)一步去除)。
另外,LifseaOS 去除了 sshd 服務(wù),禁止用戶直接登錄到系統(tǒng)中進(jìn)行一系列可能無法追溯的操作;當(dāng)然,考慮到特殊運(yùn)維或者緊急運(yùn)維的需要,LifseaOS 仍然提供一個(gè)專用的運(yùn)維容器滿足非日常的運(yùn)維需求,運(yùn)維容器需要通過 API 按需拉起,默認(rèn)不開啟。
Atomic
LifseaOS 不支持單個(gè) rpm 包的安裝、升級(jí)和卸載,不提供 yum,所以去除了 Fedora CoreOS 里的 rpm-ostree 軟件包而僅保留 ostree 的功能(前者提供了以 rpm 包為粒度的管理功能,而后者僅僅管理文件)。以整個(gè)鏡像為粒度的更新和回滾極大程度上保證整個(gè)集群內(nèi)的各個(gè)節(jié)點(diǎn)的軟件包版本與系統(tǒng)配置的一致性。每個(gè)鏡像經(jīng)過內(nèi)部嚴(yán)格的測試之后才會(huì)上線,相較于傳統(tǒng)操作系統(tǒng)基于單個(gè) rpm 包的升級(jí)帶來的不確定性,以鏡像為粒度的測試發(fā)布更能保證升級(jí)后系統(tǒng)的穩(wěn)定性。
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。?
總結(jié)
以上是生活随笔為你收集整理的一款跑在云上的定制容器专属 OS 来了——LifseaOS | 龙蜥技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cross-Scale Cost Agg
- 下一篇: 极致用云,数智护航