Service Mesh 是添加到应用程序中的一个独立且可配置的基础设施层,用于管理和控制微服务应用之间的通信,提供服务流量管理、服务监控、服务访问安全控制和服务发布等能力。
在传统微服务架构中,服务间的通信通常由应用代码直接处理,增加了复杂性和耦合度。Service Mesh 通过插入轻量级代理(Envoy,作为 sidecar 容器部署在每个服务 pod 中)来管理和控制服务间通信。这些代理独立于应用代码,负责请求路由、负载均衡、故障恢复、流量控制和安全认证等任务,使开发者能够专注于业务逻辑,而无需关心底层的通信机制和功能。
通过引入 Service Mesh,开发者可以更好地管理和控制微服务应用间的通信,并在不修改应用代码的情况下添加新功能。Service Mesh 支持虚拟机和容器等多种基础设施,并可与容器编排平台(如 Kubernetes)集成,为云原生时代提供更优的容器化微服务架构体验。
Istio 是一个开源的 Service Mesh,能够透明地集成到现有分布式应用中,提供流量管理、策略执行、遥测收集和安全保障。Istio 为微服务架构提供全面的服务治理能力,支持多种语言,主要以 Kubernetes 作为服务注册中心。
Istio 提供强大的功能,以统一高效的方式保护、连接和监控服务。使用 Istio,您可以实现负载均衡、服务间认证和监控,且几乎无需或无需修改服务代码。其主要特性包括:
Istio 的架构如下所示。
控制平面
Istio 控制平面负责管理和配置代理。它与数据平面代理(Envoy)通信,发送配置和指令以控制服务流量、管理安全以及收集和处理遥测数据。它允许管理员和开发者以集中化方式灵活配置和管理整个 Service Mesh。
数据平面
Istio 数据平面由一组智能代理(Envoy)组成,作为 sidecar 容器部署并运行在服务 pod 中。这些代理负责拦截、处理和转发服务间的所有流量。
数据平面执行流量管理、故障恢复、安全策略执行等功能,确保服务间通信的可靠性和安全性。同时提供丰富的监控和追踪能力,帮助开发者理解和调试服务通信行为。
Envoy
Envoy 是 Istio 数据平面的代理,也是唯一与数据平面流量交互的 Istio 组件。
Envoy 作为 sidecar 部署在服务 pod 中,处理并转发服务网格内服务的所有入站和出站流量,提供流量控制、负载均衡、故障恢复和安全等网络功能和管理特性。
Sidecar
Sidecar 模式广泛应用于微服务和容器化应用中,通过在主应用容器旁边添加辅助容器或代理,增强应用功能和性能。
Envoy 作为 Istio 数据平面,采用 sidecar 容器方式部署在服务 pod 中。
Service Gateway
Service Gateway 包括 Egress Gateway 和 Ingress Gateway,运行在 Service Mesh 边缘,管理进入和离开网格的流量。它们允许您指定允许离开或进入网格的流量。
OpenTelemetry 是一个开源的可观测性框架,旨在生成、处理和传输遥测数据,包括指标、日志和追踪。由 Cloud Native Computing Foundation (CNCF) 维护,提供一套标准协议和工具,将数据发送到任何可观测性后端。OpenTelemetry 的核心组件包括:
OpenTelemetry 支持多种语言和第三方注册中心,提供 JVM 和中间件的可观测性数据。它定义了行业标准的数据规范,便于与各种开源可观测性工具更好地集成。
功能/能力 | Istio | OpenTelemetry |
---|---|---|
协议支持 | 支持 gRPC、HTTP、TCP 协议。 | 支持 HTTP、TCP 及 Dubbo、Redis 等多种 RPC 协议。 |
服务治理 | 提供负载均衡、熔断、连接池、超时重试等功能。 | 无治理能力。 |
服务路由 | 提供丰富的路由规则和策略,如权重路由、请求头路由、流量镜像、故障注入等。 | 无路由能力。 |
拓扑与调用链 | 显示网格内所有节点,包括服务、入口网关、服务条目、出口网关,不包括中间件节点。 调用链包含注入 sidecar 的服务的 HTTP 调用跨度,包含 URL、状态码等数据。 | 显示包括服务和中间件的节点,不包括入口和出口网关。 调用链包含 HTTP 链路数据、内部方法调用链数据和服务到中间件的链路数据。跨度数据也可通过 SDK 主动上报。 |
监控数据 | 提供服务的完整入口和出口流量指标。 | 提供服务的完整入口和出口流量指标,以及 JVM 指标。 |
注册中心兼容性 | 支持 Kubernetes 作为服务注册中心。 | 支持第三方注册中心和 Kubernetes 注册中心。 |
Trace ID 传播 | 需要修改代码以实现 Trace ID 传播。 | 实现自动 Trace ID 传播。 |
资源需求 | 由于每个服务实例需要一个 Envoy 代理,可能需要更多计算资源。 | 需要较少额外资源,无需每个服务实例旁边部署代理。 |
每种技术都有其独特优势和适用场景,选择应基于具体业务需求、技术栈以及未来的扩展和集成考虑。在某些情况下,两者可以结合使用,实现全面的服务治理和可观测性解决方案。