微服务架构开发实战:如何实现微服务的自动扩展?
如何实现微服务的自动扩展
前面讲了一些关于自动扩展的理论知识,但如何实现自动扩展,并不是三言两语就能够说得清楚的。特别是为了实现前面提到的那些自动扩展的模式及策略,在操作系统级别方面会需要大量的执行脚本。在自动扩展方面,SpringCloud框架也并没有给出确切的答案。
随着微服务架构的流行,以Docker等为首的容器技术开始火热发展。Docker 是实现自动扩展非常好的基础,因为它提供了一个统一-的容 器处理方式,而不管微服务所使用的技术如何。它还帮助用户隔离微服务,以避免相邻的服务之间产生资源的竞争。
但是,Docker 和脚本只能部分解决问题。在大规模Docker部署的情况下,仍然需要回答如下问题。
●如何管理数千个容器?
●如何监控他们?
●在部署工件时,如何应用规则和约束?
●如何确保能够正确地利用容器来获得资源效率?
●如何确保至少有一定数量的最小实例正在运行?
如何确保依赖服务正常运行?
●如何进行滚动升级和优雅的迁移?
●如何回滚错误的部署?
所有这些问题都指出需要有一个解决方案来解决以下两个关键功能。
●一个容器抽象层,在许多物理或虚拟机上提供统一的抽象 。
●容器编排和初始化系统在集群抽象之上智能管理部署。
本节将会重点讨论这两点。
容器编排
容器编排工具为开发人员和基础架构团队提供了一个抽象层来处理大规模的集装箱部署。容器编排工具提供的功能因供应商而异。然而,他们都提供了共同的功能,其中包括发现、资源管理、监控和部署。
1.容器编排的重要性
编排很重要,是因为在微服务的架构里面,应用程序被拆分成不同的微服务应用,因此需要更多的服务器节点进行部署。为了正确管理微服务,开发人员倾向于为每个虚拟机部署一个微服务 ,这在一定程度上:降低了资源利用率。在很多情况下,这会导致CPU和内存的过度分配。
在大型系统的部署中,微服务的高可用性要求迫使运维人员会添加越来越多的服务实例以实现冗余。实际上,虽然它提供了所需的高可用性,但这会导致未充分利用的服务器实例。一般来说,与单一应用程序部署相比,微服务部署需要更多的基础设施。由于基础设施成本的增加,反而令许多组织看不到微服务的价值。如图14-9 所示,为了实现系统的高可用性,每个微服务都会部署多个实例。
为了解决图14-9 中所述的问题,首先需要一个能够执行以 下操作的工具。
●自动执行一些活动。例如,高效地将容器分配给基础设施,这对开发人员和管理员来说是透明的。
●为开发人员提供一个抽象层,以便他们可以将其应用程序部署到数据中心,而无须关心到底应用是要使用哪台机器。
可以是最少的人为交互。
●通过最大限度地利用可用资源来高效构建、部署和管理应用程序。
容器正是能够胜任上述工作的有力工具。使用容器,就可以以统一的方式来处理应用程序, 而无须关心微服务具体是使用了哪种技术。
2.容器编排的工作职责
典型的容器编排工具有助于虚拟化- -组计算机并将其作为- -个集群进行管理。容器协调工具还有助于将工作负载或容器移动到对用户透明的机器上。
对于容器编排,业界并没有统-的术语,常见的称呼有容器编排、集群管理、数据中心虚拟化、容器调度、容器生命周期管理、数据中心操作系统等。
容器编排工具是为了帮助自助服务和配置基础设施,而不是要求基础设施团队按照预定义的规格分配所需的机器。在这种自动化的容器编排方法中,机器不再是预配置并预先分配给应用程序。
一些容器编排工具还可以帮助跨多个异构机器,甚至可以跨多个虚拟化数据中心,并创建-一个弹性的私有云式基础架构。
容器编排工具目前没有标准的参考模型。因此,不同的供应商可能实现的功能各不相同。
容器编排软件一般都会具备以下关键功能。
●集群管理:将一个虚拟机和物理机集群作为- -台大型机器进行管理。这些机器在资源能力方面可能是异构的,但基本上还是以Linux 为主要操作系统的机器。这些虚拟集群可以在云端,也可以是在本地,或者是两者的组合。
●自动部署:它支持应用程序容器的多个版本,并支持在大量集群机器上进行滚动升级。这些工具也能够处理错误,并且可以回滚到可用的版本。
●可伸缩性:这样可以根据需要处理应用程序实例的自动和手动可伸缩性,并将其作为主要目标进行优化利用。
● 运行状况监控:适用于管理集群、节点和应用程序的运行状况。它可以从集群中删除有故障的机器和应用程序实例。
●基础架构抽象:开发者不用担心关于机器、容量等。这完全是容器编排软件来决定如何计划和运行应用。这些工具还从开发者中抽象出机器的细节,如容量、利用率和位置等。对于应用程序所有者来说,这相当于- - 台几乎可以无限容量的大型机器。
● 资源优化:这些工具的固有行为是以高效的方式在一组可用机器上分配容器工作负载,从而降低成本,并提高机器的利用率。
●资源分配:根据应用程序开发人员设置的资源可用性和约束来分配服务器。资源分配将基于这些约束(如关联性规则、端口要求、应用程序依赖性、运行状况等)。
●服务可用性:确保服务在集群中的某处运行。在发生机器故障的情况下,容器编排通过在集群中的某个其他机器上重新启动这些服务来自动处理故障。
●敏捷性:敏捷性工具能够快速将工作负载分配给可用资源,或者在资源需求发生变化时将工作负载移至机器上。此外,还可以根据业务关键性、业务优先级等设置约束来重新调整资源。
●隔离:这些工具中有一些提供了开箱即用的资源隔离功能。因此,即使应用程序没有进行容器化,也可以实现资源的隔离。
3.资源分配的常用算法
从简单算法到具有机器学习和人工智能的复杂算法,在容器编排中,资源分配会使用各种算法。
比较常用的算法有传播( Spread)、装箱( Bin Packing )和随机( Random)。针对应用程序设置的约束,来设置基于资源可用性的默认算法。
图14-10~图14-12 显示了这些算法是如何用部署填充到可用的机器上的。在这种情况下,这里用两台机器进行演示。
资源分配的3种常用策略解释如下。
●传播:这将工作负载平均分配到可用的机器上,如图14-10所示。
●装箱: 这将试图通过机器填充机器,并确保机器的最大利用率。在按需付费的云服务中,装箱算法是特别好的。
随机:随机选择机器并在随机选择的机器上部署容器,如图14-12所示。
随着科技的发展,机器学习和协作过滤等手段可以更好地提高效率。例如,可以将未分配的资源分配给高优先级的任务( 这些任务意味着有更高的收益),以便充分利用现有资源,提高创收。
4.与微服务的关系
微服务的基础设施(如果配置不当)很容易导致基础设施过大,本质上导致成本的增加。正如前面部分所讨论的那样,在处理大规模微服务架构系统时,具有容器编排工具的类似云的环境对于实现成本效益至关重要。
在Spring Cloud 项目中利用Spring Boot来构建微服务,是利用容器编排技术的理想工具。由于基于Spring Cloud的微服务并不关心具体的位置,因此可以将这些服务部署到集群中的任何位置。
每当出现服务时,它都会自动注册到服务注册中心并通告其可用性。另外,消费者总是寻找服务注册表来发现可用的服务实例。这样,应用程序就可以支持完整的流体结构,而无须预先部署拓扑结构。使用Docker能够在抽象运行时,以便服务可以在任何基于Linux的环境中运行。
5.与虚拟化技术的关系
容器编排解决方案在许多方面与传统的服务器虚拟化解决方案有着比较大的差异。容器编排解决方案作为应用程序组件,运行在虚拟机或物理机器之上。
常用的容器编排技术
1. Docker Swarm
Docker Swarm是Docker的本地容器编排解决方案。Swarm 提供与Docker的本地和更深层次的集成,并有着与Docker的远程API兼容的API。它在逻辑上将- -组 Docker主机分组,并将它们作为一个大型的Docker虚拟主机进行管理。应用程序管理员和开发人员无须决定容器是在哪个主机上部署,这个决策将被委托给Docker Swarm。它将根据分组打包和扩展算法决定使用哪个主机。
由于Docker Swarm基于Docker的远程API,现有Docker用户的学习曲线与其他任何容器业务流程工具相比要少得多。然而,Docker Swarm是市场上较新的产品,仅支持Docker容器。
Docker Swarm使用管理器( manager)和节点( node)的概念。管理员通过管理器来与Docker容器进行交互和调度。节点则是Docker容器部署和运行的地方。
2. Kubernetes
Kubermetes ( k8s )来自Google 的工程设计,使用Go语言编写,并正在Google进行大规模部署的测试。与Swarm类似,Kubernetes帮助管理跨集群节点的容器化应用程序。它有助于自动化容器部署和容器的调度与可伸缩性。它支持许多有用的开箱即用功能,如自动逐步展开、版本化部署和容器弹性管理等。
Kubermetes 体系结构具有主节点( master)、节点(node)和pod等概念。主节点和节点一起被称为Kubernetes集群。主节点负责跨多个节点分配和管理工作负载,节点就是虚拟机或物理机器。
节点既可以被进一-步分割成pod,也可以托管多个pod。一个或多个容器在一个pod内分组并执行。
pod还有助于管理和部署共存服务以提高效率。Kubernetes 也支持标签的概念作为键值对,以便查询和查找容器。标签是用户定义的参数,用于标记执行常见类型工作负载的某些类型的节点,如前端Web服务器等。
部署在集群上的服务将获得- - 个IP/DNS用来访问该服务。Kubernetes 对Docker有开箱即用的支持。然而,Kubernetes 的学习曲线会比Docker Swarm更多。作为OpenShift 平台的一部分, RedHat为Kubernetes提供商业支持。
3. Apache Mesos
有关ApacheMesos的介绍,最早可追溯到BenjaminHindman等所写的技术白皮书Mesos:APlatform for Fine-Grained Resource Sharing in the Data Center (可以在线查看该文章
htp://mesos.berkeley.edu/mesos_ tech_ reportpdf )。后来Benjamin Hindman加入了Twitter, 负责开发和部署Mesos。再后来Benjamin Hindman离开Twitter而去了Mesosphere, 着手建设并商业化以Mesos为核心的DC/OS (数据中心操作系统)。
Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核,使用内置Linux内核相同的原理,只是在不同的抽象层次。该Mesos内核运行在每个机器上,在整个数据中心和云环境内向应用程序(如Hadoop、Spark、 Kafka、 Elasticsearch 等)提供资源管理和资源负载的API接口。
Apache Mesos具备以下特性。
● 线性可扩展性:业界认可的可扩展到10000个节点。
●高可用性:使用ZooKeeper实现master和agent的容错,且实现了无中断的升级。
支持容器:原生支持Docker容器和AppC镜像。
●可拔插的隔离:对CPU、内存、磁盘、端口、GPU和模块实现自定义资源的一-等( first class )隔离支持。
●二级调度:支持使用可插拔调度策略来在相同集群中运行云原生和遗留的应用程序。
API: 提供HTTP API在操作集群、监控等方面开发新的分布式应用程序。
Web界面:内置Web界面查看集群的状态,并可以导航containersandbox(容器沙箱)
跨平台:可以在Linux、OSX和Windows 上运行,并且与云服务提供商无关。
Mesos与以往的解决方案稍有不同。它更多的是依靠其他框架来管理工作负载执行的资源管理器。它位于操作系统和应用程序之间,提供了- -个逻辑的机器集群。
Mesos是一个分布式系统内核,将多台计算机逻辑分组并将其虚拟化为一台 大型机器。它能够将许多异构资源分组到一个统一资源集群 上,在这个集群上可以部署应用程序。基于这些原因,Mesos也被称为在数据中心建立私有云的工具。
Mesos具有主节点和从节点的概念。与早期的解决方案类似,主节点负责管理集群,而从节点负责运行工作负载。它在内部使用ZooKeeper进行集群协调和存储,也支持框架的概念。这些框架负责调度和运行非集装箱应用程序和容器。Marathon、 Chronos 和Aurora是应用程序调度和执行的流行框架。Netflix 的Fenzo是另一个开源的Mesos框架。有趣的是,Kubernetes 也可以用作Mesos框架。
Marathon支持Docker容器,以及非容器化的应用程序。Spring Boot可以直接配置在Marathon中。Marathon提供了许多开箱即用的功能,如支持应用程序依赖项用于扩展和升级服务的应用程序分组、实例的启动和关闭、滚动升级、回滚失败升级等。
Mesosphere作为DC/OS平台的一部分, 为Mesos和Marathon提供商业支持。
总结
Spring Cloud并没有提供现成的处理自动扩展的方案,但结合目前市面上常用的容器编排技术(如上文提到的Docker Swarm、Kubermetes、Apache Mesos等),能够方便地实现服务的自动扩展。
自动扩展在微服务架构中是一个相对复杂的问题,学习成本相对也比较高。由于自动扩展并非是Spring Cloud的核心话题,因此本文也只是给出了一些基本的概念和思路,不做深入的探讨。如果读者对这方面感兴趣,也可以自行查阅相关资料。以下是一些常用的学习链接地址。
Docker Swarm: htps://cs.docker.com/swarm
● Kubernetes : htps://kubermetes.io/docs/home/.
●Apache Mesos: htp:/m/esos.apache .org/documentation/latest。
本篇文章内容给大家讲解的是如何实现微服务的自动扩展
下篇文章给大家讲解的是微服务的高级主题一 熔断机制;
觉得文章不错的朋友可以转发此文关注小编;
感谢大家的支持!
本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。