1. Service Mesh 的 Sidecar 代理模型如何实现"零侵入",相比 SDK 方式的本质差异?
服务网格(Service Mesh)中的 Sidecar 代理模型是如何做到对应用"零侵入"的,它与传统的 SDK 嵌入方式相比,本质差异是什么?
- Sidecar 注入与流量劫持的机制
- 应用代码无需修改即可获得治理能力
- SDK 方式与代理方式的依赖与应用耦合差异
Sidecar 模型通过"注入 + 流量劫持"实现零侵入:控制面通过 Webhook 自动向 Pod 注入一个 Envoy 代理容器,并通过 istio-init 注入的 iptables 规则把进出应用的流量透明地劫持到 sidecar 上。应用进程完全无感知,代码零改动,即可获得路由、熔断、mTLS、可观测性等治理能力。SDK 方式则需要把治理逻辑(如 RPC 框架中的超时、重试、限流)以库的形式编译进应用,与应用语言、框架深度耦合,升级治理能力需要重新发布应用。本质差异是:Sidecar 把治理能力从"应用进程内"外移到"进程外旁路代理",通过数据面统一承载,应用与治理能力解耦,升级与回滚相互独立。
零侵入的核心是"透明代理 + 声明式控制面"。流量劫持让请求先经过代理再到应用,从而在不动业务代码的前提下注入治理逻辑。相比 SDK,Sidecar 的代价是每请求多一跳代理和额外资源开销,但换来的是多语言统一、治理升级与应用解耦、以及可插拔的运维能力。这也是为什么网格普遍面向多语言、微服务数量多、需要统一治理的规模化场景。
# 注入 sidecar 后 Pod 内包含 istio-init(iptables 劫持)与 istio-proxy 两个额外容器
apiVersion: v1
kind: Pod
metadata:
annotations:
sidecar.istio.io/status: '{"initContainers":["istio-init"],"containers":["istio-proxy"]}'
spec:
initContainers:
- name: istio-init
image: istio/proxyv2
args: ["istio-iptables", "-p", "15001", "-u", "1337"]
containers:
- name: istio-proxy
image: istio/proxyv2
ports:
- containerPort: 15090