思考:单容器实例能否支撑企业级应用?
之前,小陈已经能够采用Docker在单容器上完成WordPress网站的构建、发布和运行了。经过公司评估后,计划让小陈把WordPress网站部署到生产环境上,正式上线运营。小陈觉得这个任务重大,由于缺少经验,决定找大刘请教。
小陈:师傅,我刚在容器上搭建过公司网站,现在要在生产环境中搭建公司网站,我感觉只用容器来搭建恐怕不行吧?
大刘:是会有些问题。设想一下,如果容器所在的宿主机出现故障,或者网站应用需要停机升级,又或者用户访问量超过了单个容器的处理能力,会怎样?
小陈:网站可能会无法提供服务,导致业务无法开展。应该如何解决呢?
大刘:一个好汉三个帮咯。这就需要运行多个相同应用的容器,并构成一个跨服务器的容器集群,对外提供统一的访问地址。如此,当一个容器发生异常或其应用需要升级时,由于其他容器未受影响,整个集群可以照常提供服务。容器集群可提供远超单实例的处理能力,还可以根据业务负载的变化,相应调整集群中的容器数量,实现业务的弹性。
小陈:明白了。那么,管理容器集群会很复杂吗?
大刘:这个问题问得好。随着容器技术的普及,容器集群技术也在飞速发展,现在已经很成熟了,容器集群的管理自动化、智能化程度很高,大大节省了运维人员的时间精力,比如我们常说的Kubernetes技术就是这样。
小陈:哦,好像听过这个名字,那我先去了解下容器编排技术。
容器集群的必要性
单个容器的应用可以满足简单应用场景或者少量用户访问,但随着应用越来越复杂、访问量越来越大,单个容器的性能慢慢不支,就需要不断增加更多容器来提高应用的处理能力。但随着容器越来越多,就引发了一系列问题:
- 如何跨主机部署成百上千个容器?
- 如何协调和调度大量的容器?
- 如何在升级应用程序时不会中断服务?
- 如何监视应用程序的运行状况?
由于容器本质上是轻量级且短暂存在的,因此在生产环境中运行和管理大量容器,所需工作量巨大。遇到业务访问量特别大的时候,可能需要同时运行数百甚至数千个容器。如果手动管理这些容器,会显著增加管理复杂性。
所以,当大规模使用容器时,人工管理已经不可行,不得不考虑容器调度、部署、跨节点访问、自动伸缩等问题,这就需要容器集群技术了。
容器集群技术是如何发展的?
容器出现后,容器集群技术是近些年容器技术演进发展的重点领域之一。容器集群发展的里程碑事件如下:
2013年7月:Mesosphere发布了Marathon的开源项目。它的设计宗旨是让用户在同一组服务器上,更智能地运行多种程序和服务。
2014年6月:Google开源了Kubernetes。其目标是成为“跨集群的应用级别容器部署、部署和运维自动化平台”。
2015年4月:CoreOS公司推出了容器网络接口规范(CNI),它规定了一个容器runtime和网络插件之间的标准接口协议。
2015年5月:Docker发布了容器网络模型 (CNM)。它是Docker主导的网络方案,提供了IP地址管理和网络插件功能。
2015年7月:Google主导成立了云原生计算基金会(CNCF)。CNCF对云原生最初的定义,包含了三个方面:应用容器化,面向微服务架构,应用支持容器的编排调度。
2016年3月:Google将Kubernetes项目捐赠给CNCF基金会。
2016年6月:Swarm内置到Docker中。
2017年7月:Open Container Initiative(OCI)发布了容器运行时和镜像规范1.0版本
2017年12月:标准化容器存储接口规范(CSI:Container Storage Interface)发布。CSI的主要目的是使得存储提供商只需要编写一个插件,就能在大部分的容器编排系统上工作。
2018年3月:Kubernetes项目毕业
2018年8月:Prometheus项目毕业
2018年之后:Kubernetes 逐渐成为业界通用流行的容器编排技术,各大厂商纷纷宣布支持 Kubernetes 作为容器编排的方案。
从容器集群发展历程中,我们看到了Mesos、Swarm和Kubernetes项目,这三个项目都是实现跨集群的应用级别容器部署、管理和运维的自动化平台,这种平台技术一般可以称为容器编排技术。