这是一篇草稿

封面图:Sealed Computers, Atelier de la Lanterne, Nice, France, 1992-98.

这些计算机在持续生成无穷无尽的随机图像流。然而,这些图像哦从一开始便被隔绝于观看之外,永远不会为任何人所见。

本文记录了我简历自己的超融合 k8s 集群的过程中经历的各种论证和折腾,描述了一个朴素可行的 bare-metal HCI 集群的方案。

一点历史

为了说清楚这一切的来龙去脉,我需要讲亿点历史。

单一共享主机

自从 70 年代中期 Unix 发展起来以后(啊?要从这里开始么?计算机历史爱好者又开始了,受不了一点,完全的 CHM 思维),因为主机很昂贵,所以它几乎总是被一群人共用的,通过诸如 RS232 串行电缆、建筑内的电话线、公共电话交换网等方式,引出到很多哑终端供人使用。在 Unix 像野火一样传遍各地高校的同时,计算机基础设施工程的历史开始了,不过当年这个职业还叫系统管理员。他们的工作在现在看来很朴素:一个部门或者组织通常只有一台主机,或者少得一只手都数得过来;所有的硬件资源,诸如进程空间、文件系统、I/O,还有后面最新最热的 TCP/IP,都是在单一巨型主机的范围内考虑的。管理员的职责是随时保证这些资源被正确分配、追踪、计费,保证接在主机上的几个存储设备作为(主机范围内)全局一致的source of truth 能得到及时的备份。剩下的时间,就可以坐下来慢慢喝咖啡、折腾一些魔法小脚本,以及等着随时去处理源源不断的沙雕用户们捅出来的篓子。Good old days, nice and easy.

这当然离 60 年代末、Unix 的前身,Multics 项目的愿景差的很远。这个雄心勃勃的项目颇具 60 年代乐观现代主义的气息,认为只要堆砌足够复杂的系统和先进的计算机技术,计算资源最终能像电力一样无处不在,用电网一样的东西送到千家万户桌上的终端里,大家一起在同一台主机上哈啤。不过听说过这个故事的读者可能立即发现哪里不对:电网是个网,由分散各地的一堆发电厂共同驱动;那这里大量用户共用的巨型主机又该怎么在用户需求增多的时候,像多建一个发电厂一样水平扩展呢?这本来对于电网来说都不是一个简单的问题,何况是复杂了不知多少倍的通用计算资源。不过 Multics 项目可能还没活到被这个问题困扰的时候,就已经被自身的复杂性给击倒并劳大了。

“啊,对对对,(分时)计算机晚上会变快。

——Bob Taylor, https://archive.computerhistory.org/resources/text/Oral_History/Taylor_Robert/102702015.05.01.acc.pdf

这样单一主机、全局一致共享状态的前提假设贯穿了 Unix 的各种原生设计,知道大家真的发现这样的假设不再成立,而且已经积重难返。Unix 的设计者们在 80 年代意识到问题后另起炉灶整了个 Plan 9,不过这玩意儿的故事又是另一篇博客的篇幅了。Plan 9 在相对高速低延迟的局域网情形下给出了多主机协作的优雅解决方案,不过它从 80 年代一直闭门开发到 90 年代,生不逢时,出山的时候已经是 PC 和互联网的 hype风头正热的时代了,再加上 AT&T 自身难保拆分贝尔实验室,所以立马寄了;Plan 9 的主帅 Rob Pike 撂下一句 Systems Software Research is Irrelevant 便离职了。 但是他和 Plan 9 的故事远未结束,后面要考。

互联网

当我们跳过 80 年代 Unix 商用化闹出来的各种风风雨雨、 Unix 工作站的起落兴衰,来到 90 年代初之后,情况发生了巨大的改变。

比起共享的主机,显然用户更喜欢拥有差不太远的性能,但是竟可以摆在自己办公桌上自己独享的 Unix 工作站, 毕竟它不会只有晚上才跑得更快。然而,这种一人一工作站模式的推广不可避免地又涉及到了多主机协作的问题:比如如何有效共享文件和 I/O 设备(比如打印机),如何保证同一个用户身份在多个计算机上一致,等等。以 SUN 为代表的一众 Unix 工作站制造商通过裱糊 Unix 给出了比另起炉灶的 Plan 9更具兼容性的一套技术,很受欢迎。其中就包括后面要提到的 Network File System (NFS)。

之前提到的大学圈子里的 Unix 主机已经成为了事实标准并有了自己的文化;个人计算机(PC)以 quick-and-dirty 的风格和够用就行的灵车操作系统开辟了主流市场并将计算机送进了千家万户;从军方研究项目走出来到学界再进入工业界的互联网则方兴未艾。此时,互联网的技术需求终于将单一主机模型的本质问题摆到了主流工业界的台面上。

纯正血统的共享主机,不管是 IBM 的封闭王国还是当年 Unix mainframe 开放联盟的子孙,缩回了它们的安全区。学术 Unix 圈希望能把 Unix 世界的种种好处搬到廉价的 PC 世界里,这样穷得吃土的研究生们就能窝在宿舍里爽爽搞机了。在几轮吃鸡后,一个击败了对手 386BSD 和 GUN/KURD、同样有些 quick-and-dirty,但是工程演进意外得靠谱的 unix-like 脱颖而出,这就是 Linux。作为一个以兼容 Unix 世界的一切并追求榨干 PC 的羸弱芯片的最后一滴性能的系统,它同样采取务实的路线,继承了 Unix 对资源不横跨主机的假设。

于是 90 年代的计算基础设施分裂成了两个具有同样缺陷的世界。一方面,政府和银行等大型组织在自家重金建设的机房里摆着真正意义上的 mainframe和它的子子孙孙(大型机、中型机、小型机,它们的架构可不是一个放大版的 PC),用堆料和边际成本幽默的 scaling 方式来勉强满足功能保守,但是可靠性要求高的需求。另一方面,雨后春笋般涌现的小网站被用廉价灵车 PC 架设了起来,跑着当年同样也很灵车的 Linux。这些 PC 被放在各地各种草台小 ISP 的小黑屋里(这是 IDC 的祖爷爷),HTTP 服务器在 serve 着本地的静态文件,炫酷一点的还能按需执行一些脚本来完成一些业务逻辑,需要持久化的状态同样以文件形式存储在本地。不过很快这样的模型就不堪用了:请求像潮水般用来,用户数据成倍增长。管理员们希望能将不同的服务分散到多个机器上,通过组合不同性能取向的机器来降低瓶颈、减少浪费。HTTP 反向代理和静态 serving 被拆出来了,放在内存大的机器上;CGI 环境被拆出来专心执行业务逻辑,放在处理器强的机器上;存储服务被拆出来放在大盘鸡上。HTTP 的整个生态迅速膨胀,适应了这些机器之间的复杂通信。听起来很完美,只有一个问题:

存储怎么办?

当年的系统管理员自然搬出来了在局域网小澡盆里人见人爱的 NFS。结果用了一段时间之后发现,坏了,性能爆了,修都修不好的那种。而且更糟糕的是,对于每个文件系统,NFS 服务器从原理上讲只能有一台,如果它宕机了,整个网站都歇菜了,得开车去小黑屋激情修理。

当年 NFS 的成功的背后,是局域网环境的可控延迟和更宽松的可用性需求,把分布式一致性的两难问题给掩盖了;这样的问题在 Web 时代让 NFS 开始水土不服,毕竟办公室里的同事会暗示下班,隔着一个互联网面目模糊的海量用户们可不会下班。

……

这些灵车小网站便在这样的架构下凑合着用了下去。

虚拟机和传统数据中心

学界:x86 架构太复杂了,历史包袱太多了,我们的理论说明它完全不适合虚拟化。

VMWare 的两个天不怕地不怕的年轻人:那我手里的这个是什么?

时间来到 2000 年代。第一次互联网泡沫吞噬了前述如雨后春笋般涌现的各路小网站,活下来吃鸡的互联网公司开始往更集中、规模更大的方向发展。

云计算革命

有一个靠在网上卖书起家的神秘小公司(你猜)活过了泡沫,开始做大做强。

容器化革命

这里另起一条线。

垃圾佬之乐

图 1 TUNA 群罪大恶极

两朵小花💮💮

Fabriquons un internet convivial!

— Deuxfleurs