基础概念

目录

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 协议。
服务治理提供负载均衡、熔断、连接池、超时重试等功能。无治理能力。
服务路由提供丰富的路由规则和策略,如权重路由、请求头路由、流量镜像、故障注入等。无路由能力。
拓扑与调用链显示网格内所有节点,包括服务、入口网关、服务条目、出口网关,不包括中间件节点。
调用链包含注入 sidecar 的服务的 HTTP 调用跨度,包含 URL、状态码等数据。
显示包括服务和中间件的节点,不包括入口和出口网关。
调用链包含 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 是极佳的选择。

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