1.2 Kubernetes的诞生
让我们从故事的开头讲起……
Amazon Web服务(Amazon Web Services, AWS)通过其现代云计算产品改变了世界。自那时起,大家都在尝试追赶AWS的步伐。
其中一个公司就是Google。Google内部也有非常出色的云技术,并且希望通过某种方式吸取AWS的经验,使其潜在用户能够更加容易地使用Google云。
Google在将容器用于扩缩容方面有丰富的管理经验。例如,类似搜索和邮箱这种大型的Google应用,已经在极大规模的容器云上运行多年了——远早于Docker这种易于使用的容器产品。为了编排和管理这些容器化的应用,Google内部有一套专门的系统。他们利用来自这些内部系统的经验,创建了一套新的平台,名为Kubernetes,并将其作为开源项目于2014年捐赠给了当时刚刚成立的云原生计算基金会(Cloud Native Computing Foundation,CNCF),Logo如图1.1所示。
图1.1
自此以后,Kubernetes就成为了世界上最重要的云原生技术。
与许多现代云原生项目一样,Kubernetes通过Go语言编写而成,开源在GitHub上(项目名为kubernetes/Kubernetes),开发人员在IRC频道上进行沟通,人们也可以在Twitter上关注它,slack.k8s.io是一个不错的用于沟通的Slack频道。除此之外,还有一些定期举行的见面会或大型会议。
1.2.1 Kubernetes和Docker
Kubernetes和Docker是两个互补的技术。比如,通常人们会使用Docker进行应用的开发,然后用Kubernetes在生产环境中对应用进行编排。
在这样的模式中,开发者使用自己喜欢的语言编写代码,然后用Docker进行打包、测试和交付。但是最终在测试环境或生产环境中运行的过程是由Kubernetes来完成的。
从运行架构上来说,假设在某生产环境中的Kubernetes集群是由10个节点构成的。那么其中的每个节点都是以Docker作为其容器运行时(Container Runtime)。也就是说,Docker是一种更加偏向底层的技术,它负责诸如启停容器的操作;而Kubernetes是一种更加偏向上层的技术,它注重集群范畴的管理,比如决定在哪个节点上运行容器、决定什么适合进行扩缩容或升级。
图1.2阐释了由多个以Docker为容器运行时的节点构成的Kubernetes集群。
图1.2
如图1.2所示,Docker并非Kubernetes唯一支持的容器运行时。事实上,Kubernetes基于一系列特性实现了对容器运行时的抽象(从而可以兼容不同的底层容器运行时)。
(1)容器运行时接口(Container Runtime Interface, CRI)是Kubernetes用来与第三方容器运行时进行对接的标准化的抽象层。这样容器运行时与Kubernetes是解耦的,同时又能够以一种标准化的方式予以支持。
(2)运行时类(Runtime Class)是Kubernetes 1.12引入的新特性,并在1.14版中升级为beta。它对不同的运行时进行了归类。例如,gVisor或Kata容器运行时或许比Docker和Containerd能提供更优的隔离性。
至本书撰写时,Containerd已经赶超Docker成为Kubernetes中最普遍使用的容器运行时。它实际上是Docker的精简版本,只保留了Kubernetes需要的部分。
虽有提及,不过这些底层技术不会影响到Kubernetes的学习体验。无论使用哪种容器运行时,Kubernetes层面的操作(命令等)都是一样的。
1.2.2 Kubernetes与Docker Swarm对比
2016—2017年间,在Docker Swarm、Mesosphere DCOS以及Kubernetes之间展开了一场容器编排平台之战。总之,Kubernetes赢得了胜利。
虽然Docker Swarm和其他容器编排平台依然存活,但是它们的发展势头和市场份额都小于Kubernetes。
1.2.3 Kubernetes和Borg:抵抗是徒劳的
读者很可能听到过有关Kubernetes与Google的Borg和Omega系统的关系。
如前所述,很久以前Google就已经大规模地运行容器了——每周都可能运行数十亿个容器。所以,多年以来,Google的搜索、Gmail和GFS等就已经在许多的容器中运行了。
对这些容器化应用的编排工作,是由Google内部被称为Borg和Omega的技术来完成的。所以Kubernetes的出现也是水到渠成的事——毕竟它们都是大规模容器编排平台,而且同出Google之门。
然而需要明确的是,Kubernetes并非Borg或Omega的开源版本。更恰当地说是Kubernetes与Borg和Omega有着相同的基因和家族史。就像是Borg最先出生,然后孕育了Omega。而Omega又与开源社区“比较熟”,并孵化了Kubernetes,如图1.3所示。
图1.3
问题在于,它们是不同的,但又是相关的。事实上,许多Borg和Omega的研发者也对Kubernetes有所贡献。所以,尽管Kubernetes是从头开始研发的,但是也吸收了来自Borg和Omega的经验。
目前,Kubernetes是于2014年捐赠给CNCF的开源项目,基于Apache 2.0协议。其1.0版本早在2015年7月就已发布,至本书编写时,已经到达1.16版。
1.2.4 Kubernetes——名字从何而来
Kubernetes(读作koo-ber-net-eez)一词来源于希腊语“舵手”——轮船的掌舵之人。这一主题也在图标(见图1.4)中得以体现。
Kubernetes的部分创始人想将其称作九之七(Seven of Nine)。如果读者了解星际迷航,就会知道九之七是一个被联邦星舰企业号解救的女性博格(Borg),下令解救她的是凯瑟琳·珍妮薇舰长。然而,版权法不允许用这个名字。不过图标中的“七个把手”也有向“九之七”致敬的意味。
图1.4
关于名称需要交代的最后一点是,Kubernetes经常被写作K8s。其中的数字8替代了K和s中的8个字母——这一点倒是方便了发推,也方便了像我这样懒惰的人。