2.3 容器
2.3.1 容器技术的兴起
随着云计算的日益流行,用户对云的接受程度也日益提升。用户的计算资源从原有的私有数据中心扩展至云计算平台。应用仍然是用户关注的一个核心问题。随着计算资源边界的扩张,应用也需要从私有数据中心迁移到云上。对于很多用户而言,云和非云环境并不是二选一,而是两者都需要。云和非云环境在相当长的一段时间内将同时存在。应用如何快速地在云和非云环境中迁移成为一个重要的问题。此外,越来越多的用户在他们的云战略中包含了不止一个云。为了有更高的可用性,避免厂商的锁定,一些实力雄厚的客户往往同时是多家云平台供应商的客户。因此实现应用在不同云环境中的快速迁移也成为一个重要的需求。
混合云环境的示意图如图2-5所示。
图2-5 混合云环境
在IaaS模式下,云平台底层的计算资源是以物理机(Bare Metal)或虚拟机的形式提供的,这些计算资源过于“笨重”,难以在不同的环境中被快速地“移动”。通过IaaS,用户可以方便快速地获取大量的计算资源:主机。但是应用并不能直接消费主机。用户必须在主机上安装应用所需要的中间件,添加应用所需要的系统配置,然后再对应用进行配置才行,这些工作都拖慢了整个应用交付流程的节奏。相对而言,PaaS则没有这些效率低下的步骤,用户只需要关注应用,无须过度关注底层。但是传统PaaS的一个问题在于,PaaS平台对应用有入侵性。为了享用PaaS平台提供的一些高级功能,应用必须在代码中引入PaaS平台的API。这种入侵性导致应用在不同云环境中的迁移变得困难。
容器(Container)技术的出现为前文提及的问题提供了一个很好的解决方案。容器技术以一种称为容器镜像(Container Image)的打包格式为基础,扩大了应用交付件的边界。与以往应用交付件只包含应用本身不同,容器镜像中不仅包含编译构建后的应用,还包含应用所依赖的中间件、类库和操作系统设置等配置,可以为应用的运行提供一个完整的环境。以操作系统的内核为基础,容器引擎在主机之上可以快速实例化容器镜像,生成一个或多个容器实例。容器技术的出现,解决了应用消费主机资源效率低下的问题,使得应用可以被快速地部署到庞大的计算集群中去。容器以操作系统内核为基础,保证了可移植性,让应用可以在不同的云环境中,甚至不同的非云环境中被方便地迁移。与IaaS相比,容器比虚拟机和物理机更加小巧和灵活,便于在不同环境之间传输。与传统的PaaS相比,容器有更清晰的边界,对应用没有入侵性,极大地提高了应用的可迁移性。
经过几年的迅速发展,容器已经不容置疑地成为云计算的一项关键基础技术。Docker (现在已经更名为Moby项目)已成为容器引擎的事实标准。Kubernetes也在竞争中脱颖而出,成为容器编排(Orchestration)平台的事实标准。通过Kubernetes这样的容器编排平台,容器镜像可以快速地被部署到成百上千的主机上。Kubernetes成为一种类似操作系统的存在,有的人认为Kubernetes就是一种云操作系统。传统的操作系统只管理一台主机上的CPU、内存、磁盘和网络资源,而Kubernetes则掌控着数据中心中成百上千台主机的资源。
2.3.2 Serverless与容器
容器和Serverless在技术上有相同的地方,如结合容器的特点和Kubernetes这种容器编排平台,用户可以实现对容器应用的自动弹性伸缩。Kubernetes对底层的主机资源进行抽象,在一般场景下,用户也不关注容器应用具体运行在什么主机上。与Serverless类似,容器应用的部署和扩容的效率也很高。不同的地方在于,容器架构中最小的运行单元是容器,而Serverless中则是函数。容器应用一般是预先部署,然后持续在线。而在Serverless架构中,应用是按需加载和执行的。这意味着理论上Serverless的资源使用效率更高。
其实,容器技术可以是Serverless架构实现的一个基础。容器平台的最小运行单元为容器,虽然目前容器内一般运行的是一个完整的应用,但是将容器内运行的对象变成函数显然并无技术困难。Kubernetes上默认没有事件触发的支持,无法做到按需部署容器应用。但是通过Kubernetes叠加上一些FaaS框架运行包含函数逻辑的容器,用户很容易使Kubernetes具备FaaS服务的能力,如图2-6所示。同时,Kubernetes也可以作为基础平台实现各类应用所依赖的服务(如缓存、图像处理、数据库及AI等)的云化。当服务足够丰富时,可形成一个完备的BaaS平台。笔者相信,容器必将是未来私有云构建Serverless能力的一个重要实现基础。
图2-6 基于Kubernetes的Serverless平台架构
Kubernetes是Google开源的一个容器编排项目,为用户提供一个跨平台的容器部署和管理解决方案。有关Kubernetes的更多详细信息可以参考其主页:https://kubernetes.io。