cOS-toolkit:Container OS 的下一程

作者簡介
張智博,SUSE Rancher 大中華區(qū)研發(fā)總監(jiān)溶推,一直活躍在研發(fā)一線徊件,經(jīng)歷了 OpenStack 到 Kubernetes 的技術(shù)變革,在底層操作系統(tǒng) Linux悼潭、虛擬化 KVM 和 Docker 容器技術(shù)領(lǐng)域都有豐富的研發(fā)和實踐經(jīng)驗庇忌。

背景:筆者曾經(jīng)維護過一款面向 Docker 的開源容器化操作系統(tǒng) RancherOS。cOS-toolkit 作為延續(xù) Container OS 思想的新興項目舰褪,做了更深層次的抽象皆疹。本文將逐步剖析 cOS-toolkit 的設計理念和使用方法,并分享個人的一些思考占拍。

RancherOS 的反思

RancherOS 發(fā)布之初略就,Docker 正是如日中天之時捎迫,順理成章,RancherOS 的目標就是成為一款面向 Docker 的 Container OS表牢。除了基礎(chǔ)的 Immutable OS 標準特性之外窄绒,我們做了很多魔改:比如把 dockerd 改為 system-docker 來替換 systemd,從而可以像管理容器一樣管理一些系統(tǒng)服務崔兴;極致裁剪了內(nèi)核彰导,希望把它打造成以最低成本運行 Docker 的 OS;兩層的 rootfs敲茄,當然用戶空間的 rootfs 本質(zhì)上是一個 Ubuntu/CentOS/Buildroot 等鏡像運行的容器位谋;使用 YAML 配置清單來做系統(tǒng)初始化,通過這種抽象來簡化系統(tǒng)管理員的負擔等等堰燎。

隨著時間的推移掏父,一些魔改的思路隨著上游的發(fā)展而變得不可持續(xù),比如 system-docker 組件始終停留在早期版本秆剪,無法進化赊淑。精簡內(nèi)核也帶來了諸多問題,未能背靠一個強大的社區(qū)仅讽,很難持續(xù)維護這些內(nèi)核以及系統(tǒng)組件陶缺,并在兼容性上提供可信任的保證。默認的 console 基于 Buildroot 項目構(gòu)建何什,每次增加軟件包都是非常繁瑣復雜的工作组哩,并且 Buildroot 本身追求的精簡有時無法滿足服務器端的需求。用戶的自定義需求很難得到滿足处渣,用戶通常需要等待官方版本的更新,用戶自定義的技術(shù)成本非常高蛛砰,難以上手罐栈。

RancherOS 的發(fā)展過程中取得了一定數(shù)量的社區(qū)用戶,并嘗試了小范圍的商業(yè)化支持泥畅,它把想法變成現(xiàn)實荠诬,對于特定群體是一個好的開源項目。然而位仁,從可持續(xù)發(fā)展角度柑贞,停止維護是一個更理性的選擇。盡管聂抢,能夠看到社區(qū)用戶仍然在發(fā)布一些 RancherOS 的衍生版本 BurmillaOS(https://burmillaos.org/)钧嘶。

cOS-toolkit 接棒下一程

cOS-toolkit 是一個構(gòu)建 ContainerOS 的工具包,之前 RancherOS 本身就是一個 Linux 發(fā)行版琳疏,而 cOS-toolkit 提供了構(gòu)建這種發(fā)行版更強大的抽象能力有决。吸取之前的一些開源項目經(jīng)驗闸拿,結(jié)合當下市場的主流需求,cOS-toolkit 可以帶來以下關(guān)鍵特性:

  • 使用 Container 方式進行構(gòu)建和升級书幕。cOS-toolkit 使用了開源工具luet(https://github.com/mudler/luet)新荤,luet 是一個基于容器的多平臺包管理工具。cOS-toolkit 的核心能力就來自于 luet台汇,cOS-toolkit 本身就維護了若干 luet packages(https://github.com/rancher-sandbox/cOS-toolkit/tree/master/packages)苛骨。在各種 Linux 發(fā)行版的基礎(chǔ)鏡像之上,疊加這些 packages苟呐,就可以基于 Dockerfile 的模式構(gòu)建 Container OS痒芝。這種作法可以依托每個 Linux 發(fā)行版背后強大的社區(qū),cOS-toolkit 無需關(guān)注某個軟件包如何編譯集成掠抬,也不會破壞每個發(fā)行版發(fā)燒友的使用習慣吼野。

  • 支持 OTA 更新。這個特性還處在不斷進化中两波,Container OS 的 OTA 可以將更新內(nèi)容構(gòu)建后發(fā)布到鏡像倉庫中瞳步,通過 Kubernetes 的擴展編排能力來進行所有節(jié)點的系統(tǒng)升級,升級動作觸發(fā)特定容器鏡像更新腰奋,并應用到 cOS-toolkit 構(gòu)建的 OS 中单起。

  • Cloud-init 支持,基于 systemd劣坊,以及不可變特性嘀倒。Cloud-init 的支持能力直接反映了在公有云環(huán)境的友好程度上;而基于 systemd 是可持續(xù)性發(fā)展的一個重要選擇局冰;對 Immutable 的支持在整個設計中具有優(yōu)先權(quán)测蘑,這是幾乎所有 Container OS 的標配屬性。
  • 簡單方便的自定義康二。cOS-toolkit 不再只是一種發(fā)行版碳胳,它提供了更強大的自定義構(gòu)建能力,用戶除了可以引用 cOS-toolkit 中維護的 packages沫勿,還可以自定義 package 進行擴展挨约,同時 cOS-toolkit 本身還簡化了各種 OEM 配置(https://rancher-sandbox.github.io/cos-toolkit-docs/docs/customizing/oem_configuration/),更換 branding 以及變更初始用戶名密碼會非常簡單产雹。強大的自定義能力诫惭,還讓用戶可以針對云環(huán)境或者邊緣環(huán)境等硬件規(guī)格特性來構(gòu)建特定的 OS,針對各種硬件環(huán)境的驅(qū)動和軟件包本身就依托背后強大的發(fā)行版社區(qū)蔓挖,無論質(zhì)量還是兼容性都有可靠保證夕土。

cOS-toolkit 工程會默認構(gòu)建一些基礎(chǔ)發(fā)行版:

  • Blue:基于 Fedora
  • Green:基于 openSUSE
  • Orange:基于 Ubuntu

由于核心工程人員來自 SUSE,基于 openSUSE 的變種會進行較完整的測試时甚,這些鏡像介質(zhì)可以在 Github Release(https://github.com/rancher-sandbox/cOS-toolkit/releases)中下載隘弊。

SUSE Rancher 已經(jīng)開始用 cOS-toolkit 構(gòu)建一些新興產(chǎn)品哈踱,比如 Harvester OS 以及RancherOS v2。前者提供了 Harvester 集群的底座 OS梨熙,便于 Harvester 對節(jié)點進行更深層次的管理开镣;后者未來將致力于提供可以面向 Rancher 以及 K3s/RKE2 的底座 OS,進一步簡化產(chǎn)品部署和運維難度咽扇。RancherOS v2 也處于開源積極孵化中:https://github.com/rancher-sandbox/os2

cOS-toolkit初體驗

支持公有云的友好體驗已經(jīng)是新興操作系統(tǒng)的標配邪财,cOS-toolkit 構(gòu)建的 Green(基于openSUSE)變種完全支持 AWS/Azure/GCP 等公有云。我們以 AWS 版本為例進行初始體驗质欲,AMI 信息可以在Github Release(https://github.com/rancher-sandbox/cOS-toolkit/releases)中下載到树埠,本文體驗版本為v0.7.4。

由于這些 AMI 在構(gòu)建時默認使用 UEFI 方式啟動嘶伟,所以部分實例類型無法支持怎憋,本次體驗使用 t3.large。

默認情況下九昧,系統(tǒng)初始會進入 Recovery 模式绊袋,用戶可以在該模式下進行自定義安裝,通過內(nèi)置的安裝工具配合預定義的 YAML 配置進行系統(tǒng)初始化安裝铸鹰。不過癌别,由于我們使用 AWS 云環(huán)境,我們可以借助 cloud-init 機制來簡化這一過程蹋笼。在基于 cOS AMI 啟動實例時(根磁盤 16GiB)展姐,配置以下 cloud-init 內(nèi)容:

name: "Default deployment"
stages:
   rootfs.after:
     - name: "Repart image"
       layout:
         # It will partition a device including the given filesystem label or part label (filesystem label matches first)
         device:
           label: COS_RECOVERY
         add_partitions:
           - fsLabel: COS_STATE
             # 10Gb for COS_STATE, so the disk should have at least 16Gb
             size: 10240
             pLabel: state
           - fsLabel: COS_PERSISTENT
             # unset size or 0 size means all available space
             pLabel: persistent
   initramfs:
     - if: '[ -f "/run/cos/recovery_mode" ]'
       name: "Set sshd to wait for deployment"
       files:
       - path: "/etc/systemd/system/sshd.service.d/override.conf"
         content: |
             [Unit]
             After=cos-setup-network.service
   network:
     - if: '[ -f "/run/cos/recovery_mode" ]'
       name: "Deploy cos-system"
       commands:
         - |
             cos-deploy --no-verify --no-cosign && shutdown -r now

這份 cloud-init userdata 會幫助我們規(guī)劃根磁盤分區(qū)表信息,同時進行初始化安裝剖毯。注意 cos-deploy 時如果沒有指定版本圾笨,則會安裝最新版本。這意味著盡管我們使用 v0.7.4 的 AMI逊谋,但在 cos-deploy 后會在源中尋找更新的版本來部署到根磁盤中墅拭,這其實也是 OTA 更新機制的一部分。

系統(tǒng)安裝初始化完畢后涣狗,可以通過 ssh 訪問,由于還沒有完整適配 AWS 的 metadata舒憾,所以暫時還是使用 user/password 方式訪問镀钓,且我們沒有在 userdata 中更改密碼,故可以使用默認用戶名和密碼 root/cos镀迂。整個系統(tǒng)會異常干凈簡潔丁溅,由于 Green 變種使用 openSUSE 發(fā)行版為基礎(chǔ),其內(nèi)核版本也與 openSUSE 15.3 保持一致探遵,系統(tǒng)版本也同時追蹤到 v0.8.2窟赏。


除了使用 cloud-init 機制安裝系統(tǒng)外妓柜,還可以手動使用 cos-deploy 進行安裝,可以在執(zhí)行過程中清晰看到拉取了 v0.8.2 較新的系統(tǒng)鏡像涯穷。


當然棍掐,我們也可以制作自定義鏡像并推送到鏡像倉庫中,系統(tǒng)鏡像的構(gòu)建可以依托 Dockerfile 機制拷况。以 Github Repo 中的 standard example(https://github.com/rancher-sandbox/cOS-toolkit/blob/master/examples/standard/Dockerfile)為例作煌,基礎(chǔ)鏡像使用 openSUSE 后,通過在 Dockerfile 中執(zhí)行 zypper 來安裝軟件包赚瘦,而這些軟件包則依托強大的社區(qū)來保障質(zhì)量:

ARG LUET_VERSION=0.20.6
FROM quay.io/luet/base:$LUET_VERSION AS luet


FROM opensuse/leap:15.3


ENV COSIGN_EXPERIMENTAL=1
ENV COSIGN_REPOSITORY=raccos/releases-green


ARG ARCH=amd64
ENV ARCH=${ARCH}
RUN zypper in -y \
    bash-completion \
    conntrack-tools \
    coreutils \
    curl \
    device-mapper \
    dosfstools \
    dracut \
    kernel-default \
    kernel-firmware-bnx2 \
    kernel-firmware-i915 \
    kernel-firmware-intel \
    kernel-firmware-iwlwifi \
    kernel-firmware-mellanox \
    kernel-firmware-network \
    kernel-firmware-platform \
    kernel-firmware-realtek \
    less \
…
…

我們把這個 Dockerfile 構(gòu)建成容器鏡像(如:niusmallnan/containeros:dev)粟誓,并推送到 Dockerhub。在剛才已經(jīng)啟動的 AWS VM 執(zhí)行:cos-upgrade --no-verify --reboot -d niusmallnan/containeros:dev 起意,自動重啟后鹰服,我們可以獲得一個新版本的 OS,這就是基于容器模式的 OTA 更新的基礎(chǔ)演示揽咕。訪問虛擬機可以看到悲酷,無論是 OS 版本信息,內(nèi)置軟件包心褐,以及內(nèi)核版本均發(fā)生了變化:

cOS-toolkit 還在不斷完善中舔涎,很多細節(jié)還有優(yōu)化空間。cOS-toolkit 并不是在持續(xù)提供某個發(fā)行版逗爹,而是維護構(gòu)建個性化 Container OS 的工具集亡嫌,用戶可以依托它進行 OS 的制作和發(fā)布,同時享受其帶來的容器鏡像風格的 OTA 更新機制掘而。

更多內(nèi)容請參考官方文檔:https://rancher-sandbox.github.io/cos-toolkit-docs/docs/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挟冠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袍睡,更是在濱河造成了極大的恐慌知染,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斑胜,死亡現(xiàn)場離奇詭異控淡,居然都是意外死亡,警方通過查閱死者的電腦和手機止潘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門掺炭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凭戴,你說我怎么就攤上這事涧狮。” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵者冤,是天一觀的道長肤视。 經(jīng)常有香客問我,道長涉枫,這世上最難降的妖魔是什么邢滑? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮拜银,結(jié)果婚禮上殊鞭,老公的妹妹穿的比我還像新娘。我一直安慰自己尼桶,他們只是感情好操灿,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泵督,像睡著了一般趾盐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音堪遂,去河邊找鬼。 笑死本缠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的入问。 我是一名探鬼主播丹锹,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芬失!你這毒婦竟也來了楣黍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤棱烂,失蹤者是張志新(化名)和其女友劉穎租漂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颊糜,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡哩治,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衬鱼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锚扎。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖馁启,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤惯疙,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布翠勉,位于F島的核電站,受9級特大地震影響霉颠,放射性物質(zhì)發(fā)生泄漏对碌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一蒿偎、第九天 我趴在偏房一處隱蔽的房頂上張望朽们。 院中可真熱鬧,春花似錦诉位、人聲如沸骑脱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叁丧。三九已至,卻和暖如春岳瞭,著一層夾襖步出監(jiān)牢的瞬間拥娄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工瞳筏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稚瘾,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓姚炕,卻偏偏與公主長得像摊欠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钻心,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容