我们经常对比容器和虚拟机之间的安全性,也反复问过自己哪一个更安全些。我认为比较容器和虚拟机是建立在错误的基础之上——我们理所应当地把容器和进程来做比较。
我们并不认为容器应当摆脱虚拟机运行,容器可以和虚拟机结合使用,大致有三种常见方式:
容器运行在虚拟机之内。
容器和虚拟机分别运行在主机上。
虚拟机运行在容器之内(这种方式的确可行)。
前提条件
我们可以任意使用以上列出的三种技术来运行我们的业务。所以对比他们之间的安全性是“不自然”的。我认为一种更“自然”的方式是比较业务负载的租赁需求和隔离性。
分租规模
什么是分租规模(Tenancy Scale)?这是来自一场和红帽产品安全团队领导(例如Josh Bressers)头脑风暴产生的概念。
不知大家现在是否还记得,在我大学时代(1997年),多用户Unix系统非常流行。每个用户可以远程登录(没错,使用telnet)到Unix服务器来运行他们自己的进程。一些用户用来运行批处理任务来进行研究,一些用户运行独立的网站服务器,或者使用系统共享的网站服务器。当你登录系统时,你可以列出所有人正在运行的进程。事实上,如果有人错误的设置了自己家目录的权限,那么任何人都可以访问他们的私人文件,这真是疯狂的一段时光。
在2016年,很少会有系统管理员会认为Linux进程间隔离足以应付不同用户登录到系统中,特别是对于多租户环境下不同组织及个人用户隔离的场景中。
然而假设我是一个大学的系统管理员,不同的研究团队想要运行他们自己的任务,比如一个研究组运行生物学计算,一个研究组运行地理学计算,那么容器的隔离性对他们来讲是否足够呢?我的答案是肯定的。
在另一种假设场景中,我是一个公有云提供商的系统管理员。用户来自于不同的公司、政府组织、研究机构来共享物理资源,则容器本身可能无法提供足够的隔离性。所以我认为虚拟机规模的隔离性才足以应付。
根据上面两个假设的场景,那么一个关心安全性的用户还会有哪些疑问呢?
如何添加反亲和规则(anti-affinity rules)来确保我的作业运行在不同的虚拟机、不同的物理机上?
如何确保不同的物理机运行在不同的机柜中,来使用不同的电源分配单元(Power distribution Units, PDUs)和不同的机柜交换机?
如何确保两个作业实例分散在不同的数据中心,来防备气象或地震灾害?(我在数据中心工作时,客户确实问到过这个问题。)
你可以让其中一个作业实例运行在月球上以防地球爆炸么?(手动滑稽)
好的,除了最后一个是开玩笑,相信你已经理解了我的意思。
结论
隔离和分租是颗粒化的需求,通常作业会要求“足够的”隔离性,但是什么隔离性是足够的呢?当然是,不同的应用有不同级别的要求。
所以我认为,不要一直在比较虚拟机和容器技术,想想看如何让两者联合起来,以满足你的作业的需求才是正道。
【基于Docker的DevOps实战培训 | 南京站】培训内容涉及容器编排框架(应用部署)、Ansible 简介、持续集成常用方式、典型案例分析、容器的选择、架构设计(百万级日活,亿级API 请求)、数据系统构建、持续集成的开发流程等,点击下面图片即可查看具体培训内容。
点击阅读原文链接可直接报名。