从Docker到OpenShift(二)
1.Kubernetes与Docker的关系
在第一次接触到K8s的时候,我以为这个技术和Docker有一定的关系,毕竟一个的logo是驮着集装箱的鲸鱼,而另一个是船的舵轮,都是在虚拟化技术的大海中乘波驶浪的实现方式。

不过在对K8s有更多的了解后,我认为这两者并不能放在一个维度上进行讨论,两者所面向和解决的问题并不相同。Docker是非常流行的Linux容器解决方案,这我们在之前的文章中已经有了一定的了解。而K8s是一个容器编排的解决方案,主要面向的是集群管理,K8s支持对接多种容器,Docker并不是K8s对容器的唯一选择,比如K8s还支持Apache开源的Mesos容器等等。只要容器实现了K8s容器运行时的接口约定,都可以被K8s调度。
我认为某种意义上,是容器的大规模使用,引入了新的问题,从而催生了容器的编排技术,把许多Container抽象,对外部使用者来说,并不关心容器内部的应用是如何运行的,而是关注以下问题:
如何部署、调度、管理容器中的应用?
如何在升级程序的时候不中断对外的服务?
容器里的程序是否是正常运行的?
如何方便地根据业务去调整容器里的应用?
其实Docker的公司也推出过他们的容器集群管理方案Docker Swarm,某种意义上是K8s的竞品,但是在IT行业的生产中并没有流行起来,究其原因可能有以下几点:
该方案和Docker绑定的程度太深,Docker本身是非常优秀的container方案,但是Swarm本身的功能非常有限,而且在刚推出的时候并不成熟
Google在推出K8s的时候,已经是一个比较成熟的方案了,并且归功于谷歌在大规模集群管理上的经验,谷歌给出的解决方案是非常高屋建瓴并且实用的
IT行业的规则是赢者通吃,使用的越为广泛的方案会有更加成熟的社区和公司去推动建设。
虽然K8s的配置更为复杂,但是它同时提供了更为灵活的部署方案,K8s的自动管理生命周期、自动恢复、模块化的架构设计,都是在生产中更具有实用价值的。如果我们想要学习K8s,实际上并不一定要会Docker。学 K8s 更多是让开发的服务能运行在 K8s 集群上,依托 K8s 集群管理、调度的能力让服务变得更具鲁棒性、更便于调整。对于Docker,需要有一个概念上的认知,如果有需要,再去学习就可以了。
2.K8s的起源
众所周知,K8s起源于Google的开源,不过K8s的前身,在Google内部真正使用的系统叫做Borg。据说Google在Linux内核还没有CGroup和容器的情况下,造出了同样的东西。也有传言说Google将Brog中的一些边缘技术通过Golang来实现,变成了Kubernetes。当然,Google的说法是K8s吸取了Borg的优秀理念,Google的开源可谓是“纯粹的奉献”。像Google这样的IT行业领头公司,有许多开发的项目,当然也有很多因为各种原因不再继续进行维护的项目,Google Graveyard - Killed by Google这个网站记录了Google曾经开发,现在已经是Dead Project的项目。有趣的是,该网站的作者曾经被Google聘请,不过作者本人拒绝了。不得不说,通过开源建立生态,培养用户,吸引企业用户上Google云去获得非阉割版本的性能是很高明的商业策略,这就是巨头的玩法。
K8s提供了什么?我认为K8s最重要的一点是能够做到把容器部署为服务,这也是IT行业一直说的XaaS( CaaS、laaS、PaaS)。K8s提供了Pod、Service等机制,帮助用户构建跨多个容器的应用服务、跨集群调度、扩展这些容器,并长期持续管理这些容器的运行健康状况;除此之外,它还可以根据用户设定的策略来自动管理用户的服务。
如果作为服务的使用者来看,我们关心的是什么?我认为主要是服务的质量与可靠性,也就是说要保持服务的高可用性,这也是2B的IT服务提供商最需要做到的事情。假设有一个服务通过Pod1运行在机器1上,这时候K8s探测到机器1有问题或者处于离线状态,那么K8s就会把这个Pod在另一台机器2上重新拉起,并继续提供对应的服务,看起来这样的方案非常的合理。然而,请思考这样一个问题:我们如何确定机器1确实没有在工作了?在这里我想引入一个电脑领域的假想实验:Two Generals’ Problem,只有当收到回复并且再次对回复的内容做出回应之后,我们才认为信息是可靠的。然而对于机器1来说,信息显然已经不能再传递,我们应该如何保证机器1上的Pod1没有继续对数据进行修改呢?在分布式集群系统中这是一个非常常见的需要进行处理的问题,这就是“脑裂”(split-brain)现象。我们需要保证新的数据服务启动后,确保旧的服务不在能对数据进行处理或者访问修改,从而保证数据的完整性,这个机制叫Fencing。怎么去解决这个问题,我想IT行业应该已经有许多成熟的方案,而我并不了解,也不是在这里我想要去探讨的问题。
提到K8s,不得不提的就是“云原生”这个概念。
TBD