Istio服务网格技术解析与实践
上QQ阅读APP看书,第一时间看更新

1.5 Istio服务网格

Istio是一个用于连接/管理以及安全化微服务的开放平台,提供了一种简单的方式用于创建微服务网格,并提供负载均衡、服务间认证以及监控等能力,关键的一点是并不需要修改太多服务就可以实现上述功能。Istio本身是一个开源项目,它提供了一致的方式用于连接、加固、管理和监控微服务,最初是由Google、IBM和Lyft创建的服务网络的开源实现。Istio可以帮助你以透明的方式为服务架构添加弹性和可观察性能力。使用Istio,应用程序不必知道它们是服务网格的一部分。每当应用程序与外界交互时,Istio将代表应用程序处理网络流量。这意味着如果你正在做微服务,Istio可以带来很多好处。

Istio主要提供以下功能:

流量管理,控制服务之间调用的流量和API调用,使得调用更可靠,并使网络在恶劣情况下更加健壮。

可观测性,获取服务之间的依赖,以及服务调用的流量走向,从而提供快速识别问题的能力。

策略执行,控制服务的访问策略,不需要改动服务本身。

服务身份和安全,为网格中的服务提供可验证身份,并提供保护服务流量的能力,使其可以在不同可信度的网络上流转。

Istio第一个生产可用版本1.0于2018年7月31日正式发布,并于2019年3月发布版本1.1。之后,社区按照快速迭代的方式,在三个月内接连发布了10个小版本。截至本书完稿之际,社区已经发布了1.4版本。

Istio的数据平面默认使用Envoy代理,开箱即用,可帮助你配置应用程序以在其旁边部署服务代理的实例。Istio的控制平面由一些组件组成,这些组件为最终用户和运维人员提供运维API、代理的配置API、安全设置、策略声明以及其他更多功能。我们将在本书的后续部分介绍这些控制平面组件。

Istio最初是为在Kubernetes上运行而构建的,但却是从部署平台中立的角度实现代码的。这意味着你可以在Kubernetes、OpenShift、Mesos和Cloud Foundry等部署平台上利用基于Istio的服务网格,甚至可以在虚拟机、物理裸机上部署Istio环境。在后面的章节中,我们将展示Istio对于包括私有数据中心在内的云组合的混合部署来说有多强大。在本书中,我们将优先考虑在Kubernetes上进行部署,在后面更高级的章节中会引入虚拟机等环节。

Istio在希腊语中的意思是“启航”,而Kubernetes在希腊语中可以翻译为“舵手”或“驾驶员”。所以从一开始Istio就期望与Kubernetes很好地配合,高效地运行分布式微服务架构,并提供安全、连接和监控微服务的统一方法。

通过每个应用程序实例旁边的服务代理,应用程序不再需要具有特定于语言的弹性库来实现熔断、超时、重试、服务发现、负载均衡等功能。此外,服务代理还处理度量标准收集、分布式跟踪和日志收集等。

由于服务网格中的流量流经Istio服务代理,因此Istio在每个应用程序中都有控制点来影响和指导其网络行为。这允许服务运维人员可以控制路由流量,并通过金丝雀部署、暗启动(Dark Launch)、分级滚动和A/B测试来实现细粒度部署。我们将在后面的章节中探讨这些功能。

1.5.1 核心功能

Istio在服务网络中统一提供了许多关键功能,主要包括流量管理、安全、可观测性、平台支持、集成和定制五个部分。

1.流量管理

通过简单的规则配置和流量路由,Istio可以控制服务之间的流量和API调用。Istio简化了熔断器、超时和重试等服务级别属性的配置,并且可以轻松设置A/B测试、金丝雀部署和基于百分比的流量分割的分阶段部署等重要任务。

Istio有开箱即用的故障恢复功能,你可以在问题出现之前先发现问题,通过优化使服务之间的调用更加可靠。

2.安全

Istio具备强大的安全功能,使开发人员可以专注于应用程序级别的安全性。Istio提供底层安全通信信道,并大规模管理服务通信的认证、授权和加密。使用Istio,服务通信在默认情况下是安全的,允许跨多种协议和运行时一致地实施策略,而关键的是所有这些都很少或根本不需要应用程序更改。

虽然Istio与平台无关,但将其与Kubernetes网络策略一起使用时,其优势更大,包括在网络和应用层保护pod-to-pod或服务到服务通信的能力。后续章节中会讲述如何在Kubernetes中结合网络策略与Istio来共同保护服务。

3.可观测性

Istio具备强大的追踪、监控和日志记录能力,可让你深入了解服务网格部署。通过Istio的监控功能,可以真正了解服务性能如何影响上游和下游的功能,而其自定义的仪表板可以提供对所有服务性能的可视性,并让你了解该性能如何影响其他进程。

Istio的Mixer组件负责策略控制和遥测收集,提供后端抽象和中介,将Istio的其余部分与各个后端基础设施的实现细节隔离开来,并为运维人员提供对网格和后端基础设施之间所有交互的细粒度控制。

所有这些功能可以让你更有效地设置、监控和实施服务上的服务等级目标SLO。当然,最重要的是可以快速有效地检测和修复问题。

4.平台支持

Istio是独立于平台的,目标是可以在各种环境中运行,包括跨云、内部部署、Kubernetes、Mesos等。你可以在Kubernetes上部署Istio或在具有Consul的Nomad上部署。Istio目前支持:

在Kubernetes上部署的服务。

使用Consul注册的服务。

在各个虚拟机上运行的服务。

5.集成和定制

可以扩展和自定义Istio的策略实施组件,以与现有的ACL、日志记录、监控、配额、审计等解决方案集成。

此外,从版本1.0开始,Istio支持基于MCP(Mesh Conf iguration Protocol,网格配置协议)进行配置分发。通过使用MCP,可以很容易地集成外部系统,例如可以自己实现MCP服务器,然后将其集成到Istio中。MCP服务器可以提供以下两个主要功能:

连接并监控外部服务注册系统,以获取最新的服务信息(例如Eureka、ZooKeeper等系统)。

将外部服务信息转换为Istio ServiceEntry并通过MCP资源发布。

1.5.2 为什么要使用Istio

在从单体应用程序向分布式微服务架构的转型过程中,开发人员和运维人员面临诸多挑战,使用Istio可以解决这些问题。随着规模和复杂性的增长,服务网格越来越难以理解和管理,各种需求包括服务发现、负载均衡、故障恢复、指标收集和监控以及更加复杂的运维,例如A/B测试、金丝雀发布、限流、访问控制和端到端认证等。Istio提供了一个完整的解决方案,通过为整个服务网格提供行为洞察和操作控制来满足微服务应用程序的多样化需求。

Istio提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,只需要对服务的代码进行一点改动或不需要做任何改动。想要让服务支持Istio,只需要在你的环境中部署一个特殊的Sidecar代理,使用Istio控制平面来配置和管理代理,拦截微服务之间的所有网络通信。

此外,面向服务的架构(SOA)的企业服务总线(ESB)与服务网格有一些相似之处,在SOA体系架构中ESB对于应用程序服务来说是透明的,这意味着应用程序对它无感知。服务网格可以得到类似的行为,服务网格应该对应用程序透明,就像ESB那样,简化服务间的调用。当然,ESB还包括交互协议的中转、消息转换,或者基于内容的路由之类的事情,而服务网格不负责ESB所做的所有功能。服务网格确实通过重试、超时、熔断提供服务请求的弹性能力,同时也提供服务发现和负载均衡等服务。复杂的业务转换、业务流程编排、业务流程异常,以及服务编排能力等并不属于服务网格的解决范畴。相对于ESB的集中式系统,服务网格中的数据平面高度分布,其代理与应用程序并存,这消除了ESB架构中经常出现的单点故障瓶颈问题。

当然,也需要清楚服务网格没有解决哪些问题,像Istio这样的服务网格技术通常都提供了强大的基础架构功能,可以触及分布式架构的许多领域,但肯定不能解决你可能遇到的每个问题。理想的云架构能从实现的每个层中分离出不同的关注点。

在基础架构的低层,更加关注基础设施,如何提供自动化部署的基础架构能力。这有助于将代码部署到各种平台上,无论是容器、Kubernetes,还是虚拟机等。Istio不会限定你应该使用哪种自动化部署工具。

在更高的业务应用级别,应用程序业务逻辑是企业保持核心竞争力的差异化资产。这些代码资产涉及了包括业务功能单一以及需要调用的服务,以何种顺序执行,如何执行这些服务的交互,如何将它们聚合在一起,以及在发生故障时要执行的操作等。Istio不实现或替换任何业务逻辑,它本身不执行服务编排,也不会提供业务负载的内容转换或者增强,不会针对负载进行拆分或者聚合。这些功能最好留给应用程序中的库和框架来实现。

图1-6是关于云原生应用程序中的关注点分离,其中Istio对应用程序层起支持作用并位于较低级别的部署层之上。

图1-6 云原生应用中的关注点分离

Istio扮演着部署平台和应用程序代码之间的连接角色。它的作用是促进从应用程序中取出复杂的网络逻辑,可以基于作为请求的一部分的外部元数据(例如HTTP标头等)来执行基于内容的路由。也可以根据服务和请求的元数据匹配进行细粒度的流量控制和路由。还可以保护传输和卸载安全令牌验证,或者可以实施服务运维人员定义的配额和使用策略等。

了解Istio的能力,与其他系统的相似之处以及它在架构中的位置,可帮助我们像我们过去可能遇到的有前途的技术那样犯同样的错误至关重要。

1.5.3 成熟度和支持级别

Istio社区针对每个组件功能的相对成熟度和支持级别,提出了不同的功能阶段定义,分别用Alpha、Beta和Stable来描述各自的状态,如表1-1所示。

表1-1 Istio社区针对每个组件功能的相对成熟度和支持级别

表1-2是我们摘录的Istio 1.4版本现有功能中已经达到Beta及Stable功能阶段的列表。此信息将在每次发布后更新,可参照官方网站获取更新状态。

表1-2 Istio 1.4版本中已经达到Beta及Stable功能阶段的列表

当然,Istio仍然有一些功能还处于Alpha状态,如Istio CNI插件,它能够代替istio-init容器完成同样的网络功能,而且无需Istio用户额外申请Kubernetes RBAC授权;以及在Envoy中使用自定义过滤器的能力等等。相信在后续不断完善中,这些功能将逐渐变得越来越稳定且生产可用。