2. 控制面升级原理:istiod 升级流程、Envoy xDS 配置推送变化、版本兼容性矩阵

2.1 istiod 升级流程

Istio 控制面核心组件 istiod 的升级遵循“先新后旧、逐步接管”的原则。升级过程不会导致数据面连接中断,但会触发 xDS 全量重推。标准升级流程分为以下阶段:

  1. 新版本 istiod 启动:新版本 Pod 以 REVISION 标签(如 1-22-0)启动,监听独立端口,不立即接管流量。
  2. 旧版本 istiod 保持运行:旧版本继续为已连接的 Envoy 提供 xDS 推送,新旧两套控制面共存。
  3. 数据面代理重新连接:通过 istio-proxy 容器重启或 istioctl proxy-config 触发重连,Envoy 向新版本 istiod 发起 ADS 请求。
  4. 新版本接管推送:新 istiod 验证代理版本兼容后,开始推送全量配置(LDS、RDS、CDS、EDS)。
  5. 旧版本缩容:确认所有代理完成迁移后,删除旧版本 Deployment。
关键观察点:升级期间,istiod 的 PilotPushRequest 和 PilotPushSuccess 指标会短暂飙升,属于正常现象。若 PilotPushFailure 持续增长,则表明存在配置冲突或版本不兼容。
istiod 升级流程(新旧共存 → 迁移 → 缩容) 旧版本 istiod v1.21 (运行中) 新版本 istiod v1.22 (启动) 部署 Envoy 代理 重新连接新版本 xDS 全量推送 旧版本缩容 删除 Deployment 迁移完成 升级要点 • 新旧版本必须共存一段时间 • 代理重连触发全量 xDS 推送 • 确认所有代理迁移后再缩容旧版本

2.2 Envoy xDS 配置推送变化

升级过程中,xDS 推送行为会发生显著变化。理解这些变化是排查策略冲突的基础。下表对比了升级前后 xDS 推送的关键差异:

维度 升级前(旧版本) 升级中(过渡期) 升级后(新版本)
推送触发 增量更新(Watch-based) 全量重推(Full Push) 增量更新(Watch-based)
LDS 内容 旧版本 Listener 结构 新旧 Listener 并存(可能冲突) 新版本 Listener 结构
RDS 路由 旧版本 VirtualService 解析 新版本路由规则(若 CRD 已更新) 新版本路由规则
CDS/EDS 集群 旧版本 ServiceEntry 解析 新版本集群定义(可能包含废弃字段) 新版本集群定义
推送频率 低(仅配置变更时) 高(每个代理重连触发一次) 低(恢复正常)
常见故障模式:升级期间,若新版本 istiod 推送了旧版本 Envoy 不支持的 xDS 字段(如 listener_filters_timeout 在旧版本中不存在),会导致 Envoy 拒绝配置并进入 NACK 状态。此时应检查 istioctl proxy-status 输出中的 SYNCED 状态是否为 false。

2.3 版本兼容性矩阵

Istio 控制面与数据面之间存在严格的版本兼容性约束。升级前必须核对以下矩阵,避免因版本不匹配导致 xDS 推送失败:

istiod 版本 兼容的 Envoy 版本 兼容的 Sidecar 版本 兼容的 CRD API 版本 说明
1.21.x 1.29.x 1.21.x – 1.22.x v1beta1 / v1 稳定版本,推荐升级前基线
1.22.x 1.30.x 1.21.x – 1.23.x v1beta1 / v1 新版本,支持 Gateway API
1.23.x 1.31.x 1.22.x – 1.24.x v1 最新版本,废弃 v1beta1
最佳实践:升级前使用 istioctl x precheck 命令自动检测版本兼容性。该命令会扫描集群中的 CRD、Webhook 配置和 Sidecar 注入标签,输出不兼容项列表。
版本兼容性矩阵关系图 istiod 控制面 v1.22.x Envoy 数据面 v1.30.x xDS 推送 CRD API 版本 v1beta1 / v1 Sidecar 代理 v1.21.x – v1.23.x 读取 注入 兼容性检查项 1. istiod 版本 ≥ Envoy 版本 2. CRD API 版本必须匹配 3. Sidecar 版本在兼容范围内 4. 避免跨大版本升级

2.4 升级过程中的策略冲突触发点

策略冲突在升级过程中主要出现在以下三个环节:

  • CRD 版本迁移:新版本 istiod 可能废弃旧 CRD 字段(如 v1beta1 中的 trafficPolicy 字段),导致旧配置被忽略或报错。
  • Webhook 配置冲突:新旧版本 istiod 同时运行期间,MutatingWebhookConfiguration 可能同时指向两个版本,导致 Sidecar 注入逻辑不一致。
  • Envoy 过滤器版本差异:新版本 Envoy 可能修改了过滤器链的默认行为(如 HTTP connection manager 的 upgrade_configs 处理方式),导致旧策略在新版本中失效。
排查命令示例:
# 检查代理与控制面的同步状态
istioctl proxy-status

# 查看特定 Pod 的 xDS 配置差异
istioctl proxy-config listener <pod-name> -o json

# 检测 CRD 版本兼容性
istioctl x precheck --from-version 1.21 --to-version 1.22