内容摘要
近年来,容器技术及相关应用得到了国内外越来越多的关注度,研发和应用推广发展势头迅猛。在国外,容器技术已经形成了较成熟的生态圈;在国内,金融企业、互联网企业、IT企业积极投入容器技术研发和应用推广,发展势头迅猛。为了积极引导我国容器技术和应用发展,我们编写本白皮书。其主要内容包括:
- 一、针对容器技术现状进行研究和分析。一是梳理了容器技术从开始到现在的发展历程,对现有容器发展的生态结构进行分析,其中包括开源社区、产业联盟、解决方案厂商等;二是对容器技术框架进行了详细的描述,对技术框架各层涉及的技术点进行了介绍;三是结合已发布的国家和国际标准,将现有容器技术对于参考架构的实现情况进行分析;四是分析了容器技术与大数据、物联网、SDN之间的关系。
- 二、容器技术发展路线及技术架构。通过列举容器技术典型4个应用场景,包括PaaS平台建设、软件定义数据中心、容器即服务、持续集成和发布等,分析了容器技术在各种场景下的关键成功因素。
- 三、容器未来发展趋势。结合容器发展现状和应用场景应用情况,分析了容器技术在应用过程中面临的问题,同时提出了容器今后发展的生态图,对未来容器技术发展进行了展望。
一、概述
1.1 背景
代码语言:javascript复制继虚拟化技术出现后,容器技术逐渐成为对云计算领域具有深远影响的变革技术。容器技术的发展和应用,将为各行业应用云计算提供了新思路,同时容器技术也将对云计算的交付方式、效率、PaaS平台的构建等方面产生深远的影响,具体体现在以下几个方面:
简化部署:容器技术可以将应用打包成单一地址访问的、Registry存储的、
仅通过一行命令就可以部署完成的组件。不论将服务部署在哪里,容器都可以从根本上简化服务部署工作。
快速启动:容器技术对操作系统的资源进行再次抽象,而并非对整个物理机资源进虚拟化,通过这种方式,打包好的服务可以快速启动。
服务组合:采用容器的方式进行部署,整个系统会变得易于组合,通过容器技术将不同服务封装在对应的容器中,之后结合一些脚本使这些容器按照要求相互协作,这样操作不仅可以简化部署难度还可以降低操作风险。
易于迁移:容器技术最重要的价值就是为在不同主机上运行服务提供一个轻便的、一致的格式。容器格式的标准化加快交付体验,允许用户方便地对工作负载进行迁移,避免局限于单一的平台提供商。
为更好地推进容器及相关技术在中国的落地与实践,推动容器技术在国内的落地,并建立顺应国际技术发展趋势、符合中国本地化特征的容器标准体系,中国开源云联盟容器工作组开展了本白皮书的研制工作,白皮书立足于容器技术发展的演进路线图,分析容器技术在应用过程中的应用场景以及面临的具体问题和关键成功因素,描绘容器技术未来的发展趋势和方向。本白皮书的发布,旨在与业界分享我们在容器技术领域的研究成果和实践经验,呼吁社会各界共同关注容器技术的同时,共同推动容器技术的发展,提升容器技术在云计算领域中实践和服务能力。
1.2 相关术语
- 表1.1 术语
术语 | 定义/解释 |
---|---|
镜像 | 系统文件及其应用文件以特殊的文件形式进行备份制作成单一的文件。 |
微服务架构 | 微服务架构是一种特定的软件应用程序设计方式——将大型软件拆分为多个独立可部署服务组合而成的套件方案。 |
开发运维一体化 | 可定义为是一种过程、方法、文化、运动或实践,主要是为了通过一条高度自动化的流水线来加强开发和其他IT职能部门之间的沟通和协作,加速软件和服务的交付。 |
运行时引擎 | 指用户用来运行容器镜像的软件系统 |
1.3 缩略语
- 表1.2 缩略语
术语 | 解释 |
---|---|
CI/CD | Continuous Integration/Continuous Delivery,持续集成和持续交付 |
CaaS | Container as a Service ,容器即服务 |
CCRA | Cloud Computing Reference Architecture,云计算参考架构 |
CLI | command-line interface,命令行界面 |
DC/OS | DataCenter Operating System,数据中西操作系统 |
DevOps | Development and Operations,开发运维一体化 |
DNS | Domain Name System,域名系统 |
IaaS | Infrastructure as a Service,基础设施即服务 |
PaaS | Platform as a Service,平台即服务 |
SaaS | Software as a Service,软件即服务 |
SDN | Software Defined Network,软件定义网络 |
LXC | Linux Container,Linux容器 |
OCI | Open Container Initiative,开放容器组织 |
VPS | Virtual Private Server,虚拟机专有服务 |
VM | Virtual Machine,虚拟机 |
二、容器技术现状
2.1 容器技术发展演进路径
- 图2.1 容器技术演变路径
容器技术最早可以追溯到1979年UNIX系统中的chroot,最初是为了方便切换root目录,为每个进程提供了文件系统资源的隔离,这也是OS虚拟化思想的起源。2000年,BSD吸收并改进了chroot技术,发布了FreeBSD Jails。FreeBSD Jails除文件系统隔离,还添加了用户和网络资源等的隔离,每个Jail还能分配一个独立IP,进行一些相对独立的软件安装和配置。2001年,Linux发布了Linux Vserver,Linux VServer依旧是延续了Jails的思想,在一个操作系统上隔离文件系统、CPU时间、网络地址和内存等资源,每一个分区都被称为一个 security context,内部的虚拟化系统被称为VPS。2004年原SUN公司发布了Solaris Containers,Solaris Containers作为Solaris 10中的特性发布的,包含了系统资源控制和zones提供的二进制隔离,Zones 作为在操作系统实例内一个完全隔离的虚拟服务器存在。2005 年SWsoft公司发布了OpenVZ,OpenVZ和Solaris Containers非常类似,通过打了补丁的 Linux 内核来提供虚拟化、隔离、资源管理和检查点。OpenVZ 标志着内核级别的虚拟化真正成为主流,之后不断有相关的技术被加入内核。2006 年Google 发布了 Process Containers,Process Container 记录和隔离每个进程的资源使用(包括CPU、内存、硬盘I/O、网络等),后改名为cgroups(Control Groups),并在2007年被加入Linux内核2.6.24版本中。2008年出现了第一个比较完善的LXC容器技术,基于已经被加入内核的cgroups和Linux namespaces 实现。不需要打补丁,LXC就能运行在任意vanila内核的Linux上。2011年,CloudFoundry发布了Warden,和LXC不同,Warden可以工作在任何操作系统上,作为守护进程运行,还提供了管理容器的API。2013年Google公司建立了开源的容器技术栈lmctfy,Google开启这个项目是为了通过容器实现高性能,高资源利用率,同时接近零开销的虚拟化技术。目前 Kubernetes 中的监控工具 cAdvisor就起源于lmctfy项目,2015年Google将lmctfy的核心技术贡献给了 libcontainer。2013年Docker诞生,Docker最早是dotCloud(Docker公司的前身,是一家PaaS公司)内部的项目,和Warden类似,Docker最初也用了LXC,后来才自己写了 libcontainer 替换了 LXC。和其它容器技术不同的是,Docker 围绕容器构建了一套完整的生态,包括容器镜像标准、容器Registry、REST API、CLI、容器集群管理工具Docker Swarm等;2014年CoreOS创建了rkt,为了改进Docker在安全方面的缺陷,重写的一个容器引擎,相关容器工具产品包括:服务发现工具etcd和网络工具flannel等。2016年微软公司发布基于Windows 的容器技术Hyper-V Container,Hyper-V Container原理和Linux下的容器技术类似,可以保证在某个容器里运行的进程与外界是隔离的,兼顾虚拟机的安全性和容器的轻量级。
2.2 容器技术发展生态
随着容器技术的演进,越来越多的机构开始重视并参与到容器技术的探索中来。从最初的以Unix或Linux项目到开源社区,到各种类型的容器技术创业公司、IT 企业及产业联盟,容器技术的发展生态也在逐渐得到发展与丰富。在开源社区方面,附录A中列出了国际上的OCI和CNCF(Cloud Native Computing Foundation,简称CNCF,下同),容器的开源项目也在附录B中列出;在国内的IT 企业和创业公司方面,还提供了多个行业应用案例,这些行业应用案例在附录 D 中列出;产业联盟方面包括国际包括 CNCF,国内包括中国开源云联盟(COSCL)。容器的开源社区、创业公司、IT 企业、产业联盟共同构成容器技术发展的生态圈。
2.3 容器技术框架
通过研究、梳理和分析现有的容器技术,形成容器相关技术的技术架构,如图2.2所示。
图2.2 容器技术框架
2.3.1 服务器层
当运行容器镜像时,容器本身需要运行在传统操作系统之上,而这个操作系统既可以是基于物理机,也可以是基于 VM。服务器层包含了这两种场景,泛指了容器运行的环境,同时容器并不关心服务器层如何提供和管理,它的期望只是能获得这些服务器资源。
2.3.2 资源管理层
资源管理包含了服务器、操作系统等资源的管理。其中如果是物理服务器的话,需要涉及物理机管理系统(例如Rocks等);如果是虚拟机的话,需要使用虚拟化平台。此外,无论是物理服务器还是虚拟机,都需要对其中的操作系统加以管理(例如:Chef、Puppet、Ansible和SaltStack等)。而传统的存储和网络管理也包含在资源管理层。由于存储,网络两者选择众多,不一而足,因此不再列举。 总而言之,资源管理层的核心目标是对服务器和操作系统资源进行管理,以支持上层的容器运行引擎。
2.3.3 运行引擎层
容器运行引擎层主要指常见的容器系统,包括 Docker、rkt、Hyper、CRI-O。这些容器系统的共通作用包括启动容器镜像、运行容器应用和管理容器实例。运行引擎又可以分为管理程序和运行时环境两个模块。 需要注意的是,运行引擎是单机程序,类似虚拟化软件的KVM和Xen,不是集群分布式系统。引擎运行于服务器操作系统之上,接受上层集群系统的管理。 相关开源项目包括: ——资源隔离:Cgroup、Hypervisor; ——访问限制:Namespace、Hypervisor; ——管理程序:Docker Engine、OCID、hyperd,RKT、CRI-O; ——运行时环境:runC(Docker)、runV(Hyper)、runZ (Solaris)
2.3.4 集群管理层
可以把容器的集群管理系统类和针对 VM 的集群管理系统划等号,都是通过对一组服务器运行分布式应用。而这两者的细微区别在于,VM 的集群管理系统需要运行在物理服务器上,而容器集群管理系统既可以运行在物理服务器上,也可以运行在 VM 上。 常见的容器集群管理系统包括:Kubernetes、Docker Swarm、Mesos。这三者各有特色,但随着时间推移,三者的融合将越发明显。Kubernetes 在这三者中比较特殊,它的地位更接近 OpenStack。围绕这 Kubernetes,CNCF 基金会已经建立了一个非常强大的生态体系,这是Docker Swarm和Mesos都不具备的。而CNCF基金会本身也正向着容器界的OpenStack基金会发展,值得大家重点关注。 集群管理层涉及到的相关开源软件项目包括: ——指挥调度:Docker Swarm、Kubernetes、Mesos等 ——服务发现:Etcd、Consul、Zookeeper,DNS ——监控:Prometheous ——存储:Flocker ——网络:Calico、Weave、Flannel
2.3.5 应用层
泛指所有运行于容器之上的应用程序,以及所需的辅助系统,包括:监控、日志、安全、编排、镜像仓库等等。 ——监控模块,相关开源项目包括:Prometheous、cAdvisor、Sysdig等; ——日志,相关开源项目包括:Fluented、LogStash等; ——安全,包括容器镜像的安全扫描,运行环境的安全隔离,集群环境的安全管理等功能; ——编排,相关开源项目包括:Docker Compose、CoreOS Fleet等; ——CI/CD,相关开源项目包括:Jenkins、Buildbot、Gitlab CI、Drone.io; ——镜像仓库:Docker Hub、VMware Harbor、Huawei Dockyard。
2.4 容器技术对参考架构的实现情况
国家标准GB/T 32399-2015《信息技术 云计算 参考架构》(简称CCRA,修改采用ISO/IEC 17789)是2015年发布的国家标准,描述了云计算的利益相关者,云计算系统的基本特征,云计算的基本活动和功能组件,我国是该国际标准的立项推动国之一,积极参与了该国际标准的编制,该标准的诞生标志着国际三大标准化组织ISO、IEC和ITU首次在云计算领域统一认识并达成一致,是国际国内云计算领域的最重要的基础性标准。在该标准中描述了云计算的功能架构,功能架构包含了支撑云计算活动所需的功能,如图2.3。图中标蓝色的部分是现有容器技术已经实现的内容。
图2.3 CCRA功能组件图
2.5 容器技术的关键技术内容
2.5.1 镜像
容器的镜像通常包括操作系统文件、应用本身的文件、应用所依赖的软件包和库文件。为了提高容器镜像的管理效率,容器的镜像采用分层的形式存放。容器的镜像最底层通常是Linux的rootfs和系统文件,再往上则是各种软件包层。这些文件层在叠加后成为完整的只读文件系统,最终挂载到容器里面。在运行过程中,容器应用往往需要写入文件数据,容器引擎为此需再创建一个可写层,加在镜像的只读文件系统上面。使用分层的容器镜像之后,镜像的下载和传输更加便利,因为只需要在宿主机上把缺少的镜像文件层次下载即可,无需整个镜像传送。 在Linux中,联合文件系统UnionFS能够把多个文件层叠加在一起,并透明地展现成一个完整的文件系统。常见的联合文件系统有AUFS(AnotherUnion File System),btrfs,OverlayFS和DeviceMapper等。
2.5.2 运行时引擎
容器运行时引擎和容器镜像两者的关系类似于虚拟化软件和虚拟机镜像的关系。容器运行时引擎的技术标准主要是由OCI基金会领导社区进行制定。目前OCI已经发布了容器运行时引擎的技术规范,并认可了runC(Docker公司提供)和runV(Hyper公司提供)两种合规的运行引擎。
2.5.3 容器编排
容器编排工具通过对容器服务的编排,决定容器服务之间如何进行交互。容器编排工具一般要处理以下几方面的内容: 1) 、容器的启动。选择启动的机器、镜像和启动参数等; 2) 、容器的应用部署。提供方法对应用进行部署; 3) 、容器应用的在线升级。提供方法可以平滑地切换到应用新版本。 容器的编排一般是通过描述性语言YAML或者JSON来定义编排的内容。目前主要的编排工具有Docker compose和基于Google的Kubernetes helm等。
2.5.4 容器集群
容器集群是将多台物理机抽象为逻辑上单一调度实体的技术,为容器化的应用提供资源调度、服务发现、弹性伸缩、负载均衡等功能,同时监控和管理整个服务器集群,提供高质量、不间断的应用服务。容器集群主要包含以下技术: 资源调度:主要以集中化的方式管理和调度资源,按需为容器提供 CPU、内存等资源; 服务发现:通过全局可访问的注册中心实现任何一个应用能够获取当前环境的细节,自动加入到当前的应用集群中; 弹性伸缩:在资源层面,监控集群资源使用情况,自动增减主机资源;在应用层面,可通过策略自动增减应用实例来实现业务能力的弹性伸缩; 负载均衡:当应用压力增加,集群自动扩展服务将负载均衡至每一个运行节点;当某个节点出现故障,应用实例重新部署运行到健康的节点上。
2.5.5 服务注册和发现
容器技术在构建自动化运维场景中,服务注册和发现是重要的两个环节,一般通过一个全局性的配置服务来实现。其基本原理类似公告牌信息发布系统,A 服务(容器应用或者普通应用)启动后在配置服务器(公告牌)上注册一些对外信息(比如IP和端口),B服务通过查询配置服务器(公告牌)来获取A注册的信息(IP和端口)。
2.5.6 热迁移
热迁移(Live Migration),又称为动态迁移或者实时迁移,是指将整容器的运行时状体完整保存下来,同时可以快速地在其他主机或平台上恢复运行。容器热迁移主要应用在两个方面:一是有多个操作单元执行任务,热迁移能迅速地复制与迁移容器,做到无感知运行作业;二是可以处理数据中心中集群的负载均衡,大量数据涌来无法运行计算时,可利用热迁移创建多个容器处理运算任务,调节信息数据处理峰谷,配置管理负载均衡比例,降低应用延迟。
2.6 容器技术与相关技术的关系
2.6.1 容器与云计算
虚拟化是云计算的重要基础,容器定义了一套从构建到执行的标准化体系,改变了传统的虚拟化技术,深度影响了云计算领域,容器是云计算的未来。以Docker 为代表的容器技术越来越深刻地影响云计算,也改变我们的日常开发、运维和测试。相比于虚拟机,容器的轻量、快速启动和低开销,以及基于此的按业务打包和微服务模式,这些特点被用来改进 DevOps,很多场景下更适合做大规模集群管理和搭建灵活的分布式系统。通过深度整合了IaaS、PaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决IT、架构及运维等问题,使企业更聚焦于业务,构建了新一代的云计算生态体系。
2.6.2 容器与大数据
大数据平台如果能采用容器方式发布,与Spark、Hadoop、Cassandra等相关技术的集成与对接,可降低整个系统的搭建难度,缩短交付和安装周期,减少安装失败风险。容器化后,各类大数据平台组件可以轻松实现迁移的目的,也能实现多复本控制和高可用。
2.6.3 容器与物联网
物联网(IoT)技术发展日新月异,而容器技术刚好遇到这样的机遇,将在几个方面促进物联网的发展。 首先,运用容器技术后,可通过容器封装,可简化下载、安装部署、启动和后续应用更新。这将大大加速物联网应用开发部署。其次,容器技术还可以满足物联网在自动监控,集中式维护管理方面的需求。最后,数据采集端环境千变万化,如果需要手动适配工作量巨大,如果采用容器化技术,只要打包几类典型的容器镜像,如ARM,X86,x86_64等,就可以事半功倍实现终端的发布工作。
2.6.4 容器与SDN
随着容器部署规模的增大,跨主机、跨网络的容器迁移成为常态。而容器更多地关注于轻量化本身,对于网络架构并没有太多关注。过于复杂的体系结构和管理过程,容易让整个容器网络和系统陷入不可控的非稳定状态。通过SDN和Overlay网络结合,将控制转发分离、集中控制管理理念应用于容器网络,还可以最大程度增强容器网络的弹性伸缩能力和简化网络管理。 另外,SDN与容器的配合,是相得益彰、互相促进的。业界的SDN控制器和系统一般都比较庞大,安装、运行都极为复杂。通过Docker技术,能够实现SDN控制器的轻量级快速部署、安装、运行。