云计算那些事儿:从IaaS到PaaS进阶
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.5 云计算中的关键技术

1.5.1 异构资源管理

近些年,x86在CPU架构的广泛应用及Linux在操作系统层面上的绝对优势为云,主要为开源云的发展奠定了基础,但还有很多商业化的虚拟化软件及多种开源实现。在企业发展过程中,会采用不同的解决方案,逐步形成异构资源池。

异构资源,就是数据中心里面有多种虚拟化软件存在的场景,当然对于最终使用虚拟机的用户来说,是不需要感知的。当有不同的虚拟化软件存在的时候,IaaS平台需要去适配各种虚拟化接口。如果有一部分虚拟机是VMware,还有一部分是KVM,当需要管理这两种虚拟化软件的时候,需要通过相应的接口去适配。通常,针对KVM需要通过Libvirt接口,而针对VMware是通过VCenter的API的。将不同的接口通过适配器模式抽象成统一的接口。在资源管理的时候,需要先确定资源所属的虚拟化类型,然后调用不同的虚拟化API完成资源管理。例如,针对一次虚拟机的开机操作,需要先通过数据库查询该虚拟机所在资源池、所使用的虚拟化软件,然后调用对应的虚拟化软件API,如果是KVM,则去调用Libvirt的接口启动Domain。如果是虚拟机和容器的混合,就需要去适配容器的管理API。在早期,Nova在这方面也有所尝试,通过开发一套针对Docker的Nova Docker驱动程序去管理Docker容器。

1.5.2 虚拟化

虚拟化是云的基石,包括计算虚拟化、分布式存储虚拟化、SDN网络虚拟化等。在云的环境中软件定义一切,通过软件实现了资源隔离、安全访问、数据高可用性和网络的自定义。

虚拟化需要解决资源的竞争与隔离,多个用户的进程运行在同一台服务器上面,一方面需要保障每个进程具有相同的优先级,避免由于单个进程消耗过多资源而影响其他进程的运行,另一方面需要完善隔离机制,避免单个程序的安全漏洞影响其他用户程序。

虚拟化需要提供与传统资源相兼容的接口,很多情况下,终端用户是不需要感知虚拟化存在的。在为用户分配一台服务器的时候,用户不用关心它到底是一台物理机,还是一台虚拟机。分配一个块存储或者NFS的时候,用户也不需要了解数据是如何保存的。

通过软件虚拟化虽然可以实现很多硬件的功能,但性能一直是被业内诟病的。由于软件虚拟存在天生的性能瓶颈(x86通用服务器和专有硬件之间的区别),虚拟化并不能完全达到硬件性能,并且很多虚拟化方案本身还消耗一定的资源,如KVM。

1.5.3 资源调度

资源调度就是当用户申请资源的时候,系统需要通过调度确定资源位置(针对虚拟机调度场景决定虚拟机开在哪台物理机器上)。云资源调度属于典型的NP问题,需要考虑的因素有很多,如机房、硬件、网络、应用程序、用户等。资源调度的优劣不仅会影响资源利用率的高低,还会影响整个系统的稳定性。可想而知,如果将公有云(百万或者千万服务器级别)的CPU利用率提高1%,带来的经济价值将是非常可观的。

Google在一篇关于Omega的调度系统论文中将调度分为三类:单体、二层调度和共享状态。单体是指所有任务都是通过一个串行调度器分配的,典型的是Google Borg和它的开源实现Kubernetes,它的优点是简单,但缺点也比较明显,很难支持多类型任务的执行,如同时支持批处理和长任务。二层调度是将资源分配和任务调度分离,第一层是从全局的资源池中分配资源给各种类型任务调度器,第二层任务调度器依据任务特点启动任务,典型的代表是Mesos和Yarn,其中,Mesos的Framework或者Yarn的AppMaster就是任务调度器。二层调度器的缺点是:资源调度器无法感知全局资源,只了解自己的可用资源,并且每个任务调度器只会最大化自己的利益,造成全局资源的使用失衡。为了解决二层调度的缺点,引入了共享状态调度器,它通过在每个任务调度器中保存一份整个集群状态信息的副本,从而实现全局调度,典型的代表是Omega。但共享状态调度的方式实现起来比较复杂,除了解决数据共享,还需要解决调度冲突等问题。即便是Omega,在Google内部也还没有大面积推广,资源的三种调度方式如图1-4所示。

图1-4 资源的三种调度方式

通常的调度流程分为两层,第一层是主机过滤(Filter),第二层是主机的权值打分(Weight)。整个流程如图1-5所示。

图1-5 调度流程

通过Filter和Weight决定这次创建资源(虚拟机或者容器)应该分配到哪一台服务器上。在Filter过程中,主要是主机筛选,通常是对容量如剩余CPU、内存、主机端口、主机IP地址、主机名或者主机位置等条件筛选。在Weight阶段,主要通过一些调度算法,如:平均资源使用算法、最大主机资源利用率算法、亲和与反亲和算法等给每个Filter后的主机进行评分,最后按照分数排序确定最优主机。当服务器达到一定规模后,Filter和Weight过程将会耗费很多时间,优化的方式通常包括:分区调度(将主机划分成多个集群,每次调度只针对集群)、并行调度(将调度算法并行化处理,提高执行效率,并采用乐观锁和重试机制)。

在资源混部的架构下,资源调度更加复杂:虚拟机与容器混部、流或批处理任务与常驻进程混部、多任务优先级QoS等。任务优先级调度需要保障高优先级任务拥有更高的资源分配权。通常批处理任务的优先级比较低,而Web服务的优先级较高,当资源不足时可以优先回收批处理,保障Web服务的稳定运行。

1.5.4 自定义网络

在云环境中,每个用户都有多套VPC(Virtual Private Cloud)。这是用户自定义的网络环境,可以配置网络的IP地址范围、创建子网,以及配置路由表、网关和ACL安全设置等操作。这在传统的网络环境很难实现,因为在传统的网络架构中,网络拓扑在网络设备部署的时候就已经被决定了,并不能被随意改变。后来,诞生了vlan等技术能够将网络二层划分,但由于vlan个数及配置管理复杂等问题,并不适合在数据中心内提供多租户自定义网络。网络虚拟化,或者说SDN技术可以帮助我们解决相关问题。虚拟的网络交换机提供数据帧的二层转发,相比于传统的物理交换机,可以更加灵活地配置,例如可以通过流表随意修改源mac和目的mac、添加和去除vlan等;虚拟的路由器共有三层转发功能,结合iptables技术提供NAT功能,通过namespace技术可以为每个用户提供一个虚拟路由器;还有安全组的设置,可以自定义各种安全规则,将虚拟机加入安全组,从而应用特定的安全策略等。

1.5.5 安全与高可用

安全是指数据的访问安全和不丢失,高可用是指数据可以随时被访问。用户将数据和业务迁移到云上是存在一定风险的。特别在公有云环境中,保障数据安全保密及可用非常重要。在面对系统漏洞或者网络DDoS攻击时,如何做到将风险降到最低等问题都是云计算面临的关键技术。

数据安全常用的隔离技术包括计算虚拟化隔离(如KVM),网络虚拟化(如VXLAN),存储虚拟化(如LUN),还包括用户权限认证和授权管理等。数据的高可用可以通过多副本实现,甚至是跨数据中心的多副本备份,服务的高可用可以借助高可用的弹性负载均衡或者纠错码分发流量,自动摘除后端故障节点来实现。