服务网格

返回 云原生

Service Mesh 解决微服务间(东西向)流量的治理问题,将服务通信的控制逻辑从业务代码中剥离。

为什么需要 Service Mesh

微服务增多后,每个服务都要自己实现:

  • 超时 / 重试 / 熔断
  • 负载均衡
  • mTLS 加密
  • 链路追踪
  • 灰度发布

Service Mesh 将这些能力下沉到基础设施层,业务代码无感知。

Sidecar 模式

┌──────────────────────┐
│         Pod          │
│                      │
│  ┌────────────────┐  │
│  │  app-container │  │
│  └────────────────┘  │
│         ▲  │         │
│    入流量│  │出流量   │
│         │  ▼         │
│  ┌────────────────┐  │
│  │  Envoy Sidecar │  │
│  └────────────────┘  │
│         ▲  │         │
└─────────┼──┼─────────┘
          │  │
     所有流量经过 Sidecar

每个 Pod 自动注入一个 Envoy 代理,所有进出流量均由 Envoy 处理,业务容器无需修改。

Istio 架构

┌────────────────────────────────────────────┐
│              Control Plane                 │
│                                            │
│  ┌──────────────────────────────────────┐  │
│  │             istiod                   │  │
│  │                                      │  │
│  │  Pilot(流量管理配置下发)            │  │
│  │  Citadel(证书管理 / mTLS)          │  │
│  │  Galley(配置验证)                  │  │
│  └──────────────────────────────────────┘  │
└───────────────────┬────────────────────────┘
                    │ xDS 协议下发配置
                    ▼
┌────────────────────────────────────────────┐
│              Data Plane                    │
│                                            │
│   Pod A                Pod B               │
│   [app][envoy] ──────► [envoy][app]        │
│                                            │
└────────────────────────────────────────────┘

istiod 统一管理三个功能:

  • Pilot:将 VirtualService / DestinationRule 等配置转换为 Envoy 配置并下发
  • Citadel:为每个服务颁发证书,实现 mTLS
  • Galley:校验 Istio 配置正确性

核心能力

流量管理

VirtualService:定义路由规则

# 90% 流量到 v1,10% 到 v2(金丝雀发布)
http:
- route:
  - destination:
      host: order-service
      subset: v1
    weight: 90
  - destination:
      host: order-service
      subset: v2
    weight: 10

DestinationRule:定义负载均衡策略、熔断阈值

trafficPolicy:
  loadBalancer:
    simple: LEAST_CONN
  outlierDetection:
    consecutive5xxErrors: 5
    interval: 10s
    baseEjectionTime: 30s

熔断

服务 A → 服务 B
              ↑
         Envoy Sidecar 检测到:
         连续 5xx > 阈值 或 延迟过高
              │
         熔断器打开
              │
         快速失败(不等待超时)
              │
         30s 后半开探测

重试 / 超时

retries:
  attempts: 3
  perTryTimeout: 2s
  retryOn: "5xx,reset,connect-failure"
timeout: 10s

mTLS(双向 TLS)

服务 A                    服务 B
  │                         │
  │ ← 证书由 Citadel 颁发 →│
  │                         │
  └──── 双向 TLS 加密 ──────┘

所有服务间通信自动加密,Zero Trust 网络的基础。

流量镜像

将生产流量复制一份发送到测试服务,不影响主链路:

请求 → 主服务(返回响应)
      │
      └── 镜像 → 影子服务(忽略响应)

主流 Service Mesh 对比

方案数据面特点
IstioEnvoy功能最全,复杂度高
LinkerdLinkerd2-proxy(Rust)轻量,性能好,简单
Consul ConnectEnvoyHashicorp 生态
CiliumeBPF内核级,无 Sidecar,性能最强
AWS App MeshEnvoyAWS 托管

eBPF 无 Sidecar 方案

传统 Sidecar 的问题:每个 Pod 多一个 Envoy 容器,增加资源消耗和延迟。

Cilium 基于 eBPF 在内核层拦截流量,无需 Sidecar:

Pod A ──► eBPF Hook(内核层)──► Pod B
          (流量策略在内核执行)

代表未来 Service Mesh 的发展方向。


相关链接