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