作者簡介
張智博,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/