协调微服务和多容器应用程序以实现高可扩展性和可用性
如果您的应用程序基于微服务或只是跨多个容器拆分,那么使用面向生产的应用程序的编排器是必不可少的。如前所述,在基于微服务的方法中,每个微服务都拥有自己的模型和数据,以便从开发和部署的角度来看它是自治的。但是,即使您有一个更传统的由多个服务组成的应用程序(如SOA),您也将有多个容器或服务,这些容器或服务由一个需要作为分布式系统部署的业务应用程序组成。这些类型的系统在扩展和管理方面很复杂;因此,如果您想要有一个生产就绪且可扩展的多容器应用程序,您绝对需要一个编排器。
图23展示了部署到由多个微服务(容器)组成的应用程序集群中的过程。
图23 容器集群
为每个服务实例使用一个容器。Docker容器是“部署单元”,容器是Docker的实例。主机处理许多容器。这看起来是一种合乎逻辑的方法。但是,如何处理负载平衡、路由和编排这些组合应用程序?
单Docker主机中的普通Docker引擎满足了在一台主机上管理单个映像实例的需要,但在管理部署在多台主机上的多个容器以用于更复杂的分布式应用程序时,它就显得力不从心了。在大多数情况下,您需要一个管理平台,它将自动启动容器、扩展每个映像包含多个实例的容器、挂起它们或在需要时关闭它们,并且理想情况下还控制它们如何访问网络和数据存储等资源。
要超越对单个容器或非常简单的组合应用程序的管理,转向具有微服务的大型企业应用程序,您必须转向编排和群集平台。
从架构和开发的角度来看,如果您正在构建由基于微服务的应用程序组成的大型企业,那么了解以下支持高级方案的平台和产品非常重要:
群集和编排器。
当你需要在多个Docker主机上扩展应用程序时,就像一个大型的基于微服务的应用程序一样,通过抽象底层平台的复杂性,将所有这些主机作为一个集群来管理是至关重要的。这就是容器集群和编排器提供的功能。Kubernetes是一个编排器的例子,通过Azure Kubernetes服务在Azure中可用。
调度程序。
调度意味着管理员能够在集群中启动容器,以便它们也提供一个UI。集群调度器有几个职责:高效地使用集群的资源,设置用户提供的约束,有效地跨节点或主机平衡容器的负载,在提供高可用性的同时对错误保持健壮。
集群和调度程序的概念是密切相关的,因此不同供应商提供的产品通常同时提供这两组功能。下表显示了集群和调度程序所具有的最重要的平台和软件选择。这些编排器通常在诸如Azure之类的公共云中提供。
用于容器群集、编排和调度的软件平台
Kubernetes
- Kubernetes是一个开源产品,它提供了从集群基础设施和容器调度到编排功能的各种功能。它允许您跨主机集群自动化应用程序容器的部署、扩展和操作。
- Kubernetes提供了一个以容器为中心的基础设施,它将应用程序容器分组为逻辑单元,以便于管理和发现。
- Kubernetes在Linux中比较成熟,在Windows中比较不成熟。
Azure Kubernetes Service (AKS)
AKS
- Azure Kubernetes服务徽标的图像。AKS是Azure中的托管Kubernetes容器编排服务,它简化了Kubernetes群集的管理、部署和操作。
在Microsoft Azure中使用基于容器的编排器
一些云供应商提供Docker容器支持以及Docker集群和编排支持,包括Microsoft Azure、Amazon EC2容器服务和Google容器引擎。Microsoft Azure通过Azure Kubernetes服务(AKS)提供Docker群集和orchestrator支持。
使用Azure Kubernetes服务
Kubernetes集群将多个Docker主机合并为一个虚拟Docker主机,因此您可以将多个容器部署到集群中,并使用任意数量的容器实例进行扩展。集群将处理所有复杂的管理管道,如可伸缩性、运行状况等。
AKS提供了一种方法,可以简化Azure中预先配置为运行容器化应用程序的虚拟机群集的创建、配置和管理。通过使用流行的开源调度和编排工具的优化配置,AKS使您能够使用现有的技能或利用大量不断增长的社区专业知识在Microsoft Azure上部署和管理基于容器的应用程序。
Azure Kubernetes服务优化了流行的Docker集群开源工具和技术的配置,特别是针对Azure。您将得到一个开放的解决方案,它为您的容器和应用程序配置提供可移植性。您可以选择大小、主机数量和orchestrator工具,AKS可以处理其他一切。
图24 Kubernetes 集群的简化结构与拓扑
在图24中,您可以看到Kubernetes集群的结构,其中主节点(VM)控制集群的大部分协调,您可以将容器部署到其他节点,从应用程序的角度来看,这些节点作为单个池进行管理,并允许您扩展到数千甚至数万个容器。
Kubernetes开发环境
在开发环境中,Docker在2018年7月宣布,Kubernetes也可以通过简单安装Docker桌面在单一开发机器(Windows 10或macOS)中运行。您可以稍后部署到云(AKS)进行进一步的集成测试,如图4-25所示。
图25 在dev machine和cloud中运行Kubernetes
Azure Kubernetes服务(AKS)入门
要开始使用AKS,可以从Azure门户或通过使用CLI部署AKS集群。有关在Azure中部署Kubernetes群集的详细信息,请参阅部署Azure Kubernetes服务(AKS)群集。
作为AKS的一部分默认安装的任何软件都不收费。所有默认选项都是用开源软件实现的。AKS可用于Azure中的多个虚拟机。您只需为您选择的计算实例以及所消耗的其他基础架构资源(如存储和网络)付费。AKS本身没有增加费用。Kubernetes的默认生产部署选项是使用Helm图表,这将在下一节介绍。
使用Helm Charts部署到Kubernetes集群
将应用程序部署到Kubernetes集群时,可以使用原始的kubectl.exe CLI工具,该工具使用基于本机格式的部署文件(.yaml文件),如前一节所述。但是,对于更复杂的Kubernetes应用程序,比如部署复杂的基于微服务的应用程序时,建议使用Helm。
Helm图表可以帮助您定义、版本、安装、共享、升级或回滚最复杂的Kubernetes应用程序。
更进一步说,还建议使用Helm,因为Azure中的其他Kubernetes环境(如Azure开发空间)也基于Helm图表。
Helm由云本地计算基金会(CNCF)维护,与微软、谷歌、Bitnami和Helm贡献者社区合作。
有关Helm图表和Kubernetes的更多实现信息,请参阅使用Helm图表将eShopOnContainers部署到AKS post。
在Kubernetes应用程序生命周期中使用Azure开发空间
Azure开发空间为团队提供了快速、迭代的Kubernetes开发体验。通过最少的开发机器设置,您可以直接在Azure Kubernetes服务(AKS)中迭代运行和调试容器。使用熟悉的工具(如Visual Studio、visualstudio代码或命令行)在Windows、Mac或Linux上进行开发。
如前所述,Azure开发空间在部署基于容器的应用程序时使用Helm图表。
Azure Dev Spaces可以帮助开发团队提高Kubernetes的工作效率,因为它允许您通过简单使用Visual Studio 2019或Visual Studio代码直接在Azure的全局Kubernetes集群中快速迭代和调试代码。Azure中的Kubernetes集群是一个共享的托管Kubernetes集群,因此您的团队可以协同工作。您可以单独开发代码,然后部署到全局集群,并使用其他组件进行端到端测试,而无需复制或模拟依赖项。
如图26所示,Azure开发空间中最不同的功能是创建可以与集群中的其他全局部署集成运行的“空间”的功能。
图26 在Azure开发空间中使用多个空间
基本上你可以在Azure中设置一个共享的开发空间。每个开发人员都可以只关注应用程序的一部分,并且可以在开发空间中迭代地开发预提交代码,该空间已经包含了他们的场景所依赖的所有其他服务和云资源。依赖项始终是最新的,开发人员的工作方式反映了生产。
Azure Dev Spaces提供了一个空间的概念,它允许您在相对隔离的环境下工作,而不必担心破坏团队的工作。每个开发空间都是层次结构的一部分,它允许您使用自己正在进行的微服务覆盖“顶级”主开发空间中的一个(或多个)微服务。
此功能基于URL前缀,因此当在URL中使用任何开发空间前缀时,如果目标微服务存在于开发空间中,则会向其提供请求,否则会向上转发到层次结构中找到的目标微服务的第一个实例,最终到达顶部的主开发空间。
要获得具体示例的实际视图,请参阅Azure Dev Spaces上的eShopOnContainers wiki页面。