服务网格
定义
是一种用于处理微服务架构中服务间通信的基础设施层,负责管理服务之间的网络流量。它解耦了应用逻辑与网络层的通信细节,并通过代理实现服务发现、负载均衡、故障恢复、安全(如 mTLS 加密通信)、监控和策略执行等功能。
在云原生架构中,服务网格由一组轻量级的代理(sidecar)组成,这些代理与每个微服务实例一起运行。服务网格通常包括两个主要部分:
数据平面(Data Plane):由部署在每个服务实例旁边的代理组成,它们拦截所有入站和出站的流量,负责实现服务之间的通信。
控制平面(Control Plane):负责配置和管理数据平面中的代理,提供服务发现、负载均衡、健康检查、安全等功能。
服务网格工作原理的例子
假设你有两个微服务:
ServiceA:一个订单服务。
ServiceB:一个支付服务。
在没有服务网格的情况下,ServiceA 直接调用 ServiceB,依赖 DNS 或服务发现机制来找到 ServiceB 的地址,可能需要自行处理重试、超时、日志、负载均衡、安全等逻辑。这种直接通信的耦合使得管理、监控和排查问题变得复杂。
引入服务网格之后,服务间的通信通过服务网格代理进行。以下是具体场景:
场景描述:
ServiceA 想要调用 ServiceB 完成支付操作。
ServiceA 和 ServiceB 分别运行在 Kubernetes 集群中,并且被服务网格代理(比如 Envoy)接管流量。
步骤:
ServiceA 调用 ServiceB:
ServiceA 发出请求时,请求不会直接到达 ServiceB。
ServiceA 的请求首先通过 ServiceA 旁边的服务网格代理 (sidecar),这个代理会对请求进行处理。
服务发现与****负载均衡:
ServiceA 的代理会通过服务网格的控制平面来查询 ServiceB 的服务信息,找到可用的 ServiceB 实例。
假设有多个 ServiceB 实例(副本),服务网格会根据策略进行负载均衡,比如轮询或基于流量的智能负载均衡。
安全与加密:
- 服务网格会自动处理通信的安全性问题。比如它会通过 mTLS(双向 TLS****) 为 ServiceA 和 ServiceB 之间的通信建立安全连接,确保数据加密和身份验证,不需要开发人员手动配置加密。
请求发送****到 ServiceB:
代理处理完这些逻辑后,安全地将请求转发给 ServiceB 的代理。
ServiceB 的代理接收到流量并将其传递给 ServiceB。
监控与追踪:
- 在通信过程中,服务网格的代理会自动收集指标(如延迟、请求成功率等)并上报给监控系统。这些代理还会注入分布式追踪信息,帮助运维人员更好地理解请求是如何在多个服务之间流动的。
失败处理与重试:
- 如果调用失败,比如 ServiceB 某个实例不可用,服务网格代理可以根据定义好的策略自动进行重试或切换到其他 ServiceB 实例。
服务网格提供的功能
自动****负载均衡:服务网格可以根据配置的负载均衡策略,将流量合理分配到多个服务实例上。
故障恢复:服务网格支持自动重试和熔断机制。如果某个服务无法响应,服务网格会自动切换到其他健康的服务。
流量管理:服务网格支持流量控制和智能路由,可以通过策略控制流量的分发,比如蓝绿部署、金丝雀发布等。
安全性:通过 mTLS 自动实现双向认证和加密,无需开发人员在代码中手动处理证书和加密逻辑。
可观测性:服务网格会自动收集大量的运行时指标和日志信息,提供分布式追踪功能,帮助开发者和运维人员分析和诊断系统性能。
策略执行:服务网格允许定义策略,比如访问控制、限流和配额,来管理服务之间的交互。
Istio
Istio是一个服务网络的开源实现。
功能
流量管理
利用配置,我们可以控制服务间的流量。设置断路器、超时或重试都可以通过简单的配置改变来完成。
可观测性
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 通信。