消息资讯|UCloud优刻得Serverless容器实例Cube的研发实践之路

_原题为 UCloud优刻得Serverless容器实例Cube的研发实践之路
Cube诞生背景
随着云原生技术的推广及落地 , 容器技术在企业生产环境中的使用比重越来越大 。 Kubernetes作为容器编排的事实标准 , 在企业服务中被大量采用 。 UCloud优刻得容器团队在2018年推出了Kubernetes产品UK8S, 这款产品基于UCloud优刻得公有云环境实现 , 无缝集成了UCloud IaaS层计算、网络及存储的服务 , 使客户能够快速获取到生产可用的Kubernetes集群 , 并拥有灵活控制集群的能力 。
但在UK8S产品推广及接入客户过程中 , UCloud优刻得容器团队也陆续收到一些用户反馈的问题:
>维护Kubernetes集群增加了额外的负担;用户除了管应用还需要后端资源 , 并未能实现以应用为中心的业务管理 。
>Kubernetes体系较为复杂 , 学习曲线比较陡峭 , 需要客户团队有一定技术储备;对于已经使用了容器但尚未尝试Kubernetes的客户也是如此 , 一方面需要了解Kubernetes的技术体系 , 另一方面需要修改应用架构适配Kubernetes 。
>希望能有一款即开即用的容器产品 , 通过容器直接拉起应用 , 不需要等待虚拟机就绪再部署应用 , 缩短应用就绪等待时间 。
为解决上述用户问题 , UCloud优刻得容器团队开发了一款新的serverless容器产品Cube , 目前正处在公测阶段 。 除了降低用户使用容器的门槛 , 该产品还具有以下特性:
1. 免运维:没有维护资源负担 , 不需要关心运行位置 , 以应用为中心 , 以容器镜像为应用打包标准 。
2. 按需付费:按照应用实际使用资源付费 。
3. 自动扩缩容:基于海量资源 , 提供API , 可按需拉起和关闭应用 , 自动调度资源 。
4. 高可用:产品本身高可用 , 同时提供应用自愈能力 。
技术选型
在实现Cube产品特性的过程中 , 容器团队需要解决几个技术问题:
1. 容器运行时的选型
公有云产品必然要考虑多租户隔离问题 。 不同于UK8S产品以云主机为基础构建的隔离性 , Cube产品则直接在宿主物理机上运行容器 。 标准docker实现的容器并不能实现同台宿主机上不同用户不同容器之间的强隔离 , 因此Cube产品需要一款同时具备虚拟机强隔离性和容器快速启动特点的容器运行时方案 。
UCloud优刻得容器团队注意到AWS开源了轻量级虚拟机firecracker , 具有资源占用少、启动速度快、易于维护等诸多优点 , 并已用于实际生产环境 , 非常符合Cube业务场景 , 因此最终采用了以firecracker轻量级虚拟机为基础的容器运行时方案 。 从下面两张图可以看出 , 通过对云计算场景特别的精简和优化 ,firecracker相对于目前主流的虚拟化组件qemu在启动速度和内存消耗方面有明显的优势 。
消息资讯|UCloud优刻得Serverless容器实例Cube的研发实践之路
文章图片

VMM启动时间和内存占用对比
2. 容器管理服务
支持虚拟机容器运行时的容器管理服务也有多种开源方案 , 例如containerd/cri-o , kata-container和firecracker-containerd等 。 经过比较 , 容器团队选择了cri-o + firecracker-containerd的组合 。 这二者在功能上能够满足单机容器管理的需求 , 而且和其他选型相比 , 代码架构更加清晰 , 调用链路简单明了 , 便于后续根据产品需求定制和改造 。
3. 容器调度服务
Kubernetes已经成为了容器调度的事实标准 , 具备丰富的功能和良好的可扩展性 。 因此容器团队采用Kubernetes作为基本调度框架 , 并根据产品需求做相关改造 , 最终基本的服务架构如下所示:
消息资讯|UCloud优刻得Serverless容器实例Cube的研发实践之路
文章图片

优化改进
虽然采用开源方案可以加快开发进度 , 但为满足产品需求仍需解决一些问题 , 主要包括以下几个方面:
1. 容器镜像
在标准的容器镜像实现中 , 镜像是通过分层结构存储在宿主上的 。 当创建容器时 , 容器运行时会在镜像层之上创建一个可写层 , 并挂载在宿主上供容器实例使用 。 但Cube容器并不是直接在宿主上运行的 , 也不需要在宿主上挂载容器根目录 。 因此容器团队修改了cri-o中镜像层的相关实现 , 直接将容器可写层以块设备的方式挂载到轻量级虚拟机中而非宿主上 , 减低了宿主对Cube容器的干扰 。
另外 , 为了解决新镜像拉取缓慢导致的容器实例启动慢的问题 , 容器团队提出了镜像远程挂载的解决方案 。 将容器镜像以块设备的形式存储在缓存集群 , 当需要在此镜像上生成容器实例时 , 先将容器镜像通过远程挂载的形式挂载到宿主上 , 然后容器运行时会在宿主上创建一层可写层生成容器实例 。 同时后台会将远程镜像同步到宿主本地 , 进一步加速读取 , 降低集群风险 。 上述方法可使宿主上首次获取镜像的时间缩短至3s以下 , 并有进一步优化空间 。 目前这一功能以镜像缓存的产品形式提供给用户使用 , 并正在逐步整合到普通镜像拉取过程中 。


推荐阅读