面向容器的集群资源管理系统研究
李英华
摘要:在云计算日益火爆的今天,云计算领域诞生了一个新兴技术,使得整个计算机行业为之振奋。这就是Docker——一个全新的“容器”。Docker作为轻量级容器能够为云计算3种模型(SaaS,PaaS,IaaS)之一的PaaS的构建提供可靠的支持。文章以Docker为基础平台,以Google开源的Kubernetes为平台,Harbor为镜像仓库,Etcd为全局索引系统,falcon-agent为监控构建完整的集群资源管理系统,提供大型集群环境部署及管理方案。
关键词:云计算;容器;虚拟化;集群
1研究背景及意义
现行的大规模网络集群都由巨量的服务器组成,多数计算型资源的服务器,的计算能力无法得到充分利用。例如LXC,KVM等虚拟化技术虽然对资源进行隔离,但LXC,KVM技术依赖于物理CPU,及内存,是硬件级别,无法进行快速的部署、启动和迁移。而Docker相当于操作系统之上的程序,利用操作系统containerzation技术,可以在KVM虚拟机上运行,容器占用系统资源很低,极大地提高了资源利用率。当今,面向互联网的服务,一旦各种资源达到瓶颈,最简单的方法就是提高服务器的数量。但是,需要大规模的部署系统及应用,且峰值过后,又需要迁移过量的机器。而Docker通过将多种依赖组件及服务打包成镜像的方式,能够实现快速的部署和实现,且一台主机可以同时运行多个实例,峰值过后,还可快速的销毁,极大地提高了大型服务的伸缩能力。云计算技术使互联网服务必须由巨量的服务所支撑。不同的服务有着不同的功能就如同不同的零件组装成机器,而Docker容器就像一个集装箱,把所需要的服务及环境都封装在里面,想用的时候随时可以拿走并使用,提供了一个快速启动,快速部署,版本控制的方法。Docker与云计算平台的结合产生了良好的化学反应。
2系统综述
集群资源管理系统实现资源的统一管理和使用,同时监视集群的资源负载情况,为上层业务系统提供灵活、快速、动态的多种资源服务,提供统一的系统资源管理基础构架。整个系统由资源实体层、资源服务层、资源管理层等组成。
面向容器的集群资源管理系统,管理计算资源,为不同服务提供资源及环境。其整体系统架构如图1所示。
按照系统各组件之间的关联关系,完整的系统需要的组件可分为以下部分:(1)Docker组件Kubernetes集群使用Docker作为基础容器组件,容器启动net=none网络,通过assginer和pipwork配置容器的网络。Docker在LXC之上融#AUFs分層镜像管理机制,抛弃传统虚拟机试图模拟完整机器的思路,以应用为单元进行“集装封箱”,是“轻量级”的虚拟化技术。Docker Engine可以自动化部署应用到可移植的容器中。Docker容器可以封装任何有效负载,几乎可以在任何服务器之间进行一致性运行。开发者构建的应用只需一次构建即可多平台运行。运营人员只需配置他们的服务,即可运行所有应用。(2)Kubernetes组件Kubernetes Cluste中创建的每一个集群都对应一套Kubernetes环境。一套完整的Kubernetes集群包含一台Kubernetes master和若干台Kubernetes node。为了确保Kubernetes集群正常运转,每一台集群内主机上首先需要配置好Docker组件,此外,整套集群需单独部署如下组件:etcd:为Kubernetes集群配置提供存储服务,记录所有组件的信息和更新状态;另外,assginer也依赖于etcd,在提供的安装脚本中,Kubernetes和assginer共用同一套etcd集群。(3)监控组件。容器资源管理的监控系统是在小米开源的open-falcon基础上进行修改实现的。一套完整的监控系统需要如下组件:agent:采集信息并上报组件,需要在集群中所有node节点部署。
3系统具体功能实现
Kubenetes通过scheduler通过Apiserver查询资源充足的机器分配Pod,过程如下:通过客户端提出需求,可以通过Apiserver的Restful API,也可以使用kubectl命令行工具。支持的数据类型包括JsON和YAML。具体步骤为:(1)Apiserver获取资源申请请求,并存储到etcd;(2)调度器通过Apiserver查询请求。尝试为Pod分配主机;(3)过滤主机:调度器根据请求需要的资源过滤资源剩余不足的节点;(4)进一步评估剩余机器,寻找负载最低的机器;(5)选择主机:将选择的结果存储到etcd中;(6)对应机器根据kubelet查询的结果执行创建Pod操作。
Docker容器申请流程及说明:通常在生产环境中,往往需要对大规模需求进行快速的响应部署。通常情况下都是以rc为对象创建一一对应的实例。通过yaml文件描述需求具体情况及资源分配。通过yaml文件将Ip池导入etcd,具体命令操作为:Assigner import import.yaml$ETCDPATH。然后再资源上线:通过kubectl命令行操作,具体命令如下:Kubectl creme-fxx.yaml。
通过commiter对稳定的Docker容器进行版本固化:commiter是一款由go语言开发的,基于Kubernetes集群的系统镜像资源和IP资源的管理系统。该系统的功能实现需要assigner和Kubernetes的配合。Commiter为用户提供可配置的镜像仓库地址、Apiserver地址、ftp地址;以组件为单位,将组件内所有的业务容器打包成镜像,镜像命名规则为:registory/app-component-ip:tag,其中tag为当天日期;将键值对<镜像名:容器IP>写入ETCD中/commiter/ips目录下,其中镜像名不包含仓库信息,即:app-component-ip:tag;将镜像上传到镜像仓库;对该组件内每个业务容器,增加对应Kubernetes Pod标签,标签内容为IP=containerip;根据组件rc模板文件,为该组件内每个业务容器生成一个单独的pod_rc控制文件,该pod_rc命名规则为:appre-component-ipyaml,其中该pod_rc控制文件中镜像名为该pod中业务容器利用commiter打包生成的镜像名;将生成的pod_rc文件上传到ftp对应/app/component目录下;针对生成的pod_rc,调用Kubernetes,执行create操作,完成pod_rc对该组件控制rc的接管(组件内所有的pod_rc全部执行完才算完全接管)。
容器IP配置的说明:(1)编写import.yaml文件将ip池导入etcd按指定目录存储;(2)创建pod容器成功后通过assigner查询etcd中对应IP池提取未被占用的IP;(3)通过pipework为指定容器分配IP。
4结语
随着移动互联网的迅速发展,海量的数据使得企业级应用承受了巨大的压力。云计算,大数据的作用越来越大。也催生了虚拟机及容器技术。例如Docker。又由此催生了一系列管理容器的服务,例如Kubernets。
现在许多企业都在加大对容器技术的使用力度。对于大型集群而言,容器技术,可以提升资源利用率。提高资源分配效率及弹性伸缩能力。结合镜像的使用方式,可实现服务的快速部署及启动。京东在双11部署了15万+的容器,使业务效率提升了N个等级。阿里云也正在推进容器化。