

前半场
容器(containers)这个词汇,最早只是操作系统级虚拟化(OS-level virtualization)的一些实现方案的专有名称。只不过在当下的语境里,这两个概念基本上已经等同了。“操作系统级虚拟化”指的是系统允许存在多个“用户空间(user space)”,这些空间与外界隔离,如同沙箱(sandbox)一样,在其中运行的进程只能访问到被分配的资源(包括存储、网络、计算能力等),从隔离空间内的进程视角来看,它的运行环境与普通的操作系统并没有区别。
这类技术最早可以追溯到1979年,由贝尔实验室发布的Unix第七版(Seventh Edition Unix,或称Version 7 Unix)。这一版的Unix系统新增了chroot系统调用,它的功能是将当前进程及其子进程“视角下”的系统根目录修改为一个特定的路径。chroot命令将目标进程约束在了一个限制性的文件系统内,这个自定义的文件目录就会被该进程识别为系统根目录“/”,相当于加了一层“天花板”,隔绝了文件目录的外部世界。
chroot功能为系统级软件的开发和测试提供了很大的便利,因为对于复杂的系统级应用,每一次构建或测试都可能“污染”环境,有了chroot后,就可以方便地“销毁”和“重置”依赖环境了,也不用担心意外情况会破坏操作系统。
在2000年,FreeBSD v4.0推出了jail机制, 它进一步扩展了传统Unix上的chroot。除了提供完全的文件系统沙箱功能(由于chroot缺乏安全性设计,根进程是可以脱出限制目录的,所以chroot的文件系统沙箱功能算不上是完全的),jail还进一步实现了网络与运行空间的隔离。jail是“监狱”的意思,虽然有点难听,但比起“沙箱”这个词则更为形象直观。据说,后来“越狱(Jailbreaking)”这个名词就是来源于此。
在2004年,Oracle Solaris推出了Solaris Containers功能,jail与Solaris Containers分别是历史上第一和第二个商用的操作系统级虚拟化工具。而Linux也分别于2001年和2005年推出了功能类似的Linux-VServer与OpenVZ,不过它们未进入Linux kernel,需要通过内核补丁的方式安装后才能使用。
后半场
2006年,AWS(Amazon Web Service)推出EC2等弹性计算服务,正式宣告了云计算商业化时代的到来。此后很长的时间内,相比于IaaS(Infrastructure as a Service,基础设施即服务)业务的飞速发展,PaaS(Platform-as-a-Service,平台即服务)业务却一直不温不火,毕竟用户不喜欢过于受限的、缺乏掌控的环境,传统PaaS。
2013年3月,一个在PaaS领域默默无名的公司dotCloud,宣布开源自己的容器引擎Docker,没想到从此开创了一个时代。Docker凭借轻量化、标准化,特别是image等开创性的设计优势,从一个更贴近用户实际的角度出发,迅速获得了市场的认可,形成了围绕Docker的开源社区。可以说,Docker颠覆了PaaS,也可以说,Docker重新定义了PaaS。
我们常说的IaaS、PaaS、SaaS,实际上是来自于云服务模型(Cloud Service Models)的概念。我其实不建议从这个视角对Docker和Kubernetes进行过度解读,因为随着时代的发展,PaaS的含义也在不停发生改变,我们很难找到一个清晰的轮廓去界定它们,这种状态正如吴晓波如下一段话所表达的那样:


—— 吴晓波 《腾讯传(1998-2016)》

Kubernetes在官方文档中也提到,它不是一个“传统的”、“包含一切”的PaaS系统。

2013年10月,dotCloud更名为Docker, Inc.,并于次年出售dotCloud原有的PaaS业务。这时的Docker雄心勃勃,它寄希望从容器技术出发,拓展出更广泛的产品和商业空间。
2014年12月,Docker发布了Docker Swarm,目标是解决主机集群的容器调度问题。接着,Docker发布了Docker compose和Docker Machine,前者实现了单主机下的容器编排功能,后者解决了多平台下容器运行环境的问题。从这个“三板斧”中就可以看出,Docker谋求的是打造完整的、平台级的、生态化的产品,而不是屈居于较底层的解决方案。但是,想打造上层平台级产品的远不止Docker一家,随着CoreOS、Redhat、Google等厂商加入竞争中来,局势使得Docker渐渐难以招架。
在Docker Swarm发布的半年前,也就是2014年6月,在容器领域已经深耕多年的Google,正式发布了Kubernetes,这是Google内部的大规模集群管理系统Borg的开源版,如今Kubernetes已经成为容器领域事实上的行业标准。
本身依靠开源社区飞速发展的Docker,在占据市场有利地位之后,渐渐走上了“一家独大”的道路,引起了容器这条赛道上其他人的忧虑。
Google于2015年4月领投了CoreOS公司1200万美元,目的是借由CoreOS自研的容器引擎Rocket(简称rkt)制衡Docker,Kubernetes也宣布支持rkt。
2015年7月,为了避免恶性竞争的扩大化,相关厂商之间达成共识,由Docker牵头建立OCI(Open Container Initiative,开放容器倡议),并交由非盈利性的、中立的Linux基金会( Linux Foundation)管理。OCI致力于建立标准化的容器运行时规范(Runtime Specification)与容器镜像规范(Image Specification)。OCI的成果是,Docker将容器运行时Libcontainer的管理权交给基金会,改造为runC项目,作为规范的实现。
在同一个月,由Google领衔、Redhat等云计算厂商参与(华为云也是22个初始会员之一),建立起云原生计算基金会(Cloud Native Computing Foundation),它同样隶属于Linux基金会。CNCF的口号是“为云原生软件建立可持续的生态系统(Building sustainable ecosystems for cloud native software)”,目标是以Kubernetes为基石,建立起一个高质量的云原生基础设施的开源社区。

2016年,kubernetes与CNCF生态进入了高速发展期。这一年,kubernetes更新到1.5版本,推出了我们现在熟知的kubeadm等工具。Prometheus项目也在这一年正式加入CNCF,它后来成为了容器监控事实上的标准。也是这一年,出现了一款现象级手机游戏Pokemon Go,为了应对全球狂热的游戏玩家的负载压力,它运行在当时最大规模的Kubernetes集群上,系统超过了1000个node。
2017年,Docker将高级容器运行时containerd(控制runC的守护进程,用于管理环境内的容器)捐赠给CNCF,它后来成为生态中运用最广泛的容器运行时。同年,Docker项目改名为moby,继续由开源社区进行维护,Docker则转变为了商业产品,主要服务于付费的企业用户(仍存在一个包含基础功能的免费ce版)。这一年,随着Docker公司完成了战略性的大调整,Docker彻底退出头部竞争的舞台。
2020年,在各项条件成熟之后,kubernetes v1.20标明,kubernetes 内部的CRI(容器运行时接口,container runtime interface)开始弃用Docker,并将在后续版本中正式移除对Docker的支持,用户可以选择containerd或cri-o进行代替。
当我们回望历史,再去看待kubernetes移除Docker这件事的时候,一切就显得那么合情合理了。一方面,Docker本身是不支持CRI的,所以原来kubernetes为了支持Docker就需要加一个docker-shim组件进行转接,如今移除Docker可以让系统整体更整洁,为开源社区减少了不必要的维护负担。更重要的是,随着OCI和CNCF的持续茁壮成长,kubernetes已经不再需要Docker这个“外人”了。
CNCF截至目前已有接近600家会员公司,其中不乏中国公司的身影。仅在23个铂金级会员中,就能看到阿里云、京东云、华为云、火山引擎4家中国公司。
CNCF在2020进行了一次云原生应用的调查,收集到共计1324 份有效样本,来自欧洲、北美、亚洲等主要地区,其中有 30% 以上是 5000 人规模以上企业,60% 以上为 100 人规模企业和组织。其中有 30% 以上是 5000 人规模以上企业,60% 以上为 100 人规模企业和组织。
这次调查的数据显示:在生产中应用容器的比例从上一年的 84% 增长到92%,相比 2016 年增长了 300%。生产中应用 Kubernetes 的比例从上一年的 78% 增长到 83%。


立足小城,侧耳听风
2021年,陪你聊聊云原生、交互设计、技术管理




