2. 服务网格核心概念:Sidecar代理、数据平面与控制平面、Istio架构组件详解

在进入金丝雀发布实战之前,必须透彻理解服务网格的三大基石:Sidecar 代理、数据平面与控制平面的分离架构,以及 Istio 的核心组件。这些概念是后续流量劫持、路由规则下发、TLS 证书管理的理论基础。

2.1 Sidecar 代理:流量拦截的“交通警察”

Sidecar 是服务网格中最小的执行单元。它是一个与业务容器同 Pod 部署的轻量级代理(通常是 Envoy),负责拦截该 Pod 所有进出流量。

核心职责: 自动劫持流量 → 执行路由规则 → 收集遥测数据 → 建立 mTLS 连接。

Sidecar 流量劫持原理

  1. 入站拦截: iptables 规则将发往 Pod IP 的请求重定向到 Sidecar 的 15006 端口。
  2. 出站拦截: 业务容器发出的请求被重定向到 Sidecar 的 15001 端口。
  3. 策略执行: Sidecar 根据控制平面下发的 VirtualService/DestinationRule 决定转发目标。
  4. 指标上报: 每个请求完成后,Sidecar 将延迟、状态码、标签等数据上报给控制平面。
金丝雀发布关键: Sidecar 是流量切分的执行者。通过修改 VirtualService 中的权重,Sidecar 会按比例将流量分发到 v1(稳定版)和 v2(金丝雀版)的 Pod 上,无需修改业务代码。
Sidecar 代理流量劫持与转发流程 Sidecar 代理流量劫持与转发流程 业务容器 App (v1/v2) Sidecar (Envoy) 15001/15006 端口 目标服务 v1 目标服务 v2 控制平面 出站拦截 权重 90% 权重 10% 下发路由规则 说明:Sidecar 根据控制平面下发的权重规则,将流量按比例分发至不同版本的目标服务,实现金丝雀发布。

2.2 数据平面与控制平面:分离架构的智慧

服务网格将流量管理和安全策略从业务进程中剥离,形成两个独立的平面:

维度 数据平面 (Data Plane) 控制平面 (Control Plane)
组成 所有 Sidecar 代理(Envoy) Pilot、Mixer、Citadel、Galley
职责 拦截流量、执行路由、负载均衡、mTLS 加解密 配置下发、策略管理、证书签发、遥测聚合
处理位置 每个 Pod 内(与业务容器同生命周期) 独立的 Deployment(通常 2-3 副本高可用)
故障影响 直接影响当前 Pod 的流量转发 短暂中断不影响已有规则,新 Pod 无法获取配置
性能要求 极低延迟(微秒级转发) 高吞吐配置下发(秒级收敛)
架构设计要点: 控制平面故障不会导致正在运行的 Sidecar 停止工作。Sidecar 会缓存最后收到的配置,继续按旧规则转发流量。这是服务网格高可用的关键设计。

2.3 Istio 核心组件详解

Istio 是目前最成熟的服务网格实现。其控制平面由四个核心组件构成,每个组件承担不可替代的职责。

2.3.1 Pilot:流量规则的“翻译官”

  • 功能: 将 VirtualService、DestinationRule 等 CRD 转换为 Envoy 可理解的 xDS 协议配置。
  • 关键接口: 通过 gRPC 流式推送 LDS(监听器发现)、RDS(路由发现)、CDS(集群发现)、EDS(端点发现)给所有 Sidecar。
  • 金丝雀关联: 修改 VirtualService 的权重后,Pilot 在几秒内将新规则推送到所有相关 Sidecar,触发流量切换。

2.3.2 Mixer:策略与遥测的“中央处理器”

  • 功能: 前置检查(Check)和后置报告(Report)。
  • Check: 每次请求前询问 Mixer 是否允许通过(白名单、限速、ACL)。
  • Report: 请求结束后将日志、指标、追踪信息上报给 Mixer,再由 Mixer 转发给 Prometheus、Grafana、Jaeger 等后端。
  • 注意: 新版本 Istio 已默认关闭 Mixer,改用 Envoy 原生 Wasm 扩展和 Telemetry v2,但理解 Mixer 有助于阅读旧版配置。

2.3.3 Citadel:安全证书的“发证机关”

  • 功能: 自动生成、分发、轮换 TLS 证书,实现服务间 mTLS 加密。
  • 工作流程: Citadel 监听 ServiceAccount 创建 → 为每个 ServiceAccount 签发 SPIFFE 格式证书 → 通过 Secret 挂载到 Pod → Sidecar 自动加载证书。
  • 金丝雀安全: 金丝雀版本自动继承相同的 ServiceAccount 和证书,无需额外配置即可与其他服务建立加密通信。
Istio 控制平面组件与数据平面交互 Istio 控制平面组件与数据平面交互 数据平面 Sidecar (Envoy) × N 流量劫持 / 路由执行 / mTLS 指标采集 / 日志 Pilot xDS 配置下发 VirtualService → Envoy Mixer (可选) 策略检查 / 遥测报告 Prometheus / Jaeger Citadel 证书签发 / mTLS SPIFFE 身份管理 请求配置 推送 xDS Check/Report 请求证书 下发证书 说明:Pilot 负责配置下发,Mixer 负责策略与遥测(新版本已默认关闭),Citadel 负责安全证书管理。三者协同支撑数据平面的运行。 金丝雀发布中,Pilot 是核心组件——修改 VirtualService 后,由 Pilot 将新路由规则推送到所有 Sidecar。

2.4 组件协作流程:一次金丝雀请求的生命周期

以金丝雀发布场景为例,梳理各组件如何协作:

  1. 运维人员 通过 kubectl apply 更新 VirtualService,将 v2 权重设为 10%。
  2. Pilot 监听到 CRD 变更,生成新的 Envoy 路由配置(RDS),通过 gRPC 流推送到所有相关 Sidecar。
  3. Sidecar 收到配置后,更新本地路由表。后续请求到达时,按 90:10 比例分发到 v1 和 v2。
  4. Citadel 确保 v2 Pod 的 Sidecar 拥有合法证书,与其他服务建立 mTLS 连接。
  5. Mixer(如启用) 接收 Sidecar 上报的请求指标,标记版本标签(version=v2),供监控系统区分金丝雀流量。
关键结论: 金丝雀发布的核心是 Pilot → Sidecar 的配置下发链路。理解这条链路,就能掌握流量切分的本质。