基础概念

目录

Service Mesh

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

在传统微服务架构中,服务间通信通常由应用代码直接处理,增加了复杂性和耦合度。Service Mesh 通过插入轻量级代理(Envoy,作为 sidecar 容器部署在每个服务 Pod 中)来管理和控制服务间通信。这些代理独立于应用代码,负责请求路由、负载均衡、故障恢复、流量控制和安全认证等任务,使开发者能够专注于业务逻辑,而无需关心底层通信机制和功能。

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

Istio

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

Istio 提供强大的功能,以统一高效的方式保护、连接和监控服务。使用 Istio,您可以实现负载均衡、服务间认证和监控,且对服务代码的改动极少或无需改动。其主要特性包括:

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

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

OpenTelemetry 是一个开源的可观测性框架,旨在生成、处理和传输遥测数据,包括指标、日志和追踪。由 Cloud Native Computing Foundation (CNCF) 维护,提供一套标准协议和工具,可将数据发送到任意可观测性后端。OpenTelemetry 的核心组件包括:

  • Collector:接收、处理和导出遥测数据。
  • 语言 SDK:允许使用特定语言的 OpenTelemetry API 生成遥测数据。
  • 仪表库:自动或手动为应用添加监控代码以收集遥测数据。

OpenTelemetry 支持多种语言和第三方注册中心,为 JVM 和中间件提供可观测性数据。它定义了行业标准的数据规范,便于与各种开源可观测性工具更好地集成。

Istio 与 OpenTelemetry 的技术对比

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

选型建议

  • 服务治理:如果需要服务治理能力,Istio 是更好的选择。
  • 可观测性:如果需要强大的可观测性支持,尤其是 JVM 监控,OpenTelemetry 更适合。
  • 资源受限环境:在资源有限的环境中,OpenTelemetry 更轻量,因为它不需要每个服务实例旁边部署代理。
  • 多语言和注册中心支持:需要多语言支持和使用第三方注册中心的场景,OpenTelemetry 更灵活。
  • 非侵入式 Trace ID 传播:如果使用 Java 应用,且希望实现非侵入式的 Trace ID 传播以实现全链路追踪,使用 OpenTelemetry Java Agent 是极佳选择。

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