作者简介

张智博,SUSE Rancher 大中华区研发总监,一直活跃在研发一线,经历了 OpenStack 到 Kubernetes 的技术变革,在底层操作系统 Linux、虚拟化 KVM 和 Docker 容器技术领域都有丰富的研发和实践经验。

背景:笔者曾经维护过一款面向 Docker 的开源容器化操作系统 RancherOS。cOS-toolkit 作为延续 Container OS 思想的新兴项目,做了更深层次的抽象。本文将逐步剖析 cOS-toolkit 的设计理念和使用方法,并分享个人的一些思考。

RancherOS 的反思

RancherOS 发布之初,Docker 正是如日中天之时,顺理成章,RancherOS 的目标就是成为一款面向 Docker 的 Container OS。除了基础的 Immutable OS 标准特性之外,我们做了很多魔改:比如把 dockerd 改为 system-docker 来替换 systemd,从而可以像管理容器一样管理一些系统服务;极致裁剪了内核,希望把它打造成以最低成本运行 Docker 的 OS;两层的 rootfs,当然用户空间的 rootfs 本质上是一个 Ubuntu/CentOS/Buildroot 等镜像运行的容器;使用 YAML 配置清单来做系统初始化,通过这种抽象来简化系统管理员的负担等等。

随着时间的推移,一些魔改的思路随着上游的发展而变得不可持续,比如 system-docker 组件始终停留在早期版本,无法进化。精简内核也带来了诸多问题,未能背靠一个强大的社区,很难持续维护这些内核以及系统组件,并在兼容性上提供可信任的保证。默认的 console 基于 Buildroot 项目构建,每次增加软件包都是非常繁琐复杂的工作,并且 Buildroot 本身追求的精简有时无法满足服务器端的需求。用户的自定义需求很难得到满足,用户通常需要等待官方版本的更新,用户自定义的技术成本非常高,难以上手。

RancherOS 的发展过程中取得了一定数量的社区用户,并尝试了小范围的商业化支持,它把想法变成现实,对于特定群体是一个好的开源项目。然而,从可持续发展角度,停止维护是一个更理性的选择。尽管,能够看到社区用户仍然在发布一些 RancherOS 的衍生版本 BurmillaOS(https://burmillaos.org/)。

cOS-toolkit 接棒下一程

cOS-toolkit 是一个构建 ContainerOS 的工具包,之前 RancherOS 本身就是一个 Linux 发行版,而 cOS-toolkit 提供了构建这种发行版更强大的抽象能力。吸取之前的一些开源项目经验,结合当下市场的主流需求,cOS-toolkit 可以带来以下关键特性:

  • 使用 Container 方式进行构建和升级。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 发行版的基础镜像之上,叠加这些 packages,就可以基于 Dockerfile 的模式构建 Container OS。这种作法可以依托每个 Linux 发行版背后强大的社区,cOS-toolkit 无需关注某个软件包如何编译集成,也不会破坏每个发行版发烧友的使用习惯。

  • 支持 OTA 更新。这个特性还处在不断进化中,Container OS 的 OTA 可以将更新内容构建后发布到镜像仓库中,通过 Kubernetes 的扩展编排能力来进行所有节点的系统升级,升级动作触发特定容器镜像更新,并应用到 cOS-toolkit 构建的 OS 中。

  • Cloud-init 支持,基于 systemd,以及不可变特性。Cloud-init 的支持能力直接反映了在公有云环境的友好程度上;而基于 systemd 是可持续性发展的一个重要选择;对 Immutable 的支持在整个设计中具有优先权,这是几乎所有 Container OS 的标配属性。
  • 简单方便的自定义。cOS-toolkit 不再只是一种发行版,它提供了更强大的自定义构建能力,用户除了可以引用 cOS-toolkit 中维护的 packages,还可以自定义 package 进行扩展,同时 cOS-toolkit 本身还简化了各种 OEM 配置(https://rancher-sandbox.github.io/cos-toolkit-docs/docs/customizing/oem_configuration/),更换 branding 以及变更初始用户名密码会非常简单。强大的自定义能力,还让用户可以针对云环境或者边缘环境等硬件规格特性来构建特定的 OS,针对各种硬件环境的驱动和软件包本身就依托背后强大的发行版社区,无论质量还是兼容性都有可靠保证。

cOS-toolkit 工程会默认构建一些基础发行版:

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

由于核心工程人员来自 SUSE,基于 openSUSE 的变种会进行较完整的测试,这些镜像介质可以在 Github Release(https://github.com/rancher-sandbox/cOS-toolkit/releases)中下载。

SUSE Rancher 已经开始用 cOS-toolkit 构建一些新兴产品,比如 Harvester OS 以及RancherOS v2。前者提供了 Harvester 集群的底座 OS,便于 Harvester 对节点进行更深层次的管理;后者未来将致力于提供可以面向 Rancher 以及 K3s/RKE2 的底座 OS,进一步简化产品部署和运维难度。RancherOS v2 也处于开源积极孵化中:https://github.com/rancher-sandbox/os2

cOS-toolkit初体验

支持公有云的友好体验已经是新兴操作系统的标配,cOS-toolkit 构建的 Green(基于openSUSE)变种完全支持 AWS/Azure/GCP 等公有云。我们以 AWS 版本为例进行初始体验,AMI 信息可以在Github Release(https://github.com/rancher-sandbox/cOS-toolkit/releases)中下载到,本文体验版本为v0.7.4。

由于这些 AMI 在构建时默认使用 UEFI 方式启动,所以部分实例类型无法支持,本次体验使用 t3.large。

默认情况下,系统初始会进入 Recovery 模式,用户可以在该模式下进行自定义安装,通过内置的安装工具配合预定义的 YAML 配置进行系统初始化安装。不过,由于我们使用 AWS 云环境,我们可以借助 cloud-init 机制来简化这一过程。在基于 cOS AMI 启动实例时(根磁盘 16GiB),配置以下 cloud-init 内容:

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 会帮助我们规划根磁盘分区表信息,同时进行初始化安装。注意 cos-deploy 时如果没有指定版本,则会安装最新版本。这意味着尽管我们使用 v0.7.4 的 AMI,但在 cos-deploy 后会在源中寻找更新的版本来部署到根磁盘中,这其实也是 OTA 更新机制的一部分。

系统安装初始化完毕后,可以通过 ssh 访问,由于还没有完整适配 AWS 的 metadata,所以暂时还是使用 user/password 方式访问,且我们没有在 userdata 中更改密码,故可以使用默认用户名和密码 root/cos。整个系统会异常干净简洁,由于 Green 变种使用 openSUSE 发行版为基础,其内核版本也与 openSUSE 15.3  保持一致,系统版本也同时追踪到 v0.8.2。

除了使用 cloud-init 机制安装系统外,还可以手动使用 cos-deploy 进行安装,可以在执行过程中清晰看到拉取了 v0.8.2 较新的系统镜像。

当然,我们也可以制作自定义镜像并推送到镜像仓库中,系统镜像的构建可以依托 Dockerfile 机制。以 Github Repo 中的 standard example(https://github.com/rancher-sandbox/cOS-toolkit/blob/master/examples/standard/Dockerfile)为例,基础镜像使用 openSUSE 后,通过在 Dockerfile 中执行 zypper 来安装软件包,而这些软件包则依托强大的社区来保障质量:

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 构建成容器镜像(如:niusmallnan/containeros:dev),并推送到 Dockerhub。在刚才已经启动的 AWS VM 执行:cos-upgrade --no-verify --reboot -d niusmallnan/containeros:dev ,自动重启后,我们可以获得一个新版本的 OS,这就是基于容器模式的 OTA 更新的基础演示。访问虚拟机可以看到,无论是 OS 版本信息,内置软件包,以及内核版本均发生了变化:

cOS-toolkit 还在不断完善中,很多细节还有优化空间。cOS-toolkit  并不是在持续提供某个发行版,而是维护构建个性化 Container OS 的工具集,用户可以依托它进行 OS 的制作和发布,同时享受其带来的容器镜像风格的 OTA 更新机制。

更多内容请参考官方文档:https://rancher-sandbox.github.io/cos-toolkit-docs/docs/

cOS-toolkit:Container OS 的下一程的更多相关文章

  1. Mac OS X 下安装使用 Docker (2017年7月)

    两年前的一篇 Mac OS X 下安装使用 Docker 安装时还是用的 boot2docker, 如今进化到了在 Mac OS X 下用 Docker Toolbox, 而且命令也由 boot2do ...

  2. Mac OS X 下安装使用 Docker

    它依赖于 LXC(Linux Container),能从网络上获得配置好的 Linux 镜像,非常容易在隔离的系统中运行自己的应用.也因为它的底层核心是个 LXC,所以在 Mac OS X 下需要在 ...

  3. 在Mac OS X 下快速安装Nginx

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica; color: #8e68ff } p.p2 { margin: 0.0p ...

  4. 桂电在linux、Mac OS环境下使用出校器(支持2.14)

    这是guetsec学长在三院科协学长所抓包逆向分析1.81版出校器的基础上,用python写的一款为Mac和linux环境开发的出校器. 最后我做了略微修改,支持暂时最新版本2.14.下面有直接从源码 ...

  5. 在MAC OS X下安装usb转串口驱动(PL2303主控芯片)

    本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重!       因为最近手里有一块STM32Discovery开发板,所以想搞一下STM32的开发,我前面的 ...

  6. 在Mac OS X下安装Android Studio

    在Mac OS X下安装Android Studio只需要几步. 1. 下载Android Studio安装包(.dmg). 2. 打开Terminal输入java -version命令查看是否已安装 ...

  7. Qt在Mac OS X下的编程环境搭建

    尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/46234079 在Mac OS X下使用Qt开发,需要 ...

  8. Mac OS X下环境搭建 Sublime Text 2 环境变量配置 开发工具配置Golang (Go语言)

    Golang (Go语言) Mac OS X下环境搭建 环境变量配置 开发工具配置 Sublime Text 2 一.安装Golang的SDK 在官网http://golang.org/ 直接下载安装 ...

  9. Mac OS平台下应用程序安装包制作工具Packages的使用介绍(补充)

    上一篇:Mac OS平台下应用程序安装包制作工具Packages的使用介绍 补充说明 上一篇文章中介绍了如何使用Packages如何创建mac下的安装包.但是这样制作出来的安装包只能安装到系统的文件路 ...

  10. 如何解压 Mac OS X 下的 PKG 文件(网摘)

    如何解压 Mac OS X 下的 PKG 文件 原文出处:[Macplay] 有时候我们可能需要解包 PKG 格式的安装文件包,在 OS X 系统下完成该操作并不需要你额外再安装软件,系统内置的命令就 ...

随机推荐

  1. 支持API自动化测试,实现复杂的测试场景并输出报告

    老旧的系统需要与新的业务系统进行衔接,内部与外部的API需要相互调用,云上云下要互联互通等等.企业在数字化转型中会面临着种种.对于传统的集成技术而言难以突破的复杂集成技术难题.RestCloud iP ...

  2. 给 DBA 的七个成长建议-九五小庞

    在采访的最后,谈及一名优秀的DBA应该具备哪些素质或能力时,李建明根据自己十多年的职场经验,分享了他的看法并给出了七个建议: 1. 具备扎实的数据库理论功底. 比如数据库系统的概论.数据库的核心概念. ...

  3. Windows10 21H2 X64位(1944.1147) 优化版

    MSDN Windows10 21H2 X64位(1944.1147) 优化精简版系统,使用流畅,体积小巧,适合日常使用. 本系统基于最新发布的Windows 10 21H2,内部版本1944.114 ...

  4. DP 好题题单整理

    可能会持续更新,但是可能会被我放着不管. 题目 思路 数字序列 对最长不下降子序列模型的理解 Circling Round Treasures 一道状压好题 星空 一道重点不在于 \(dp\) 的思维 ...

  5. (译) 理解 Prometheus 的范围向量 (Range Vector)

    Prometheus 中 Range Vector 的概念是有一点不直观的,除非你彻底阅读并理解了官方提供的文档.谁会这样做呢,去读官方文档?大多的人应该会花些错误的时间去做了一些错误的事情,然后随机 ...

  6. vite 生产打包后报错 xx is not a constructor

    版本 vite: "^5.0.11" 解决方法 添加 optimizeDeps.disabled = false 和 build.commonjsOptions.include = ...

  7. Linux标准大页没有使用案例分享

    背景介绍 一套在RHEL的集群上运行的Oracle实例,是用systemd服务启动Oracle实例的(方便集群的切换操作).在测试过程中发现标准大页没有被用上. 具体情况如下所示: $ grep Hu ...

  8. Java程序基础——4.布尔运算

    目录 Java布尔运算:逻辑判断的核心机制 布尔运算的基本类型 比较运算符 逻辑运算符 运算优先级规则 关键特性:短路运算 与运算的短路特性 或运算的短路特性 三元运算符:简洁的条件判断 三元运算符的 ...

  9. [题解]P5431 【模板】模意义下的乘法逆元 2

    可恶,卡常好难受. P5431 [模板]模意义下的乘法逆元 2 将分数通分,第\(i\)个分数是\(\frac{k^i*fac\div a[i]}{fac}\),\(fac\)表示所有元素的积. 我们 ...

  10. ace.js实现一个在线代码编辑器

    https://www.w3cschool.cn/tryrun/runcode?lang=javascript https://ace.c9.io/build/kitchen-sink.html 背景 ...