基本概念

服务网格

服务网格是一个独立且可配置的基础设施层,添加到应用程序中。它用于管理和控制微服务应用之间的通信,提供服务流量管理、服务监控、服务访问安全控制和服务发布的能力。

在传统的微服务架构中,服务之间的通信通常由应用代码直接处理,这增加了复杂性和耦合性。服务网格插入一个轻量级的代理(Envoy,作为侧车容器部署在每个服务容器组中)来管理和控制服务间的通信。这些代理与应用代码分开,处理请求路由、负载均衡、故障恢复、流量控制和安全认证等任务,使开发人员能够专注于业务逻辑,而不必担心底层的通信机制和功能。

通过引入服务网格,开发人员可以更好地管理和控制微服务应用之间的通信,并在不修改应用代码的情况下添加新功能。服务网格支持虚拟机和容器等多种基础设施,并可以与容器编排平台(例如 Kubernetes)集成,以提供更好的容器化微服务架构体验,适应云原生时代。

Istio

Istio 是一个开源的服务网格,它透明地集成到现有的分布式应用中,提供流量管理、策略执行、遥测收集和安全保障。Istio为微服务架构提供全面的服务治理能力,支持多种语言,并主要使用Kubernetes作为服务注册表。

Istio提供强大的功能,以统一和高效的方式保护、连接和监控服务。使用Istio,可以实现负载均衡、服务间身份验证和监控,几乎无需或不需要对服务代码进行更改。它提供了以下关键特性:

  • 在集群内安全地进行服务间通信,包括TLS加密、基于身份的认证和授权。
  • 自动负载均衡HTTP、gRPC、WebSocket和TCP流量。
  • 通过丰富的路由规则、重试、故障转移和故障注入,对流量行为进行细粒度控制。
  • 可插拔的策略层和配置API,用于访问控制、速率限制和配额管理。
  • 自动收集来自集群中所有流量的指标、日志和追踪信息,包括入口和出口流量。
  • 可扩展以满足各种部署需求。控制平面运行在Kubernetes上,您可以将部署在集群中的应用程序添加到服务网格,扩展网格到其他集群,甚至连接到虚拟机或Kubernetes外部的其他端点。

Istio的架构如下所示。

控制平面

Istio控制平面负责管理和配置代理。它与数据平面的代理(Envoy)通信,发送配置和指令以控制服务流量、管理安全性并收集和处理遥测数据。它允许管理员和开发人员以集中化的方式管理整个服务网格,并灵活配置。

数据平面

Istio数据平面由一组智能代理(Envoy)组成,这些代理作为侧车容器在服务容器组中部署并运行。这些代理负责拦截、处理和转发所有服务之间的流量。

数据平面执行流量管理、故障恢复、安全策略执行和其他功能,以确保服务间通信的可靠性和安全性。它还提供丰富的监控和追踪能力,帮助开发人员理解和调试服务通信行为。

Envoy

Envoy 被用作Istio数据平面的代理,并且是唯一一个与数据平面流量交互的Istio组件。

Envoy作为侧车容器在服务容器组中部署并运行,处理和转发服务网格中所有入站和出站流量,提供网络功能和管理特性,如流量控制、负载均衡、故障恢复和安全。

侧车

侧车模式在微服务和容器化应用中被广泛使用,通过在主应用容器旁边添加辅助容器或代理来增强应用功能和性能。

构成Istio数据平面的Envoy在服务容器组中作为侧车容器部署。

服务网关

服务网关包括出口网关和入口网关,运行在服务网格的边缘,管理进入和离开网格的流量。它们允许您指定允许进出网格的流量。

OpenTelemetry

OpenTelemetry是一个开源监控框架,旨在生成、处理和传输遥测数据,包括指标、日志和追踪。由云原生计算基金会(CNCF)开发,提供了一套标准协议和工具,将数据发送到任何监控后端。OpenTelemetry的核心组件包括:

  • 收集器:接收、处理和导出遥测数据。
  • 语言SDK:允许使用特定语言的OpenTelemetry API生成遥测数据。
  • 仪表库:自动或手动对应用进行仪表化,以收集遥测数据。

OpenTelemetry支持多种语言和第三方注册表,为JVM和中间件提供监控数据。它定义了行业标准的数据规范,促进与各种开源监控工具的更好集成。

Istio与OpenTelemetry的技术比较

特性/能力IstioOpenTelemetry
协议支持支持gRPC、HTTP、TCP协议。支持HTTP、TCP以及各种RPC协议,如Dubbo、Redis等。
服务治理提供负载均衡、断路器、连接池、超时重试等功能。无治理能力。
服务路由提供丰富的路由规则和策略,如权重路由、请求头路由、流量镜像、故障注入等。无路由能力。
拓扑和调用链显示网格内所有节点,包括服务、入口网关、服务条目、出口网关,排除中间件节点。
调用链包括具有注入侧车的服务的HTTP调用跨度,包含URL、状态码等数据。
显示包括服务和中间件的节点,排除入口和出口网关。
调用链包括HTTP链路数据、内部方法调用链数据和服务到中间件链路数据。跨度数据也可以通过SDK主动报告。
监控数据提供服务的完整入口和出口流量指标。提供服务的完整入口和出口流量指标,以及JVM指标。
注册表兼容性支持Kubernetes作为服务注册表。支持第三方注册表和Kubernetes注册表。
追踪ID传播需要代码更改来实现追踪ID传播。实现自动的追踪ID传播。
资源需求可能需要更多的计算资源,因为每个服务实例都需要一个Envoy代理。需要更少的额外资源,无需在每个服务实例旁边都有代理。

选择建议

  • 服务治理:如果需要服务治理,Istio是更好的选择。
  • 可观测性:如果需要强大的可观测性支持,尤其是针对JVM监控,OpenTelemetry更为适合。
  • 资源受限环境:在资源有限的环境中,OpenTelemetry可能是更轻量的选择,因为它不需要在每个服务实例旁边都有代理。
  • 多语言和注册表支持:对于需要多语言支持和使用第三方注册表的场景,OpenTelemetry提供了更大的灵活性。
  • 非侵入式追踪ID传播:如果您使用Java应用,并希望实现非侵入式的追踪ID传播以进行全栈追踪,使用OpenTelemetry for Java Agent是一个优秀的选择。

每种技术都有其独特的优势和适用场景。选择应基于具体的业务需求、技术栈及未来可扩展性和集成的考虑。在某些情况下,可以同时使用这两者,以实现全面的服务治理和可观测性解决方案。