【Istio 控制面】多集群东西向发现扇出:Primary-Remote 与网络拓扑
内容提要
本文介绍Istio多集群控制面机制:istiod通过remote secret跨集群watch多个API Server,自动聚合服务发现端点,但配置分发需外部工具保证一致性。输出端采用Split-Horizon EDS,按网络重写端点,跨网络端点替换为东西向网关地址,Envoy无感知。网络标签决定重写,Locality仅影响优先级。网关健康由数据面兜底,多primary配置漂移无检测机制。
延伸解读
配置分发责任边界
多集群场景下,服务发现是自动跨集群聚合的,但配置分发不是。istiod 通过 remote secret 自动 watch 远程集群的 Service/Endpoint,但 VirtualService 等配置需要运维在多个集群分别 apply,Istio 不保证一致性。这意味着多 primary 集群的配置漂移风险需要依赖 CI/CD 或 GitOps 工具来管理,否则可能出现同名配置内容不一致,且无告警。
Split-Horizon EDS 的职责边界
Split-Horizon EDS 只负责地址重写,不负责健康检查。当配置多网络时,跨网络端点会被替换为东西向网关地址,但 EDS 层不探测网关健康。如果网关不可用,客户端会拿到看似合法的端点,实际连接失败,只能依赖 Envoy 侧的健康检查或 outlier 检测来摘除。这是设计上的取舍,保持 EDS 职责单一,但运维需注意网关可用性。
网络标签与 Locality 的区分
网络标签(topology.istio.io/network)决定 Split-Horizon EDS 是否触发重写,而 Locality 标签只影响负载均衡的优先级排序,两者是独立机制。网络标签配置错误会导致跨网络代理被误判为同网络,直接下发不可达的 Pod IP。Locality 则让流量优先打到同地域实例,但不影响可达性判断。理解这一区分有助于排查多集群流量异常。
Q&A
Istio 多集群中,istiod 如何获取远程集群的服务发现信息?
通过 istioctl create-remote-secret 生成包含远程集群 API Server 访问信息的 Secret,应用到 primary 集群的 istiod 命名空间后,istiod 会像 watch 本地 API Server 一样对远程集群建立 watch 连接,抓取 Service 和 Endpoint 数据。
Split-Horizon EDS 在多集群中如何重写端点?
Split-Horizon EDS 根据代理所在网络,对端点列表进行重写:同网络端点原样下发,跨网络端点替换为对应网络的东西向网关地址,并按网关数量重新分配负载均衡权重。Envoy 对此无感知。
Istio 多集群中,网络标签和地域标签分别起什么作用?
网络标签(topology.istio.io/network)决定 Split-Horizon EDS 是否触发端点重写;地域标签(region/zone)仅影响负载均衡优先级排序,不影响端点可达性。两者是独立机制。
多 primary 集群中,配置一致性如何保证?
Istio 不提供配置同步机制,多 primary 集群的配置一致性需要依赖 CI/CD 或 GitOps 工具在配置分发层解决。如果两个集群上 VirtualService 等配置不一致,控制面不会检测或告警。
东西向网关不可用时,Istio 控制面如何处理?
Split-Horizon EDS 不做网关健康探测,即使网关不可用,仍会将跨网络端点重写为网关地址。客户端可能拿到看似合法的端点但连接失败,需要依赖 Envoy 侧的健康检查或 outlier 检测来摘除故障端点。
远程集群 API Server 不可达时,istiod 会有什么表现?
istiod 对远程集群的 watch 连接会失败或重试,远程集群的端点会从合并结果中消失,导致该集群的实例不再出现在任何代理的 EDS 响应中,表现为端点列表变短而非进程崩溃。
Istio 多集群中,未配置多网络时端点如何下发?
未配置多网络时(默认情况),Split-Horizon EDS 过滤器直接跳过,端点原样下发,不需要东西向网关介入 EDS 层。这适用于 Pod 网络跨集群直连的场景。
Istio 多集群中,配置了多网络但没有部署东西向网关会怎样?
Istio 仍会按同网络处理远程端点并下发 EDS,但实践中大概率因 Pod 不可达而失败。这是已知的历史行为,官方故意不改,以避免破坏已有部署。