1.5 Istio服务网格简介
Istio是一个由谷歌、IBM和Lyft创建的服务网格的开源实现,它以透明的方式向服务架构添加弹性和可观测性。使用Istio,应用程序不必知道它们是服务网格的一部分:每当它们与外部世界交互时,Istio就代表它们处理网络。无论你使用的是微服务、单体服务还是介于两者之间的服务,Istio都能带来很多好处。Istio的数据平面使用Envoy代理配置应用程序,该代理被部署在应用程序旁边。Istio的控制平面由几个组件组成——这些组件为最终用户/运维人员提供API、代理的配置API、安全设置、策略声明等。我们将在本书后面的章节中讨论这些控制平面组件。
Istio最初是为了在Kubernetes上运行而构建的,但它是从与部署平台无关的角度编写的。这意味着你可以跨部署平台(如Kubernetes、OpenShift),甚至在传统部署环境(如虚拟机)中使用基于Istio的服务网格。在后面的章节中,我们将看看它对于跨云组合(包括私有数据中心)的混合部署有多么强大。
注:Istio在希腊语中是“帆”的意思,与Kubernetes这个代表航海的词汇很相配。
既然每个应用程序实例旁边都有一个服务代理,那么应用程序就不再需要用于熔断、超时、重试、服务发现、负载均衡等特定于语言的弹性库了。此外,服务代理还可处理指标收集、分布式追踪和访问控制。
服务网格中的流量都经过Istio服务代理,因此Istio在每个应用程序上都有控制点来影响和指导其网络行为。这允许服务运维人员控制流量,并通过金丝雀发布、暗启动、分阶段发布和A/B测试来实现细粒度的发布。我们将在后面的章节中探讨这些功能。
图1.9展示了:
①流量从网格外的客户端通过Istio入口网关进入集群。
②流量流向Shopping Cart服务。流量首先通过其服务代理,服务代理可以为服务应用超时、指标收集、安全强制等策略。
③当请求通过各种服务时,Istio的服务代理可以在各个步骤拦截请求并做出路由决策(例如,将一些打算用于Tax服务的请求路由到Tax服务的v1.1,该服务可能对某些税务计算有修复)。
④Istio的控制平面(istiod)用于配置Istio代理,这些代理处理路由、安全性、遥测采集和弹性。
⑤请求指标被周期性地发送回各种收集服务。分布式追踪span(如Jaeger或Zipkin)被发送回追踪存储区,该存储区稍后可用于追踪系统中请求的路径和延迟。
图1.9 Istio是一个由控制平面和基于Envoy的数据平面组成的服务网格的实现
安全性是任何基于服务架构的重要需求。在默认情况下,Istio启用了安全性机制。由于Istio控制了应用程序网络路径的两端,因此在默认情况下,它可以透明地加密通信。事实上,更进一步,Istio可以管理密钥和证书的发放、安装和轮换,这样服务就可以立即获得双向TLS。如果你曾经经历过为双向TLS安装和配置证书的痛苦,那么你将会感受到Istio这项功能的强大和操作的简捷。Istio可以分配工作负载标识并将其嵌入证书中,还可以为工作负载创建身份来进一步实现强大的访问控制策略。
最后,与前面的功能同等重要的是,使用Istio,你可以实现配额、限流和组织策略。使用Istio的策略实施,你可以创建非常细粒度的规则,允许或禁止哪些服务之间的交互。在跨云(公共云和内部云)部署服务时,这一点尤为重要。
Istio是一个功能强大的服务网格实现。它允许你简化运行和维护云原生服务架构,也适用于混合云环境。接下来的章节将向你展示如何利用Istio的功能操作微服务。
1.5.1 服务网格与企业服务总线的关系
SOA时代的企业服务总线(ESB)与服务网格在一定程度上有一些相似之处。如果我们看一下ESB在SOA早期是如何被描述的,甚至可以看到一些类似的语言:
企业服务总线(ESB)是SOA架构中透明的协作者,它在架构中对SOA应用程序的服务是透明的。但是,ESB的存在对于简化服务调用任务至关重要——在需要的地方使用该服务,与定位这些服务,以及通过网络传输服务请求以调用部署在企业内部服务的细节无关。
在对ESB的描述中,我们看到它应该是一个“透明”的协作者,这意味着应用程序不应该感知到它。对于服务网格,我们期望它也有类似的行为。服务网格应该对应用程序透明。ESB也是简化服务调用任务的基础,包括协议转换、消息转换和基于内容的路由等。服务网格并不负责ESB所做的所有事情,但它确实通过重试、超时和熔断提供了请求弹性,而且提供了服务发现和负载均衡等服务。
总的来说,服务网格和ESB之间有一些显著的区别:
• ESB在组织中引入了一个新的竖井,它是企业内部服务集成的“守门人”。
• ESB是一个非常集中化的部署/实现。
• ESB混合了应用程序网络和服务中介的关注点。
• ESB通常基于复杂的专有供应商软件。
图1.10显示了ESB如何通过将自身置于中心位置,然后将应用程序业务逻辑与应用程序路由、转换和中介结合来集成应用程序。
图1.10 ESB作为集成应用程序的集中式系统
服务网格的作用仅体现在应用程序网络方面。复杂的业务转换(如X12、EDI和HL7)、业务流程编排、流程异常、服务编排等不属于服务网格的职责。此外,服务网格数据平面是高度分布式的,其代理与应用程序分布在一起。这消除了ESB架构中经常出现的单点故障或瓶颈。最后,运营团队和服务团队都要负责建立服务水平目标(SLO),并配置服务网格来支持它们。与其他系统进行集成不再是一个集中式团队的权限,所有的服务开发人员都有这个责任。
1.5.2 服务网格与API网关的关系
服务网格技术与API网关既有相似之处,也有不同之处。在API管理套件中,使用API网关基础设施(不同于“链接1”上的微服务模式)为组织的公共API提供面向公众的端点。它的作用是为这些公共API提供安全性、限流、配额管理和指标收集功能,并与包含API计划规范、用户注册、计费和其他操作问题的总体API管理解决方案相结合。API网关架构各不相同,但主要用于在系统边界处公开公共API。它们还被用于内部API,以整合安全性、策略和指标收集功能。但是,这将创建一个流量通过的集中式系统,其可能成为系统瓶颈,如ESB和消息传递总线所述。
图1.11显示了在使用内部API时,服务之间的所有内部流量是如何通过API网关的。这意味着对于图中的每个服务都要进行两跳:一跳是到达网关,另一跳是到达实际服务。这不仅意味着增加了网络开销和延迟,还影响安全性。使用这种多跳架构,API网关不能保护应用程序的传输机制,除非应用程序参与安全配置。而且在很多情况下,API网关并没有实现像熔断或bulkheading这样的弹性能力。
图1.11 支撑服务流量的API网关
在服务网格中,代理与服务一起配置,不需要额外的跳转。它们也是分散的,因此每个应用程序都可以为其特定的工作负载配置自己的代理,而不会受到noisy neighbor场景[1]的影响。由于每个代理都与其对应的应用程序实例共存,因此它们可以在应用程序不知道或不积极参与的情况下,保护端到端的流量传输机制。
图1.12显示了服务代理如何成为执行和实现API网关功能的场所。随着Istio等服务网格技术的不断成熟,我们将看到API管理会构建在服务网格之上,而不需要专门的API网关代理。
图1.12 服务代理实现ESB和API网关功能
1.5.3 在非微服务架构中使用Istio
当你转向在不可靠的云基础设施上体验拥有大量服务与网络连接的架构,而这些架构可能跨越集群、云和数据中心时,Istio就可以大显身手了。此外,由于Istio运行于应用程序之外,它也可以被部署到现有的遗留环境或棕地环境中,从而将它们合并到网格中。
例如,如果你现在有一个单一实例,Istio服务代理可以被部署在单一实例旁边,为它透明地处理网络通信。至少,这可以增加对理解应用程序的使用、延迟、吞吐量和失败特征非常有用的请求指标。Istio还可以参与更高级的功能,比如实施服务权限策略。这种能力在混合云部署中非常重要,混合云部署包括在私有云上运行的单体服务和在公共云上运行的云服务。通过Istio,我们可以实施诸如“云服务不能访问或使用本地应用程序中的数据”之类的策略。
你可能还会使用NetflixOSS这样的弹性库来实现以前的微服务,Istio也为这些部署实例带来了强大的功能。即使Istio和应用程序都实现了类似于熔断器的功能,你也会感到安全,因为知道会应用更严格的策略,一切都应该正常工作。超时和重试的场景可能会发生冲突,但是使用Istio,你可以提前测试服务,在将其投入到生产环境中之前发现这些冲突。
1.5.4 在分布式架构中使用Istio
你应该根据实际问题和自己需要的功能来选择实现技术。通常,Istio和服务网格等技术是强大的基础设施,涉及分布式架构的很多领域,但是它们不应该被考虑到你可能遇到的所有问题。图1.13显示了一个理想的云架构是如何将不同的关注点从实现中的每一层分离出来的。
图1.13 云原生应用程序中关注点分离概述。Istio对应用层起支持作用,位于较低级别的部署层之上
架构的底层是自动化部署的基础设施,它负责将代码部署到平台上(容器、Kubernetes、公共云、虚拟机等)。Istio不限定使用哪些自动化部署工具。
在更高的层次上,你拥有应用程序业务逻辑:为了保持竞争力而必须编写的业务差异化代码,。这段代码包括业务逻辑,以及知道要调用哪些服务、以何种顺序调用服务、如何处理服务的响应(例如,如何将它们聚合在一起)、在出现故障时如何处理。Istio不实现或替换任何业务逻辑,它不执行服务编排,不负责业务所需资源的评估、调整或规则计算。这些功能最好留给应用程序内部的库和框架来实现。
Istio扮演着部署平台和应用程序代码之间的中间人的角色,它的作用是帮助从应用程序中获取复杂的网络代码。它可以基于请求元数据内容(HTTP头等)进行路由,也可以基于服务和请求元数据匹配进行细粒度的流量控制和路由。它还可以保护传输和卸载安全令牌验证,并执行由服务运维人员定义的配额和使用策略。
现在我们已经基本了解了Istio是什么,下一步我们将通过使用它来对其能力做进一步了解。在第2章中,我们将讨论如何使用Istio实现基本指标收集、可靠性和流量控制。
1.5.5 使用服务网格的缺点
我们已经讨论了很多关于构建分布式架构的问题和服务网格的作用,但是不想给你留下这样的印象:服务网格是解决这些问题的唯一方法,或者服务网格没有缺点。使用服务网格,确实有一些不可忽视的缺点。
首先,使用服务网格将另一个中间件(即代理)放在请求路径中。这个代理可以提供大量的价值;但是对于那些不熟悉代理的人来说,它最终会成为一个黑盒,使调试应用程序的行为变得更加困难。Envoy代理是专门为了可调试而构建的,它公开了很多网络运行信息,但是对于不熟悉Envoy的运维人员来说,它可能看起来非常复杂而妨碍了现有的调试。
使用服务网格的另一个缺点是在租户方面。网格和运行在网格中的服务一样有价值。也就是说,网格中的服务越多,网格的价值就越大。然而,如果在物理网格部署的租赁和隔离模型中没有采用适当的策略、实现自动化和做预先考虑,你可能最终会陷入这样一种境地:错误地配置网格而影响许多服务。
最后,服务网格成为服务和应用程序架构中非常重要的一部分,因为它位于请求路径上。服务网格可以提高系统的安全性、可观测性和路由控制能力。缺点是网格引入了额外的组件,从而增加了复杂性,使得人们很难理解如何配置和操作,以及如何将它集成到现有的组织和治理流程中。
一般来说,服务网格可以带来很多价值——但需要权衡。就像使用任何工具或平台一样,你应该根据你的环境和约束条件来评估,确定服务网格是否适合你的场景,如果适合,则制订采用计划。
总的来说,我们喜欢服务网格;现在Istio已经成熟,它已经在改善许多业务的运营。随着Istio和Envoy社区源源不断的贡献,我们很高兴看到它的下一步走向。希望本章已经向你传递了一些令人兴奋的信息,并让你了解了Istio是如何提高服务的安全性和可靠性的。