Kubernetes 微内核的分布式操作系统

如今,Kube.NETes 已经成为分布式集群管理系统和公有云/私有云的事实标准 。实际上,Kubernetes 是一个分布式操作系统,它是 google 在分布式操作系统领域十余年工程经验和智慧的结晶,而 Google 一直以来都管理着世界上最大的分布式集群,在分布式操作系统领域的研究和认识领先于全世界 。因此,2014年发布的 Kubernetes 能在短短几年时间内就超越了诸多前辈,大获成功 。
作为分布式操作系统,Kubernetes(包括其前代产品 Google Borg)的出现远远晚于 UNIX、linux、windows 等著名的单机操作系统,Kubernetes 架构设计自然地继承了很多单机操作系统的珍贵遗产,微内核架构就是这些遗产中最重要的一份 。在本文接下来的部分,我们将专注于微内核(microkernel)这个概念及其对 Kubernetes 架构的影响 。
一、什么是微内核?在介绍微内核的时候,我们有必要同时回顾一下单机操作系统的历史,以理解其价值所在 。本章中以「操作系统」指代「单机操作系统」 。
1.1 UNIX 的兴起
电子计算机诞生之后,在上个世纪70年代以前,出现过许许多多的操作系统,DOS、OS/360、Multics 是其中的知名代表,这是操作系统领域的拓荒时代 。20年来的拓荒孕育出了伟大的成果:随着 CPU 技术的发展,UNIX 于1969年诞生了,这是一个真正意义上的分时操作系统 。

Kubernetes 微内核的分布式操作系统

文章插图
 
借助新的 CPU 技术的支持,UNIX 将软件系统划分为内核(kernel)和用户态程序(userland programs)两部分 。
内核是一组中断处理程序的集合,把硬件的能力封装为操作系统功能调用(system calls),用户态程序通过系统调用使用硬件功能,用户态程序运行于各自的进程中,所有用户态进程都共享同一个内核,每当系统调用或中断发生,UNIX 便陷入(trap)内核,内核执行系统调用,与此同时,内核中的分时调度算法将决定把 CPU 交给哪个进程,并管理进程的上下文切换 。另外,UNIX 把(几乎)所有硬件都封装为文件 。
UNIX 还提供了一个特殊的用户态程序 shell,供用户直接使用系统,通过内核提供的进程间通信能力,shell让 用户可以把一系列应用程序组合起来,处理复杂的需求,作者称这个设计思想为「KISS」(Keep It Simple and Stupld) 。UNIX 的所有设计思想在当时是都是非常了不起的创举 。
UNIX 不但自身对业界产生了巨大的直接贡献,还成为所有现代操作系统的蓝本,两位作者 Ken Tompson 和 Dennis Ritchie 因此荣获1983年度的图灵奖 。
UNIX 诞生于贝尔实验室,该实验室属于美国国家电信电报公司(AT&T),见识到 UNIX 的强大威力之后,AT&T 做出了一个看似无私的决定:将 UNIX 开源(初期只对大学开源),这使得所有现代操作系统得以诞生 。虽然 AT&T 最终被分拆,辉煌不再,但这个决定对人们的贡献绵延至今 。在21世纪20年代的今天,无论是 macOS、Windows、Linux,都直接受到 UNIX 的影响,而 IOS 来自 MacOS,Android 来自 Linux,因此 UNIX 的灵魂仍然活在每个人的手机中、活在每个手机 App 后台的服务中 。
此外,UNIX 诞生之时,还附送了一项比操作系统本身价值更大的副产品:Dennis Ritchie 为开发 UNIX 设计了C语言,C语言成为了所有流行的现代编程语言的主要设计来源,不仅如此,C语言在其诞生近40年后的今天,仍然是最重要的编程语言之一 。
值得一提的是,当时 UNIX 的主要开放对象是伯克利、卡内基梅隆等研究型大学,文理学院规模较小,没有研究生项目,不属于 AT&T 的主要开放目标,因此 Olivet College 毕业的一位小哥未受到 UNIX 思潮的影响 。这位名叫 David Cutler 的软件天才于1975年在 DEC 设计了 VMS 操作系统,VMS 和最初的 UNIX 一样,运行在 PDP-11 上,但并不是基于 UNIX,而是独立设计的 。VMS 在业界没有掀起大浪,以兼容 UNIX 告终 。后来 David Cutler 离开 DEC,加入微软,在那里谱写了属于他自己的传奇 。有趣的是,乔布斯也曾在文理学院就读,看来美国文理学院的学生是不走寻常路的 。
1.2 微内核的兴起
UNIX「一切皆文件」的设计带来了用户程序设计的很多便利,但它要求所有对硬件的封装都要在内核态,因此内核中模块的 bug 会让整个系统受到影响,比如说,如果某个设备驱动有内存泄漏,所有使用该设备的用户态进程都会有内存泄漏,如果某个内核模块有安全漏洞,整个系统的安全性将不再可控 。
为了解决这类问题,上个世纪70年代,操作系统研究者们开始发展「微内核」的概念,微内核的本质是让操作系统的内核态只保留内存地址管理、线程管理和进程间通讯(IPC)这些基本功能,而把其它功能如文件系统、设备驱动、网络协议栈、GUI 系统等都作为单独的服务,这类服务一般是单独的用户态 daemon 进程 。


推荐阅读