容器技术:从通用向多元化发展

(1) 安全容器

        容器技术的采纳率连年提升,已经开始进入企业的生产环境。以Docker 为代表的普通容器通过Namespaces 和cGroups 实现的隔离,共享内核的机制使得隔离性具有天然的缺陷无法根除,在多租户场景下安全问题更加凸显:

        内核Bug 引发容器逃逸,操作系统内核漏洞、Docker 组件设计缺陷、不当的配置等都会导致Docker 容器发生逃逸。由于频发的安全及逃逸漏洞,一般在云环境中的容器应用不得不运行在虚拟机中,以满足多租户安全隔离要求。而分配、管理、运维这些传统虚拟机与容器轻量、灵活、弹性的初衷相悖,同时在资源利用率、运行效率上也存在不足。内核资源竞争影响业务性能,同一个宿主机上的不同Pod,实际上是不同的用户态进程的集合,这些用户态进程虽然在namespace 上是相互隔离的,但他们还是会共享很多内核资源,比如调度器、某些内核线程或者对象。这种级别的资源共享会引入很多可以观测到的性能抖动,对在线业务的影响也很明显。与Docker 普通容器不同,安全容器通过添加隔离层,给进程分配了一个独立的操作系统内核,从而避免了让容器共享宿主机的内核。因此容器进程能够看到的攻击面,就从整个宿主机内核变成了一个极小的、独立的、以容器为单位的内核,从而有效解决了容器进程发生“逃逸”或者夺取整个宿主机的控制权的问题。

(2) Serverless 容器

        FaaS 平台提供的是函数级别的Serverless 化部署,且应用场景多依赖于其绑定的触发器,对函数的执行有一些配置限制,并且不支持进程常驻。传统的应用大都是单体应用或者微服务应用,在迁移到FaaS 平台时,需要拆分函数,迁移成本较高。

        Serverless 容器,可以很好地弥补FaaS 的不足,Serverless 容器可以支持进程常驻的服务形态,不限运行时长,并扩大Serverless的应用场景。Serverless 容器支持服务的形态,传统的单体应用或者微服务应用,几乎可以无缝迁移到Serverless 容器平台上。

        Serverless 容器和传统的容器相比,为了实现Serverless 的理念,在如下几个方面做了加强:免运维的纯托管模式,传统的容器往往是直接将容器集群托管给业务方,业务方需要分担容器集群的一些运维工作。Serverless 容器则把容器集群完全托管给云厂商,由云厂商进行集群的运维工作,用户不用关注这些运维工作,只需部署自己的业务逻辑即可;以实际资源用量计费,传统的容器是按照容器的实例配置进行计费的,Serverless 容器是按照实际资源使用量进行计费;秒级弹性伸缩响应,传统的容器往往借助于容器编排工具来实现弹性伸缩,比如通过Kubernetes 可以实现Docker 的容器的弹性伸缩,但是Kubernetes 伸缩时间是分钟级的,而Serverless 容器能够提供更加极致的伸缩能力,做到秒级伸缩并且资源实例和伸缩至零。

    

(3) 裸金属容器

        容器服务最早部署形态是基于IAAS 虚拟机,以虚拟机节点作为容器集群的计算节点,并基于此构建容器的网络、存储和编排能力,这样的堆叠架构虽然可以让整个软件栈分工明确、边界清晰,但是带来了较大的性能损耗和功能冗余。此外如果用户对实例安全隔离性要求较高,就需要借助虚拟化技术,而虚拟化平台不能很好支持该能力。基于以上痛点,在裸金属服务器上搭建容器服务成为一些对性能和实例隔离性较高用户的选择。

        随着裸金属容器的发展,为了进一步提高容器负载性能和稳定性,原来部署在裸金属之上的非业务负载组件也逐步的由专门的卸载硬来承载,比如容器存储、容器网络、容器引擎以及服务网格组件。将容器组件下沉到卸载卡后,有几方面好处:

l 裸金属节点就可以被当做纯粹的计算资源,可以“完全”被业务负载使用。同时避免了对业务负载的性能干扰。

l 容器网络、容器存储组件下沉到卸载卡后可以与传统IAAS 层的网络、存储组件垂直打通,减少冗余功能;直接以硬件设备直通方式将存储、网络资源分配给容器实例,缩短I/O 路径,提高性能。

l 容器层组件下沉到卸载卡后,裸金属成为纯粹的计算资源,可以被容器实例或者虚机实例共享,为虚拟机和容器实例共节点奠定了基础,提高资源整体利用率。虽然裸金属容器可以通过卸载技术获得诸多益处,但同时也面临着较大的挑战:

l 资源占用问题。由于卸载卡上的资源非常有限,容器组件需要进行轻量化瘦身后才能较好的适配卸载卡,当前业界也在推动容器引擎层面的轻量化改造,比如kata-shim-v2 和isulad。

l 实例密度问题。由于容器存储和网络资源都是走VF 直通方式,而当前卸载卡上支持的VF 数量比较有限,在小规格实例场景,VF 会成为实例密度提升的限制。

        此外,裸金属容器不仅在资源利用率和性能上有优势,对系统运维管理的自动化和敏捷性上有较高诉求。为了获得较高的自动化运维能力,很多的依赖组件都进行了微服务改造,借助容器编排自身能力来自动化管理所依赖的服务,甚至是节点操作系统本身。比如AWS 为了提高容器计算节点操作系统更新管理的灵活性,推出了bottlerocket 产品,放弃原来基于包更新的升级机制,采用镜像粒度一步更新方法,降低了OS 更新的失败率,提高运维自动化程度和容器应用的稳定性。


来源:云原生产业联盟