vlambda博客
学习文章列表

用 Istio 解释微服务和服务网格


应用程序构建分解为多个较小的服务组件时,称为微服务。与传统的单体方式相比,微服务架构将每个微服务视为一个独立的实体/模块,本质上有助于简化其代码和相关基础设施的维护。应用程序的每个微服务都可以编写在不同的技术堆栈中,并进一步独立部署、优化和管理。

01/ 微服务架构的好处


尽管在理论上,微服务架构特别有利于构建复杂的大型应用程序,但是,它也广泛用于小型应用程序构建(例如,简单的购物车)—— 着眼于进一步扩展。

应用程序采用微服务架构有很多好处,诸如:

  • 应用程序中的各个微服务可以通过不同的技术堆栈进行开发和部署。
  • 每个微服务都可以独立优化、部署或扩展。
  • 更好的故障处理和错误检测。

02/ 微服务架构的组件


在微服务架构上运行的现代云原生应用程序依赖于以下关键组件:
  • 容器化(通过Docker等平台)——通过将服务分解为多个进程来有效管理和部署服务。

  • 编排(通过Kubernetes等平台)——用于配置、分配和管理服务的可用系统资源。

  • 服务网格(通过Istio等平台)——通过服务代理网格进行服务间通信,以连接、管理和保护微服务。


上述三个是微服务架构中最重要的组件,它们允许云原生堆栈中的应用程序在负载下扩展,即使在云环境部分故障期间也能执行。


03/ 微服务架构的复杂性


一个大型应用程序分解为多个微服务时,每个微服务使用不同的技术堆栈(语言、数据库等),需要多个环境形成一个复杂的架构来管理。

尽管 Docker 容器化通过将每个微服务分解为在单独的 Docker 容器中运行的多个进程来帮助管理和部署单个微服务,但服务间通信仍然非常复杂,因为您必须处理整体系统健康状况、容错性和多点故障。


让我们通过购物车在微服务架构上的工作方式来理解这一点。这里的微服务将涉及库存数据库、支付网关服务、基于客户访问历史的产品建议算法等。虽然所有这些服务在理论上仍然是一个独立的小模块,但它们确实需要相互交互。重要的是要注意服务到服务的通信是使微服务成为可能的原因


04/ 为什么我们需要服务网格?


既然您知道了微服务架构中服务到服务通信的重要性,那么很明显, 通信通道仍然保持无故障、安全、高可用性和健壮性。这就是服务网格作为基础设施组件出现的地方, 它通过实现多个服务代理来确保受控的服务到服务通信服务网格负责微调不同服务之间的通信,而不是添加新功能

在 Service Mesh 中,与实现服务间通信的单个服务一起部署的代理被广泛称 为Sidecar 模式Sidecar(代理)可能被设计为处理对服务间通信至关重要的任何功能,如负载平衡、断路、服务发现等


用 Istio 解释微服务和服务网格


通过服务网格,您可以:
  • 维护、配置和保护应用程序的所有或选定微服务之间的所有服务到服务通信

  • 在微服务中配置和执行网络功能,例如网络弹性、负载平衡、断路、服务发现等。

  • 网络功能作为独立于业务逻辑的实体进行维护和实现,满足了将服务到服务通信与应用程序代码分离的专用层的需求。

  • 因此,开发人员可以专注于应用程序的业务逻辑,而与网络通信相关的所有或大部分工作都由服务网格处理。

  • 由于微服务到 Service Mesh 代理通信始终在标准协议之上,例如 HTTP1.x/2.x、gRPC 等,因此开发人员可以使用任何技术来开发单个服务。


05/ 服务网格架构的组件


用 Istio 解释微服务和服务网格


  • 业务逻辑
    这包含核心应用程序逻辑和微服务的底层代码。业务逻辑还保留应用程序的计算以及服务到服务的集成逻辑。由于微服务架构的优点,业务逻辑可以在任何平台上编写,并且完全独立于不同的服务。

  • 原始网络功能
    这包括微服务用来发起网络调用和连接服务网格 Sidecar 代理的基本网络功能。虽然微服务之间的主要网络功能是通过 Service Mesh 处理的,但给定的服务必须包含基本的网络功能才能与 Sidecar 代理连接。

  • 应用网络功能
    与原始网络功能不同,该组件通过服务代理维护和管理关键网络功能,包括断路、负载平衡、服务发现等。

  • 服务网格控制平面
    所有服务网格代理都由控制平面集中管理和控制。

    通过控制平面,您可以指定身份验证策略、指标生成和跨网格配置服务代理。


06/ 使用 Istio 实现服务网格


用 Istio 解释微服务和服务网格


虽然还有其他几个是最受欢迎的,但我们将探讨如何使用 Istio 为云原生应用程序实现 Service Mesh 架构。

如上文所述,在微服务架构中, Istio 通过形成一个基础设施层来连接、保护和控制分布式服务之间的通信Istio 会在每个服务旁边部署一个Istio 代理(称为 Istio sidecar),而对服务本身的代码更改很少或没有更改。所有服务间流量都定向到 Istio 代理,该代理使用策略来控制服务间通信,同时实施部署、故障注入和断路器的基本策略。


Istio 的核心能力

    • 通过身份验证和授权保护服务到服务的通信。
    • 实施支持访问控制、配额和资源分配的策略层。
    • HTTP、gRPC、WebSocket 和 TCP 流量的自动负载平衡。
    • 集群内所有流量的自动指标、日志和跟踪,包括集群入口和出口。
    • 通过故障转移、故障注入和路由规则配置和控制服务间通信。
    • 实施支持访问控制、配额和资源分配的策略层。

Istio独立于平台,可以在各种环境中运行,包括 Cloud、On-Premise、Kubernetes 等。Istio 目前支持:
    • Kubernetes 上的服务部署
    • 在 Consul 注册的服务
    • 在单个虚拟机上运行的服务


Istio 的核心组件


Istio 核心组件(图片来源 - istio.io)


一个 Istio 服务网格由一个数据平面和一个控制平面组成。

数据平面由 sidecar 服务代理(通过Envoy )组成,而微服务之间的sidecar 通信是通过策略和遥测集线器(通过Mixer)实现的。

控制平面通过Pilot、Citadel和Galley管理和配置所有 Sidecar 代理之间的通信。Pilot强制执行 Envoy 代理的路由规则和服务发现,而Citadel充当身份验证和授权通道。另一方面,Galley充当 Service Mesh 的配置验证、摄取、处理和分发组件。

控制平面最终会管理和维护数据平面的组件,因此成为 Istio 服务网格中最重要的层。

参考文章:
[1] appfleet. Explaining Microservices and Service Mesh with Istio.2020