2. 控制面升级原理:istiod 升级流程、Envoy xDS 配置推送变化、版本兼容性矩阵
2.1 istiod 升级流程
Istio 控制面核心组件 istiod 的升级遵循“先新后旧、逐步接管”的原则。升级过程不会导致数据面连接中断,但会触发 xDS 全量重推。标准升级流程分为以下阶段:
- 新版本 istiod 启动:新版本 Pod 以
REVISION标签(如1-22-0)启动,监听独立端口,不立即接管流量。 - 旧版本 istiod 保持运行:旧版本继续为已连接的 Envoy 提供 xDS 推送,新旧两套控制面共存。
- 数据面代理重新连接:通过
istio-proxy容器重启或istioctl proxy-config触发重连,Envoy 向新版本 istiod 发起 ADS 请求。 - 新版本接管推送:新 istiod 验证代理版本兼容后,开始推送全量配置(LDS、RDS、CDS、EDS)。
- 旧版本缩容:确认所有代理完成迁移后,删除旧版本 Deployment。
关键观察点:升级期间,istiod 的
PilotPushRequest 和 PilotPushSuccess 指标会短暂飙升,属于正常现象。若 PilotPushFailure 持续增长,则表明存在配置冲突或版本不兼容。
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 注入标签,输出不兼容项列表。
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