每日科技动态|优刻得拥抱云原Serverless技术还能这样用在容器服务中( 二 )


每日科技动态|优刻得拥抱云原Serverless技术还能这样用在容器服务中
文章图片
图中可以看到标准的虚拟机内实现的容器是左边所示 , QEMU提供了虚拟机的隔离能力 , 而用户在QEMU虚拟机内会部署一个完整的docker或者containerd , 并在此基础上拉起容器 。 我们在想能否将QEMU和虚拟机的二者能力结合为一起 。 于是在Cube中我们基于虚拟机实现了容器实例即我们的Cube , 对外暴露的是标准的K8SCRI接口 , 但具体的实现是一个轻量级的虚拟机 , 用户实际需要运行的容器是在轻量级的虚拟机内拉起的 。 这样带来的好处是Cube融合了虚拟机资源隔离和容器快速启动的优点 。
当然为了完全的比拟docker , 实现的容器快速启动 , 我们在性能上也做了很多优化 , 比如将QEMU虚拟机换成了Firecracker轻量级虚拟机 , 仅实现了最小设备 , 进一步的降低虚拟化损耗 。 并且拉起速度能够降低到100毫秒 。
当然容器的快速启动时间 , 也不仅包括容器启动的时间 , 还包括了镜像拉取的时间 。 我们在实际的应用推广过程中 , 也发现经常会遇到用户的容器特别大 , 而导致镜像拉取时间很长 , 进而导致启动速度慢 。
每日科技动态|优刻得拥抱云原Serverless技术还能这样用在容器服务中
文章图片
为了解决这种问题 , 我们实现了镜像缓存的功能 。 即用户的实际镜像拉取在第一次拉取中 , 会缓存在我们的镜像缓存中心 , 而后的镜像加载是直接通过NBD的形式直接挂载到Cube容器里 , 这样就可以实现Cube的快速启动 , 从而跳过了镜像拉取的时间 。 对于特别大的镜像 , 用户也可以选择预先加载的形式直接加载到我们的镜像缓存中心 , 从而进一步降低了启动时间 。
网络实现
和标准的docker网络实现有些不同 , 我们知道一个Cube的pod相当于一个虚拟机 , 因此Cube的pod可以直接利用原先底层SDN网络为虚拟机提供的能力 , 实现VPC内Cube和VPC内所有资源的二层互通 , 以及不同VPC内资源的互相隔离 。 另外从满足用户需求的角度出发 , 我们也实现了Cube固定内网IP的功能 , 即在Cube实例更新的过程中 , 我们可以保持容器podIP不变 。
每日科技动态|优刻得拥抱云原Serverless技术还能这样用在容器服务中
文章图片
Cube的外网连通性也可以很好利用现有云平台的网络架构 , 对于入向流量 , 我们可以将Cube挂在ULB背后 , 利用多个Cube实例实现高可用和弹性伸缩;对于出向流量 , 我们也可以通过NETGW来实现Cube对外的访问需求 。 另外对于需要固定外网IP的情况 , 我们也可以将单个EIP绑定Cube 。
存储实现
每日科技动态|优刻得拥抱云原Serverless技术还能这样用在容器服务中
文章图片
Cube的存储也可以很好的对标K8S , 主要分为以下几类:一种是K8S内置的ConfigmapSecret和EmptyDir , 这些都是作为K8S标准的功能 , 我们也在Cube实现的CRI中纷纷予以了支持;对于云厂商提供的文件存储、对象存储 , 我们是通过agent的挂载来实现的 , 其中文件存储主要是通过agent自动挂载了NFS协议 , 而对象存储是通过agent挂载了S3fuse的协议;块存储是我们改动比较大的地方 , 为了提高性能 , 我们改动了Cube所使用的虚拟机IO路径 。 通过vhost-user协议 , 对接到SPDK实现了Cube上高性能RSSD云盘的挂载 。
监控和日志的实现
每日科技动态|优刻得拥抱云原Serverless技术还能这样用在容器服务中
文章图片
每日科技动态|优刻得拥抱云原Serverless技术还能这样用在容器服务中
文章图片
监控和日志这二者的架构比较类似 , 都是将容器内的信息反馈给用户的一种形式 。 其中监控信息是通过我们自研的Cubelet组件 , 将监控信息汇集后上报给prometheus , 最终再转发给UCloudAPI的 。 而日志信息是通过Promtail采集后转发给LokiLogCluster集群 , 再转交给UCloudAPI , 另外对于长期日志 , 我们还提供了自动转存至对象存储US3的功能 。 典型使用场景


推荐阅读