题图摄于旧金山海湾:Bay Bridge & downtown SF
应西山居运维经理肖力肖总的邀请,笔者在4月13日晚在《运维前线》技术群作分享。本文为分享内容的总结和整理。
本次分享主要包括两个方面的内容:
1)企业容器和虚拟机融合技术
2)企业镜像管理Registry系统
近两年,以Docker为代表的容器(Container)技术得到应用广泛。容器的优点很明显,就是轻量、快速和灵活,适合DevOps的要求。目前,大部分的互联网公司都采用了Docker等容器技术,不少企业也在调研和试用中。但容器也有一些不足之处,最大的缺陷就是隔离性问题,引出了对容器技术安全性的担忧。不少用户比较困惑:容器和虚拟机是不是可以互相替代的技术,两者应该怎样取舍才恰当呢?
我们先来看看Docker依赖的底层技术,其中之一是Linux的 namespace,目前的6种 namespaces无法彻底把容器中的应用互相隔离开来。容器间的隔离关系有点象下面的电话亭,彼此间仿佛是隔开的,但仔细聆听,又可分辨到隔壁亭子的声音。
既然Linux容器的隔离度不足,是否能在后续的Linux版本中加强呢?由于技术等方面的原因,Linux的namespace种类不可能无限的增多,因此Linux Container的隔离性问题将会是长期困扰其应用场景的重要因素。
为了解决上述隔离性的问题,业界兴起了一种“虚机容器”技术。简单讲,就是用轻量级的虚拟机替代Container来运行应用。乍一听,虚拟机是个又笨又重的家伙,怎么能够与快速灵巧的容器相比呢?其实这是个错觉。虚机的“重”主要来自内装的操作系统,现代的操作系统的磁盘空间一般都是GB级别的大小。虚机的“笨”也基本由于操作系统启动太慢,吭嗤半天咖啡凉了才看到登录画面。只要把里面的操作系统瘦身,虚机的创建和启动完全可达到毫秒级。这样,虚拟机就象容器那样轻巧快捷,很适合运行容器化的应用,同时具有良好的隔离性,就象下图这样:
“虚机容器”这方面的开源项目有几个:Intel Clear Containers, 国内创业公司的Hyper_,还有就是VMware公司的vSphere Integrated Containers (VIC)。这几个项目基本原理相似,这里给大家介绍的是VMware的VIC。
在VMWorld 2015上,VMware宣布了vSphere Integrated Containers(VIC,项目代号:Bonneville),这是一种“虚机即容器”的解决方案,它在ESXserver中增加了直接运行容器化应用的能力。我们一起来看看它的架构:
首先,VIC接管了DockerDaemon中容器生命周期管理的功能,把原来在Linux中创建Container的操作转向了ESX Hypervisor。另一方面,它继续支持DockerREST API, Docker client的所有命令都可以正常使用。
当运行Container时,VIC首先从Docker Hub下载Docker image。Image以VMDK的格式存放于ESX的datastore里。VIC在dockerdaemon里面提供了自己的graph driver,实现了类似UnionFS的功能,Images在ESX中也是按照Layer来组织管理的,用链式克隆(linked clone)实现镜像的叠加。
在容器的镜像准备好之后,最复杂也最有意思的步骤就是启动容器了。VIC在ESX上预先创建了一个虚机模板,里面安装了极简版的Photon操作系统(Photon是VMware运行容器应用的Linux Distro),整个虚机镜像只有25MB。这个虚机处于启动后的冻结状态(frozen),就象饺子煮熟后速冻起来那样。当需要运行容器应用的时候,通过ESX的InstantClone功能,可以瞬间从模板克隆出一个运行态的虚机,“速冻饺子”就这样迅速解冻成刚出锅的“新鲜饺子”了。
Instant Clone 是ESX 6.0发布的新功能,能够快速克隆运行态的虚拟机,在创建瞬间新旧虚拟机是共享内存和磁盘的,之后采用内存和磁盘的COW(Copy on Write)进行分体操作。Instant Clone最大优点就是虚拟机复制出来时就是可用的状态了,无须再经历操作系统启动的过程,大大节约了时间。上述的虚拟机创建后,再把容器镜像mount到虚拟机里面,容器应用就可以启动运行了。
VIC的虚机比Linux Container的内存开销稍微大些,但比起传统的虚机已经大为减少。鉴于虚机容器带来的好处,这样的额外开销是可以接受的。下图是运行Tomcat时内存消耗的比较。
VIC用虚拟机装载容器化应用,真正实现了应用的隔离。另一方面,应用的启动速度和Linux Container相差无几,同样地快速灵活。在API方面和Docker完全兼容,大量的Docker工具可以直接使用,如Swarm等。最酷的莫过于可运用Hypervisor各种成熟的技术,来满足容器应用的企业级需求,如HA,SDN, 热迁移等等。在运维管理上,容器和虚拟机可以无差别的统一管理。因为用户大多已经广泛使用虚拟机,统一的管理将给用户带来巨大的便利。下面是vCenter的截图,那个长串字符的虚机就是Container,名称是它的UUID。可以看到,容器和其他虚拟机可以一并管理。
我们相信,“虚机即容器”的方法将会成为企业、公有云等注重安全性的用户优先考虑的方案。VIC项目刚刚在上周开源:
容器生命周期中除了有动态运行的容器,也有静态存放的镜像。接下来,给大家分享的是容器应用另一个关键环节:镜像管理。镜像是容器生命周期的核心,容器应用开发和运维离不开镜像仓库Registry。最简单易用的Registry服务就是公有云服务Docker Hub了。
虽然使用方便,公有云中的镜像管理也存在一些问题,首先就是私密性,或者说IP(知识产权)的安全性无法保证。再就是效率,如果每次push和pull都往公有云里面跑,需要消耗大量时间,不利于持续集成和快速迭代。因此,我们发现绝大多数容器用户都建立了私有的Registry服务。
在一个实际的开发或生产系统中,镜像管理往往还需要关注几个问题:
1.权限管理,不是任何人都可以访问任意镜像。
2.审计功能,什么人何时做过什么镜像操作,可以追溯。
3.镜像同步和复制的功能,比如从开发环境推送到生产环境,从一个机房到另一个机房等。
目前开源的Registry解决方案不多,我们VMware的中国团队最近开源企业级Registry项目Harbor,就是解决上述问题。开源仅仅一个月,在GitHub上就获得400+个stars的支持,包括来自中国和世界各地的用户。地址:
https://github.com/vmware/harbor
Harbor主要功能包括:
Harbor的架构图如下:
从上图可以看到,我们在Docker开源的registry项目上加上了认证(auth),管理界面(UI),日志和API等功能模块,并统一使用了Nginx做反向代理。这些都是在实际使用和运维中非常需要的功能,并且也是Docker开源Registry缺失的部分。
Harbor界面样例展示:
欢迎大家使用和反馈意见,可到GitHub上的Issues区和我们互动。也可以关注公众号:“亨利笔记”,在后台发信息,加入Harbor开源项目群交流。
Q&A
Q1:VIC 和Harbor 之间的关系是什么呢?
A1:是 VMware 两个开源项目,一动一静:VIC是负责容器和虚拟机统一运行,Harbor 负责容器镜像管理功能。
Q2:VIC 能像虚拟机一样处理网络?
A2:可以。所有虚拟机方面的网络功能都可以用于VIC。
Q3:VIC是否使用Docker 一样的联合文件系统,是否像 Docker 一样快速交付。
A3:VIC使用了linked Clone的 VMDK 文件形式,也是分层的,因此可以节约空间,可以快速启动。
Q4:VMware 在VM 和 VIC间将如何帮助客户取舍?
A4:传统应用可继续使用 VM,新一代云应用,可考虑VIC.
Q5:每个轻量级 VM 中跑一个Docker 吗?
A5:每个虚拟机只跑应用,没有 Docker Engine,也没有 linux Container。
Q6:VM 与VIC 可以通信吗?VIC内有服务自动发现机制吗?
A6:可以通信。没有服务发现。
Q7:使用 ladp 认证,用户管理由ladp 服务器统一管理,建议把用户删除功能禁用,否则导致用户信息不一致,我们在 Harbor 删除用户后,该用户就永久不能使用了,必须清理数据库。
A7:这个问题有用户反映,已经在改进,请在 Github 上参与讨论。谢谢。
Q8:网络模型是怎么样的,经过这么多层包裹,网络性能如何保证的。
A8:VIC 的网络就是ESX 虚拟机的网络,性能没有问题。
Q9:感觉VIC挺好的,目前VIC有什么参考资料?部署、管理方面可以借鉴 ?
A9:目前已经有 Github 上的文档,也可以参考我公众号上的文章。
Q10:Harbor 能给原生Docker 用吗?
A10:可以。Harbor 本身就是容器化的应用。
Q11: 哪个 ESXi版本可以支撑VIC?
A11:ESX 6.0 以上
Q12:直接跑应用,25M 的系统能满足所有应用吗?
A12:25MB 是内核在磁盘上的大小,在内存中很少空间,大部分内存留给应用了。
Q13:内存、CPU、磁盘也通过VM管理?
A13:对的。和虚拟机统一管理。