服务网格概述——从微服务治理痛点到Sidecar模式

摘要

服务网格(Service Mesh)是云原生微服务时代诞生的基础设施层,它将原本分散在各个微服务代码中的流量治理、安全、可观测性逻辑,统一下沉到基础设施层,以对应用完全透明的方式提供。本文从微服务架构的演进历史出发,剖析分散式治理框架(Spring Cloud、gRPC 拦截器)在多语言、多团队场景下的根本性困境,揭示 Sidecar 模式如何从架构上解决这一困境,并系统梳理服务网格的四大核心能力——流量管理、安全、可观测性、弹性——以及 Istio + Envoy 成为事实标准背后的工程逻辑。理解服务网格的起点,不是它提供了什么功能,而是没有它时你在忍受什么痛苦。


第 1 章 微服务架构的演进与治理困境

1.1 单体到微服务:分布式系统的复杂性转移

2010 年代,软件工程界经历了一场轰轰烈烈的架构革命:从单体应用(Monolith)迁移到微服务架构(Microservices)。这场革命的动因是真实的工程痛点:

  • 单体应用代码库庞大(百万行级别),任何一个小改动都需要全量构建和部署,发布频率极低
  • 不同功能模块共用一个进程,一个模块的内存泄漏或 CPU 峰值会影响整个应用
  • 无法针对高负载的模块单独扩容,只能整体扩容,浪费资源
  • 不同团队在同一代码库工作,协作效率低,上线窗口成为瓶颈

微服务架构将单体拆分为多个独立部署的小服务,每个服务由独立团队负责,可独立扩缩容,解决了上述问题。然而,这种拆分本质上是将进程内的函数调用转换为跨网络的远程调用——复杂性并没有消失,只是从”代码复杂性”转移为了分布式系统的运维复杂性

一个有 50 个微服务的系统,服务间的调用关系可能形成数百条调用链路。每条网络调用都面临:

  • 超时与重试:网络抖动怎么处理?重试会不会造成幂等问题?
  • 熔断:下游服务崩溃时,如何快速失败防止级联故障?
  • 负载均衡:客户端如何发现服务实例?用什么负载均衡算法?
  • 安全:服务间的流量是否加密?如何证明调用方的身份?
  • 可观测性:一条请求经过多个服务,如何追踪完整链路?

这些问题,在单体应用时代几乎不存在——它们都是微服务架构引入的新问题。

1.2 第一代解决方案:胖客户端 SDK

面对上述问题,各个公司的第一反应是:把这些治理逻辑封装成 SDK,以库(library)的形式引入服务代码。

Netflix OSS(2012-2016) 是这一思路的集大成者,推出了一系列专门解决微服务治理问题的 Java 库:

  • Eureka:服务注册与发现
  • Ribbon:客户端负载均衡
  • Hystrix:熔断器
  • Feign:声明式 HTTP 客户端(封装了 Ribbon + Hystrix)
  • Zuul:API 网关

这些库被 Spring Cloud 整合,形成了一个完整的 Java 微服务治理框架,在 2015-2020 年间成为国内外 Java 微服务项目的标配。

这个方案在一段时间内确实有效——对于全 Java 技术栈的团队,Spring Cloud 提供了开箱即用的治理能力,几行注解就能开启熔断、重试、服务发现。

1.3 胖客户端 SDK 的根本性困境

然而,随着公司规模增大、技术栈多样化,胖客户端 SDK 的方案暴露出无法回避的结构性问题:

困境一:多语言问题

Netflix OSS 是 Java 实现的,但一个现代互联网公司的技术栈通常是多语言的:Python 写机器学习服务、Go 写高并发网关、Java 写业务逻辑、Node.js 写 BFF(Backend for Frontend)。你无法把 Hystrix(Java 库)给 Go 或 Python 服务使用。要么每种语言都实现一套治理库(维护成本爆炸),要么部分语言的服务没有治理能力(安全漏洞)。

困境二:版本管理与升级问题

SDK 作为业务代码的依赖库,版本升级需要每个服务团队自己做——修改 pom.xmlgo.mod,进行充分测试,走发布流程。在有 100 个服务的组织中,推动所有团队升级 SDK 是一个旷日持久的工程管理任务。往往在你完成最后一批服务升级时,SDK 已经又发布了新版本。更糟糕的是,如果发现了安全漏洞(比如 CVE),你需要紧急推动所有服务升级,这在大公司中可能需要数周时间。

困境三:侵入性问题

治理逻辑与业务逻辑强耦合。一个简单的 HTTP 调用,加上 Ribbon 负载均衡、Hystrix 熔断、链路追踪 Span 注入,代码复杂度显著增加。更换治理框架(如从 Hystrix 切换到 Resilience4j)可能需要修改大量业务代码。

困境四:治理策略无法统一

由于每个服务独立使用 SDK,治理策略的配置分散在各个服务的配置文件中。如果你想统一调整全集群的超时策略(比如把所有服务间调用的默认超时从 3s 改为 5s),需要修改所有服务的配置并重新部署——这几乎是不可能完成的任务。

核心概念

胖客户端 SDK 方案的本质问题是关注点分离失败——它试图将基础设施关注点(网络治理)和业务关注点(业务逻辑)混合在同一个进程和代码库中。这种混合的代价在小规模时可以接受,但在多语言、多团队、大规模场景下会带来无法承受的维护负担。服务网格的发明,本质上是一次关注点的彻底分离


第 2 章 Sidecar 模式:关注点分离的架构解法

2.1 Sidecar 的设计灵感

Sidecar(边车)这个名字来自摩托车的边车——一辆摩托车旁边附加一个独立的座椅车厢,它不影响摩托车的主体结构,但能搭载额外的乘客或货物。在软件架构中,Sidecar 指的是与主应用容器一起部署、共享同一网络命名空间的辅助容器,负责处理主应用不应关心的横切关注点(Cross-cutting Concerns)。

Sidecar 的关键特性

  • 与业务容器共享 Pod(在 Kubernetes 中),因此共享同一个 Network Namespace(同一个 localhost 和 IP)
  • 独立进程,独立部署,独立升级——业务团队完全不需要感知 Sidecar 的存在
  • 语言无关:无论业务服务用什么语言写,Sidecar 都是同一个代理程序(Envoy)

2.2 流量劫持:让 Sidecar 对应用透明

Sidecar 要实现”对应用完全透明”,需要解决一个关键问题:如何让应用发出的所有网络流量都经过 Sidecar,而不需要应用代码做任何修改?

如果需要应用显式配置代理(如 HTTP_PROXY=localhost:15001),就又回到了侵入性的老路。Istio 的解决方案是:使用 iptables 规则强制劫持流量

在 Pod 启动时,Istio 通过一个 init 容器(istio-init)在 Pod 的 Network Namespace 中写入 iptables 规则:

# istio-init 容器执行的关键 iptables 规则(简化)
 
# 所有出站 TCP 流量重定向到 Envoy 的 15001 端口
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 15001 \
    -m owner ! --uid-owner 1337  # 排除 Envoy 自身(uid=1337)避免死循环
 
# 所有入站 TCP 流量重定向到 Envoy 的 15006 端口
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-port 15006

这两条规则让 Pod 内所有的入站和出站 TCP 流量都经过 Envoy 代理,而应用代码完全不知道这件事。当应用向 backend-service:8080 发起连接时:

应用进程(如 Python)
  → connect("10.96.100.1", 8080)(连接 Service ClusterIP)
  ↓ iptables OUTPUT REDIRECT
  → 实际连接到 localhost:15001(Envoy 的出站端口)
  → Envoy 接管,解析原始目标地址(通过 SO_ORIGINAL_DST socket 选项)
  → Envoy 应用流量策略(负载均衡、重试、mTLS 等)
  → Envoy 建立到真实后端的连接

设计哲学

iptables REDIRECT + SO_ORIGINAL_DST 的组合是 Sidecar 透明代理的技术基础。这个技巧在 Linux 网络中由来已久(最初用于透明 HTTP 代理),Istio 将其用于服务网格,并将其工程化——通过 init 容器自动注入,无需人工配置。这是一个”把已知的内核机制用在新场景”的典型工程实践,与 eBPF 改变网络栈的方式相比更为保守,但也更兼容。

2.3 自动 Sidecar 注入

在生产环境中,手动为每个 Pod 添加 Sidecar 容器是不现实的。Istio 通过 Kubernetes MutatingAdmissionWebhook 实现自动注入:

Pod 创建请求 → API Server → MutatingAdmissionWebhook
  ↓(Istio 的 istiod 作为 Webhook 处理器)
  → 检查 Pod 所在 Namespace 是否有 istio-injection=enabled 标签
  → 如果有,自动向 Pod spec 中注入:
      - istio-proxy(Envoy Sidecar)容器定义
      - istio-init(iptables 规则设置)init 容器定义
  ↓
修改后的 Pod spec 提交给调度器

开启自动注入只需:

kubectl label namespace default istio-injection=enabled

此后,在 default 命名空间中创建的任何 Pod,都会自动附加 Envoy Sidecar,无需修改任何 Deployment/Pod 定义。

# 验证注入效果
kubectl get pods
# NAME                       READY   STATUS    RESTARTS   AGE
# backend-7d9f5c8-xk2p9     2/2     Running   0          5m
#                            ↑
#                            2 个容器(业务容器 + istio-proxy Sidecar)

第 3 章 服务网格的四大核心能力

3.1 流量管理——精细化控制服务间路由

服务网格提供的流量管理能力,远超传统 Kubernetes Service(只能做 L4 层的随机负载均衡)。

灰度发布(Canary Release):将 10% 的流量路由到新版本服务,90% 到旧版本,观察新版本的错误率和延迟后,再逐步扩大新版本的流量比例。传统 Kubernetes 实现灰度需要维护两个 Deployment 并精心计算副本比例(粒度只能到 Pod 数量),服务网格可以在权重上精确控制(1%/99% 也可以),与 Pod 数量无关。

基于 Header 的路由:将带有特定 HTTP Header(如 X-Beta-User: true)的请求路由到测试版本服务,其他请求走稳定版本——这是”暗部署(Dark Launch)“和”A/B 测试”的基础。

流量镜像(Traffic Mirroring):将生产流量实时复制一份发到测试环境,测试环境的响应被丢弃(不影响生产),用于在真实流量下测试新版本,而不影响生产用户。

故障注入(Fault Injection):人为向某个服务注入延迟或错误,测试系统在部分服务故障时的整体韧性——这是混沌工程(Chaos Engineering)的服务网格实现。

超时与重试:在网格层面统一配置服务调用的超时时间和重试策略,无需在每个服务代码中单独实现。

3.2 安全——零信任网络的基础设施实现

mTLS(双向 TLS) 是服务网格安全能力的核心。在没有服务网格的情况下,微服务间的 HTTP 调用是明文的——在同一集群内,任何能发出网络请求的 Pod 都可以访问任意其他 Pod。即使有 NetworkPolicy,它也只能基于 IP 和端口做控制,无法验证调用方的身份。

服务网格为每个服务颁发一个基于 SPIFFE(Secure Production Identity Framework for Everyone)标准的 X.509 证书,证书中包含服务的身份(如 spiffe://cluster.local/ns/default/sa/backend)。服务间的所有连接使用 mTLS,双方都验证对方的证书——这意味着:

  • 加密:所有服务间流量在传输层加密,即使节点被攻陷,流量也无法被解密
  • 认证:每个服务都能证明自己的身份(“我是 frontend,我的证书是颁给 ns/default/sa/frontend 的”)
  • 授权:基于经过验证的身份,可以做精细化的访问控制(“只有 frontend 身份的服务才能访问 backend/api/v1/ 路径”)

这种基于身份的访问控制,比 NetworkPolicy 的 IP/端口控制更强大——即使攻击者伪造了 Pod IP,也无法伪造 mTLS 证书中的身份。

核心概念

SPIFFE(Secure Production Identity Framework for Everyone) 是 CNCF 的身份规范,定义了工作负载(服务、Pod)的身份格式和颁发机制。SPIFFE ID 格式为:spiffe://<trust-domain>/<path>,如 spiffe://example.com/ns/production/sa/payment-service。Istio 使用 SPIFFE 作为服务身份,证书中的 SAN(Subject Alternative Name)字段包含 SPIFFE ID,Envoy 在建立 mTLS 连接时验证这个 ID,从而实现基于服务身份(而非 IP)的认证。

3.3 可观测性——无侵入的全链路追踪

在没有服务网格的情况下,实现分布式追踪需要在每个服务代码中注入追踪 SDK(如 OpenTelemetry),并手动传播 trace context(如 X-B3-TraceId HTTP Header)。这不仅增加了代码复杂度,还要求每个服务的每个 HTTP 调用都正确传播 trace header——任何一个服务忘记传播,追踪链路就断了。

服务网格通过 Sidecar 提供三个维度的可观测性

指标(Metrics):Envoy Sidecar 自动采集每个服务的网络指标——请求数、错误率(4xx/5xx 比例)、延迟分布(P50/P95/P99),并以 Prometheus 格式暴露,不需要应用代码做任何事。

日志(Access Logs):每个经过 Envoy 的请求都被记录为访问日志,包含完整的请求/响应元数据(方法、路径、状态码、延迟、来源 IP 等)。

分布式追踪(Distributed Tracing):Envoy 自动生成 trace span 并传播 trace context,将整个调用链路上的所有 span 关联为一个完整的 trace。应用代码只需在进行内部异步调用时传播 trace header(Envoy 帮你处理服务间的部分),大幅降低了追踪的实现成本。

3.4 弹性——网格层面的故障容忍

熔断(Circuit Breaking):当后端服务的错误率超过阈值时,熔断器”跳闸”,后续请求直接失败返回(而不是等待超时),给后端服务恢复的时间。服务网格在 Envoy 的 Cluster 配置中实现熔断,统一管理,无需在每个服务代码中集成 Hystrix/Resilience4j。

重试(Retry):对于幂等操作,Envoy 可以自动重试失败的请求(如网络抖动导致的 503)。重试策略在网格层面统一配置,支持指数退避(exponential backoff)避免重试风暴。

超时(Timeout):在 Envoy 层面统一配置服务调用超时,防止慢调用占用连接池资源,导致上游积压。

限流(Rate Limiting):可以在 Envoy 层面限制特定来源的请求速率,防止恶意客户端或流量突刺压垮后端。


第 4 章 服务网格的产品生态与 Istio 的崛起

4.1 服务网格的三代演进

第一代(2016-2017):概念验证阶段。Buoyant 公司发布 Linkerd 1.x(基于 Twitter Finagle,Scala 实现),William Morgan(Linkerd 作者)在 2017 年发表文章首次提出”Service Mesh”这个词。同年,Lyft 开源 Envoy,成为数据面代理的参考实现。

第二代(2017-2020):Istio 主导阶段。2017 年,Google、IBM、Lyft 联合发布 Istio 0.1,将 Envoy 作为数据面,构建了完整的控制面(Pilot、Citadel、Mixer、Galley)。Istio 凭借 Google 背书和功能完整性,迅速成为服务网格的事实标准。Linkerd 在此阶段推出 Rust 重写的 Linkerd 2.x(linkerd-proxy),作为更轻量的替代。

第三代(2020-至今):整合与优化阶段。Istio 在 1.5 版本将 Pilot/Citadel/Galley 合并为单一进程 istiod,大幅简化了架构。Cilium 的 Service Mesh 模式开始用 eBPF 替代 Sidecar,降低资源开销。Istio 在 2022 年宣布 Ambient Mesh 模式,彻底重构 Sidecar 部署模型。

4.2 为什么 Istio + Envoy 成为事实标准

Envoy 的数据面优势

  • C++ 实现,性能出色(比 Java/Scala 实现的代理延迟低)
  • 功能完整:HTTP/1.1、HTTP/2、gRPC、TCP 代理,支持 L7 负载均衡、熔断、重试
  • xDS API(发现服务 API)设计优秀——控制面通过 xDS gRPC 流动态推送配置,代理零重启更新配置
  • 活跃的社区和广泛的采用(Istio、AWS App Mesh、Kong、Gloo 等均用 Envoy 作数据面)

Istio 的控制面优势

  • 深度 Kubernetes 集成:利用 CRD(CustomResourceDefinition)扩展 Kubernetes API,VirtualService、DestinationRule 等对象对运维人员友好
  • Google 和 IBM 的工程投入:背后有大规模生产环境验证
  • 功能完整:流量管理、mTLS、可观测性、策略执行全覆盖
  • CNCF 毕业项目(2023 年),生态成熟

设计哲学

Istio 选择 Envoy 作为数据面,而不是自己实现代理,体现了”控制面/数据面分离”的设计思想——控制面专注于策略计算(将高层策略翻译为底层代理配置),数据面专注于高效转发(每毫秒处理海量数据包)。两者通过 xDS API(一组 gRPC 接口)解耦,任何实现了 xDS API 的代理都可以替换 Envoy。这种分离使得数据面可以独立演进(例如用 eBPF 实现更高效的数据面),而不影响控制面的逻辑。

4.3 主流服务网格对比

维度IstioLinkerd 2.xConsul ConnectAWS App Mesh
数据面代理Envoy(C++)linkerd-proxy(Rust)Envoy(C++)Envoy(C++)
控制面语言GoGoGoAWS 托管
功能完整性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
资源开销中等(Rust proxy 极轻)中等托管,无控制面开销
部署复杂度中等低(托管服务)
社区活跃度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐(仅 AWS 场景)
多集群支持✅(完整)有限
Ambient Mesh✅(实验阶段)
适用场景完整功能需求、K8s 原生轻量化、简单场景HashiCorp 技术栈AWS 原生

第 5 章 服务网格的代价与适用边界

5.1 引入服务网格的真实成本

服务网格不是”免费的午餐”。在决定是否引入之前,必须清醒地评估以下代价:

延迟开销:每个请求经过两个额外的 Envoy 代理(发送方的出站 Sidecar + 接收方的入站 Sidecar),增加了网络路径长度。Envoy 是高性能代理,但增加的延迟是真实存在的:

  • 典型场景:P99 延迟增加 1-5ms(视流量模式和硬件而定)
  • 高并发小包场景(gRPC 微服务密集调用):可能增加 5-15ms

资源开销:每个 Pod 多了一个 Envoy 容器,消耗额外的 CPU 和内存:

  • Envoy Sidecar 典型资源:50-100m CPU,100-200MB 内存
  • 一个有 100 个 Pod 的集群,总额外开销:5-10 CPU 核,10-20GB 内存

运维复杂度:服务网格是一个复杂的分布式系统(Istio 本身有数个组件)。它的引入增加了运维人员需要掌握的知识领域,故障排查也更复杂(当请求超时时,是业务代码问题还是 Envoy 配置问题还是 mTLS 证书问题?)

学习曲线:VirtualService、DestinationRule、AuthorizationPolicy 等 Istio CRD 有较高的认知门槛。

5.2 何时引入服务网格

基于上述成本收益分析,以下是服务网格的适用场景指引:

值得引入的场景

  • 微服务数量 > 10 个,且有多语言技术栈
  • 需要渐进式发布(灰度、金丝雀)且 Deployment 副本数控制粒度不够
  • 有安全合规要求(如需要所有服务间流量加密 + 身份认证)
  • 需要深度可观测性(全链路追踪、服务间请求指标)
  • 有需要跨服务统一执行的策略(如全局超时、重试策略)

不值得引入的场景

  • 服务数量 < 5 个的小型系统
  • 单语言(Java)且 Spring Cloud 已经满足需求
  • 集群资源非常紧张(额外的 Sidecar CPU/内存不可接受)
  • 团队没有 Kubernetes 和网络的深度经验(运维风险高)

生产避坑

很多团队在引入服务网格后遇到的最大问题不是技术问题,而是组织问题:谁来维护 Istio 的配置?谁负责 mTLS 证书的轮换?当 Envoy 版本有漏洞需要升级时,谁推动所有业务 Pod 的滚动重启(需要重新注入新版 Sidecar)?这些问题如果没有清晰的责任归属,服务网格会成为组织内的”无主之地”,反而带来风险。引入服务网格之前,建议先成立专门的 Platform Engineering 团队或 SRE 团队,明确服务网格的所有权。

5.3 服务网格与 API 网关的关系

一个常见的混淆:服务网格是否替代了 API 网关?

答案是——两者解决的是不同层面的问题:

维度API 网关服务网格
流量方向南北流量(外部 → 集群)东西流量(服务 → 服务)
典型功能认证、限流、API 版本管理、SSL 终止服务间 mTLS、熔断、分布式追踪
协议关注HTTP/REST/GraphQL(L7)HTTP/gRPC/TCP(L4-L7)
典型产品Kong、NGINX、AWS API GatewayIstio、Linkerd
部署位置集群入口(Ingress)每个服务旁(Sidecar)

在实践中,API 网关和服务网格通常共存:外部请求经过 API 网关进入集群,在集群内部由服务网格管理服务间通信。Istio 提供了 Ingress Gateway 组件,可以兼任 API 网关的角色,但功能不如专用 API 网关丰富。


第 6 章 Sidecar 模式的演进:从侵入到无侵入

6.1 Sidecar 模式的固有局限

Sidecar 模式虽然解决了多语言和版本管理问题,但仍有一些固有局限:

Pod 启动顺序依赖:Sidecar 容器和业务容器同时启动,但 iptables 规则在 Sidecar 就绪前就已生效——如果 Sidecar 还没完全启动,业务容器发出的请求可能被 iptables 重定向到一个没有监听的端口,导致连接失败。解决方案是配置 Pod 的 readinessProbe 和正确的启动顺序,但增加了配置复杂度。

资源开销线性增长:每个 Pod 都有 Sidecar,Sidecar 数量随 Pod 数量线性增长。在 1000 个 Pod 的集群中,有 1000 个 Envoy 进程,每个维护独立的连接池、TLS 会话、配置缓存,这是显著的资源浪费。

连接数膨胀:Envoy 为每对服务间的通信维护独立的连接池。在有 N 个服务的集群中,连接数理论上是 O(N²) 量级,大集群中的连接数管理成为挑战。

6.2 Ambient Mesh:无 Sidecar 的服务网格

2022 年,Istio 宣布了一种全新的部署模式 Ambient Mesh,核心思路是将 Sidecar 从 Pod 内移到节点层面,用两个节点级别的组件替代 per-Pod 的 Sidecar:

  • ztunnel(Zero Trust Tunnel):每个节点运行一个 ztunnel,负责 L4 层的 mTLS 加密和基于身份的访问控制。所有出入节点的流量都经过 ztunnel,ztunnel 通过 HBONE(HTTP-Based Overlay Network Environment)协议在节点间建立安全隧道。

  • Waypoint Proxy:基于 Envoy 的 per-namespace 代理,负责 L7 层的流量管理(超时、重试、灰度、HTTPRoute 策略)。与 Sidecar 不同,Waypoint 是可选的——如果只需要 L4 安全,只部署 ztunnel 即可;如果需要 L7 功能,才部署 Waypoint。

Ambient Mesh 的优势

  • 不需要修改 Pod spec,不需要滚动重启所有 Pod(这是从 Sidecar 模式迁移时的最大痛点)
  • 资源开销从 O(Pod 数量) 降低到 O(节点数量 + namespace 数量)
  • ztunnel 非常轻量(Rust 实现),per-node overhead 极低

Ambient Mesh 在本专栏的最后一篇(第 7 篇)将详细讨论。


第 7 章 小结

7.1 服务网格的价值定位

服务网格解决了微服务架构演进到一定规模后,分散式治理框架(胖客户端 SDK)无法解决的结构性问题

痛点传统 SDK 方案服务网格方案
多语言支持每种语言独立实现(维护成本高)单一 Sidecar 代理(语言无关)
版本升级每个服务团队独立升级(耗时数周)平台团队统一升级 Sidecar(分钟级)
策略统一分散在各服务配置文件控制面统一下发
安全(mTLS)需要每个服务集成 TLS 库自动透明加密
可观测性需要注入追踪 SDKSidecar 自动采集
代码侵入性高(治理代码与业务代码混合)零侵入

7.2 本专栏的学习路径

服务网格是一个深度技术领域,本专栏将按以下顺序深入:


本文是 服务网格 专栏的第 1 篇。相关前置知识:Docker 容器原理Kubernetes 设计哲学K8s 网络模型


思考题

  1. 服务网格将服务治理能力(负载均衡、熔断、重试、mTLS、可观测性)从应用代码下沉到基础设施层(Sidecar 代理)。这解耦了业务逻辑与基础设施——但 Sidecar 代理引入了额外的延迟(每跳增加约 1-3ms)和资源消耗。在什么规模的微服务架构中(服务数量、治理需求复杂度),服务网格的收益超过其成本?
  2. Istio 使用 Envoy 作为 Sidecar 代理——每个 Pod 旁边注入一个 Envoy 容器。在一个有 500 个 Pod 的集群中,额外的 500 个 Envoy 容器消耗多少 CPU 和内存?istio-proxy 容器的默认资源请求是什么?在资源紧张的环境中如何优化?
  3. Service Mesh 与传统的 SDK 模式(如 Spring Cloud、Dubbo)在治理能力上有什么本质区别?SDK 模式的优势是性能好(不经过代理)、功能丰富(深度集成应用逻辑)。Service Mesh 的优势是语言无关、运维集中管理。在一个多语言微服务架构(Java + Go + Python)中,你如何选择?