2. 服务网格基础概念:什么是服务网格、Sidecar模式、数据平面与控制平面、主流服务网格对比

服务网格这几年热度一直没降过。说实话,我刚接触这个概念时也被绕晕过——它到底是一个独立产品,还是Kubernetes的插件?其实都不准确。这块内容理解透了,后面讲内部开发者平台嵌入服务网格的逻辑才站得住。咱们一个一个来拆。

2.1 什么是服务网格

服务网格,简单说,就是基础设施层的一个专用网络通信层。它把微服务之间的流量管理、安全、可观测性抽出来,放到一个独立的平面里,不碰业务代码。

你想想看,传统微服务里,每个服务都得自己处理重试、超时、熔断、认证这些事。要么用库,要么自己写。我见过一个项目,团队花了两周往Java SDK里集成Hystrix,结果版本冲突折腾了一周。服务网格就是把这类逻辑从代码里挪出来,放到系统层去解决。

核心转变: 从“服务自己管网络”变成“网络替你管服务”。业务代码只需要关注业务逻辑,流量治理全交给网格。

2.2 Sidecar模式

服务网格的实现基础,就是Sidecar模式。你可能从Docker或Kubernetes里听说过它——在一个Pod里跑两个容器,一个是业务容器,另一个是辅助容器。这个辅助容器就是Sidecar。

Sidecar本质上是一个轻量级的网络代理,它会拦截进出业务服务的所有流量,然后在代理层执行策略:路由、负载均衡、TLS终止、访问控制、遥测数据收集……

举个例子:服务A想调用服务B,不再直接在代码里写http://service-b:8080,而是发到本地的Sidecar代理——通常是127.0.0.1的某个端口。Sidecar再根据控制平面下发的配置,决定把请求转发给哪个实例。

# 一个典型的Istio Sidecar注入后的Pod结构
apiVersion: v1
kind: Pod
metadata:
  name: payment-v1
spec:
  containers:
  - name: payment          # 业务容器
    image: payment:1.0
  - name: istio-proxy      # Sidecar代理
    image: docker.io/istio/proxyv2:1.20.0
    ports:
    - containerPort: 15001  # 入站流量拦截
    - containerPort: 15006  # 出站流量拦截

注意这里:Sidecar代理是用iptables规则把流量透明劫持过来的。业务容器完全无感,甚至不知道有Sidecar存在。这也是服务网格最大的价值——零侵入。

我个人习惯,在测试环境注入Sidecar后,先到Pod里跑个curl localhost:15000/stats查看代理状态。如果一直不通,先检查iptables是否生效,别急着找网格的Bug。

2.3 数据平面与控制平面

服务网格分为两个逻辑平面:数据平面和控制平面。这两个概念必须分清,否则后面配策略时会一脸懵。

  • 数据平面:由所有Sidecar代理组成。它直接处理业务流量,做转发、负载均衡、健康检查、熔断。每个代理只做一件事——按照控制平面给的规则,高效地转发数据包。
  • 控制平面:负责管理数据平面的行为。它收集服务发现信息、下发路由规则、生成TLS证书、聚合链路追踪和指标。控制平面本身不碰业务流量,只跟数据平面通信。

数据平面是“跑腿的”,控制平面是“发指令的”。二者通过xDS协议(发现服务、监听器、路由、集群等配置)交互。

我曾经遇到一个坑:团队把Istio控制平面升级到1.16,但数据平面还留在1.15。结果Sidecar代理报No healthy upstream——因为新版控制平面下发的Envoy配置字段变了,旧版Envoy不认。所以升级时务必控制平面和数据平面版本保持一致。

2.4 主流服务网格对比

现在市场上主流的选项有四个:Istio、Linkerd、Consul Connect、Kuma。我每个都接触过,简单说说它们的特点。

特性 Istio Linkerd Consul Connect Kuma
数据平面 Envoy(高性能,功能丰富) Linkerd-proxy(Rust编写,轻量) 内置代理 + Envoy可选 Envoy(与Istio类似)
控制平面语言 Go Rust + Go Go Go
多集群支持 原生支持,配置复杂 通过Service Mirror实现 基于Consul的数据中心同步 原生支持,API简化
资源消耗 较高(Envoy内存占用大) 低(Rust代理极省资源) 中等 中等
学习曲线 陡峭,CRD繁多 平缓,CLI直观 中等,依赖Consul生态 较平缓,API统一
适用场景 大型企业、复杂策略 小型团队、注重资源效率 已有Hashicorp栈 多云/混合云统一管理

Istio功能最全,但重。我前东家的Kubernetes集群有400个Pod,Istio控制平面吃掉2个8C16G的节点资源。你得算好这笔账。

Linkerd更轻量,Rust写的数据平面启动快,内存占用低。我习惯拿它做小团队的快速试验,但有些高级功能(如多重认证、协议嗅探)不如Istio完整。

Consul Connect最大的优势是跟Consul服务发现无缝衔接,如果你已经在用Consul做注册中心,迁移成本低。但它强依赖Consul集群的稳定性,曾经一次Consul Leader选举导致格断联——虽然概率低,但要注意。

Kuma相对新一些,但它在多集群统一管理上做得不错,控制平面天生支持zone隔离,适合混合云场景。如果你有多个K8s集群+虚拟机混合部署,Kuma值得看看。

最后再看一下整体的知识结构,我画了张图把核心概念串起来。

服务网格核心概念关系图 服务网格核心概念关系图 数据平面 (Data Plane) Sidecar代理 A Sidecar代理 B 服务A (业务) 服务B (业务) 相互调用 透明拦截、负载均衡、熔断、重试 数据平面负责处理所有业务流量 控制平面 (Control Plane) Pilot/Discovery Citadel/安全 Mixer/Telemetry Injection/注入 xDS协议 健康/指标 控制平面下发配置,数据平面执行转发; 业务容器完全无感知,Sidecar透明代理

看得清楚吧?左侧数据平面里每个业务服务配一个Sidecar代理,流量经过代理转发。右侧控制平面集中管理策略、证书、配置。二者通过xDS协议通信。这就是服务网格最基本的运作模型。

注意: 别把控制平面和数据平面部署在同一个Kubernetes集群内导致资源竞争。我见过测试环境把Istiod和业务Pod放在同一节点组,结果控制平面OOM后全集群流量策略失效,Sidecar退回“透传”模式,熔断规则全丢了。生产环境建议控制平面独占节点组,加上PodDisruptionBudget和反亲和性。

理解了这些基础概念,后面嵌入内部开发者平台时,你才能判断该在哪个层面做抽象——是把Sidecar注入做成平台模板的一部分,还是通过控制平面API动态下发路由策略。这些选择直接影响平台的可维护性和性能。