定义

是一种用于处理微服务架构中服务间通信的基础设施层,负责管理服务之间的网络流量。它解耦了应用逻辑与网络层的通信细节,并通过代理实现服务发现、负载均衡、故障恢复、安全(如 mTLS 加密通信)、监控和策略执行等功能。

在云原生架构中,服务网格由一组轻量级的代理(sidecar)组成,这些代理与每个微服务实例一起运行。服务网格通常包括两个主要部分:

  1. 数据平面(Data Plane):由部署在每个服务实例旁边的代理组成,它们拦截所有入站和出站的流量,负责实现服务之间的通信。

  2. 控制平面(Control Plane):负责配置和管理数据平面中的代理,提供服务发现、负载均衡、健康检查、安全等功能。

服务网格工作原理的例子

假设你有两个微服务:

  • ServiceA:一个订单服务。

  • ServiceB:一个支付服务。

在没有服务网格的情况下,ServiceA 直接调用 ServiceB,依赖 DNS 或服务发现机制来找到 ServiceB 的地址,可能需要自行处理重试、超时、日志、负载均衡、安全等逻辑。这种直接通信的耦合使得管理、监控和排查问题变得复杂。

引入服务网格之后,服务间的通信通过服务网格代理进行。以下是具体场景:

场景描述:

  1. ServiceA 想要调用 ServiceB 完成支付操作。

  2. ServiceA 和 ServiceB 分别运行在 Kubernetes 集群中,并且被服务网格代理(比如 Envoy)接管流量。

步骤:

  1. ServiceA 调用 ServiceB

    1. ServiceA 发出请求时,请求不会直接到达 ServiceB。

    2. ServiceA 的请求首先通过 ServiceA 旁边的服务网格代理 (sidecar),这个代理会对请求进行处理。

  2. 服务发现与****负载均衡

    1. ServiceA 的代理会通过服务网格的控制平面来查询 ServiceB 的服务信息,找到可用的 ServiceB 实例。

    2. 假设有多个 ServiceB 实例(副本),服务网格会根据策略进行负载均衡,比如轮询或基于流量的智能负载均衡。

  3. 安全与加密

    1. 服务网格会自动处理通信的安全性问题。比如它会通过 mTLS(双向 TLS****) 为 ServiceA 和 ServiceB 之间的通信建立安全连接,确保数据加密和身份验证,不需要开发人员手动配置加密。
  4. 请求发送****到 ServiceB

    1. 代理处理完这些逻辑后,安全地将请求转发给 ServiceB 的代理。

    2. ServiceB 的代理接收到流量并将其传递给 ServiceB。

  5. 监控与追踪

    1. 在通信过程中,服务网格的代理会自动收集指标(如延迟、请求成功率等)并上报给监控系统。这些代理还会注入分布式追踪信息,帮助运维人员更好地理解请求是如何在多个服务之间流动的。
  6. 失败处理与重试

    1. 如果调用失败,比如 ServiceB 某个实例不可用,服务网格代理可以根据定义好的策略自动进行重试或切换到其他 ServiceB 实例。

服务网格提供的功能

  1. 自动****负载均衡:服务网格可以根据配置的负载均衡策略,将流量合理分配到多个服务实例上。

  2. 故障恢复:服务网格支持自动重试和熔断机制。如果某个服务无法响应,服务网格会自动切换到其他健康的服务。

  3. 流量管理:服务网格支持流量控制和智能路由,可以通过策略控制流量的分发,比如蓝绿部署、金丝雀发布等。

  4. 安全性:通过 mTLS 自动实现双向认证和加密,无需开发人员在代码中手动处理证书和加密逻辑。

  5. 可观测性:服务网格会自动收集大量的运行时指标和日志信息,提供分布式追踪功能,帮助开发者和运维人员分析和诊断系统性能。

  6. 策略执行:服务网格允许定义策略,比如访问控制、限流和配额,来管理服务之间的交互。

Istio

Istio是一个服务网络的开源实现。

https://istio.io/

功能

流量管理

利用配置,我们可以控制服务间的流量。设置断路器、超时或重试都可以通过简单的配置改变来完成。

可观测性

Istio 通过跟踪、监控和记录让我们更好地了解你的服务,它让我们能够快速发现和修复问题。

安全性

Istio 可以在代理层面上管理认证、授权和通信的加密。我们可以通过快速的配置变更在各个服务中执行政策。

构成

Istio服务网格有两部分构成:数据平面控制平面

Envoy(数据平面)

Envoy 是一个用 C++ 开发的高性能代理。Istio 服务网格将 Envoy 代理作为一个 sidecar 容器注入到你的应用容器旁边。然后该代理拦截该服务的所有入站和出站流量。注入的代理一起构成了服务网格的数据平面。

Envoy 代理也是唯一与流量进行交互的组件。除了前面提到的功能 —— 负载均衡、断路器、故障注入、重试等。Envoy 还支持基于 WebAssembly(WASM)的可插拔扩展模型。这种可扩展性使我们能够执行自定义策略,并为网格中的流量生成遥测数据。

Istiod(控制平面)

Istiod 是控制平面组件,提供服务发现、配置和证书管理功能。Istiod 采用 YAML 编写的高级规则,并将其转换为 Envoy 的可操作配置。然后,它把这个配置传播给网格中的所有 sidecar。

Istiod 内部的 Pilot 组件抽象出特定平台的服务发现机制(Kubernetes、Consul 或 VM),并将其转换为 sidecar 可以使用的标准格式。

使用内置的身份和凭证管理,我们可以实现强大的服务间和终端用户认证。通过授权功能,我们可以控制谁可以访问你的服务。

控制平面的部分以前被称为 Citadel,作为一个证书授权机构,生成证书,允许数据平面中的代理之间进行安全的 mTLS 通信。