2. Istio 架构基础:控制平面与数据平面

在深入集群升级治理之前,必须透彻理解 Istio 的架构基石。Istio 采用经典的控制平面/数据平面分离架构,这种设计直接决定了升级策略、流量管理粒度以及故障隔离边界。本章将拆解核心组件 Pilot、Mixer、Citadel、Galley 的职责,分析数据平面 Envoy 代理的工作机制,并详细说明 Sidecar 注入的完整流程。

2.1 控制平面组件详解

控制平面负责统一管理服务网格的配置、安全、策略和可观测性。在 Istio 1.5+ 版本中,传统组件被整合为单一的 istiod 二进制,但内部逻辑仍保持模块化设计。下表梳理了各组件的核心职责与升级影响:

组件 核心职责 升级关键影响
Pilot 服务发现、流量规则下发(VirtualService/DestinationRule 转换为 Envoy 配置) 升级期间需保证 xDS 协议兼容,避免 Envoy 配置解析失败
Mixer 策略检查(RBAC、配额)与遥测报告(日志、指标) 1.5+ 版本已移除,升级需迁移至 Envoy 原生 Wasm 扩展或 Telemetry API
Citadel 证书签发与管理(mTLS 身份认证、SPIFFE 标准) 证书轮换周期与 CA 根证书变更需在升级前规划
Galley 配置验证、格式转换、状态分发 1.5+ 版本功能合并至 istiod,升级需检查 CRD 兼容性
升级提示: 从 1.4 及更早版本升级时,Mixer 和 Galley 的移除是架构变更最大的部分。建议在升级前使用 istioctl x precheck 验证 CRD 和配置兼容性,避免控制平面组件缺失导致策略失效。

下图展示了控制平面各组件之间的数据流与依赖关系:

Istio 控制平面组件架构与数据流 kubectl / istioctl Galley 配置验证 & 转换 Pilot 服务发现 & xDS 下发 Citadel 证书签发 & mTLS Mixer (1.5+ 移除) Envoy Sidecar (数据平面) xDS 配置 / 证书 / 遥测上报 说明:实线表示当前版本数据流,虚线表示 Mixer 已被移除,功能迁移至 Envoy 原生扩展

2.2 数据平面:Envoy 代理

Envoy 是 Istio 数据平面的核心,以 Sidecar 模式注入到每个 Pod 中。它负责拦截所有进出容器的流量,并执行控制平面下发的路由、安全、可观测性策略。Envoy 的关键能力包括:

  • L4/L7 流量拦截: 通过 iptables 规则透明劫持入站和出站流量,无需修改应用代码。
  • 动态配置(xDS): 通过 Aggregated Discovery Service (ADS) 从 Pilot 拉取监听器(LDS)、路由(RDS)、集群(CDS)、端点(EDS)等配置。
  • mTLS 终止: 与 Citadel 协作,自动为服务间通信启用双向 TLS 加密,证书轮换由 Envoy SDS 实现。
  • 可观测性: 生成详细的访问日志、分布式追踪(Jaeger/Zipkin)和 Prometheus 指标。
升级关注点: Envoy 版本必须与控制平面 istiod 版本保持兼容。Istio 官方支持 N-2 版本兼容策略,即数据平面 Envoy 可以比控制平面最多低两个小版本。升级时应优先升级控制平面,再逐步滚动升级数据平面。

2.3 Sidecar 注入原理

Sidecar 注入是 Istio 将 Envoy 代理自动附加到应用 Pod 的机制。注入方式分为手动注入和自动注入(基于 MutatingWebhook)。理解注入流程对于排查升级后 Pod 启动失败问题至关重要。

自动注入的完整流程如下:

  1. Pod 创建请求: 用户通过 Deployment/StatefulSet 创建 Pod,API Server 收到请求。
  2. Webhook 拦截: 如果命名空间带有 istio-injection=enabled 标签,API Server 调用 Istio 的 MutatingWebhookConfiguration。
  3. 注入请求处理: istiod 中的 Sidecar Injector 组件解析 Pod 模板,生成 Envoy 容器配置和 init 容器配置。
  4. 修改 Pod 定义: 在 Pod 的 spec 中添加:
    • init 容器: istio-init,负责设置 iptables 规则,将流量重定向到 Envoy。
    • Sidecar 容器: istio-proxy,运行 Envoy 代理。
    • 卷挂载: 注入服务账户令牌、证书、istio 配置等。
  5. 返回修改后的 Pod: API Server 使用修改后的 Pod 定义创建 Pod。

下表对比了手动注入与自动注入的适用场景:

注入方式 触发时机 适用场景 升级注意事项
手动注入 istioctl kube-inject -f deployment.yaml CI/CD 管道中预注入,避免运行时 webhook 延迟 升级后需重新生成注入模板,确保 Envoy 版本匹配
自动注入 Pod 创建时由 MutatingWebhook 触发 开发环境、动态扩缩容频繁的场景 升级 istiod 后,webhook 配置自动更新,但需验证注入策略

下图展示了 Sidecar 自动注入的完整调用链:

Sidecar 自动注入流程 kubectl apply API Server MutatingWebhook istiod Injector Pod 创建 (含 istio-init + istio-proxy) 说明:自动注入依赖命名空间标签 istio-injection=enabled,升级后需确认 webhook 配置未被覆盖 init 容器负责 iptables 规则,istio-proxy 容器运行 Envoy

2.4 架构升级要点总结

基于上述架构分析,在集群升级治理中需要重点关注以下方面:

  • 控制平面升级顺序: 先升级 istiod(包含 Pilot、Citadel、Galley 功能),再升级数据平面 Envoy。
  • Mixer 迁移: 如果使用 Mixer 策略,需在升级前迁移至 Envoy 原生扩展或 Istio Telemetry API。
  • Sidecar 注入验证: 升级后使用 istioctl proxy-status 检查所有 Sidecar 是否与控制平面正常通信。
  • 证书兼容性: Citadel 升级可能导致 CA 根证书变更,需确保旧证书在轮换期内仍然有效。
常见升级故障: 升级后 Envoy 无法连接到 istiod 通常由以下原因导致:1) 网络策略阻止 15010/15012 端口;2) 证书过期或 CA 不匹配;3) Envoy 版本与 istiod 不兼容(超过 N-2 版本差)。建议在升级前使用 istioctl verify-install 进行预检。