在上一篇文章中我们学习了 Istio 的零信任安全体系。但单个 Kubernetes 集群总有边界——当业务规模扩大、需要异地容灾、或希望实现就近访问时将服务网格扩展到多个集群就成为必然选择。多集群服务网格Multi-Cluster Service Mesh 允许你用一个统一的网格管理跨多个 Kubernetes 集群的服务实现故障隔离、就近路由和跨集群服务发现。本文从多集群的适用场景讲起深入剖析 Istio 的三种多集群部署模型Primary-Remote、Multi-Primary、Ambient 多集群并通过实战演示如何配置跨集群服务发现和流量路由帮你掌握将服务网格扩展到多集群环境的核心技能。一、为什么需要多集群服务网格在单一集群中部署 Istio 已经能够解决服务间通信的绝大部分问题。但随着业务增长单集群模式会逐渐暴露出局限性场景一高可用与容灾单个集群可能因节点故障、网络分区或云服务商中断而不可用。将服务部署到多个地理区域Region或可用区Zone的集群中可以实现跨集群故障转移Failover。当一个集群出现问题时可以临时将流量路由到邻近的集群。场景二就近访问与低延迟对于全球分布的用户将服务部署到靠近用户的区域可以显著降低延迟。多集群网格支持位置感知路由Location-Aware Routing 自动将请求路由到最近的可用服务实例。场景三环境隔离与团队隔离不同的团队或项目可以运行各自独立的集群而 Istio 多集群可以将这些集群纳入同一个服务网格实现统一的流量管理、安全策略和可观测性。场景四灰度发布与金丝雀发布可以在单个集群中先部署新版本验证稳定后再逐步推广到其他集群。这种“分集群灰度”策略比单集群内的权重灰度更加可控。多集群部署的核心能力故障隔离与故障转移一个集群故障流量自动切换到另一个集群。位置感知路由将请求路由到距离客户端最近的服务实例。统一的控制平面在多个集群间共享或复制 Istio 控制平面。跨集群服务发现一个集群中的服务可以调用另一个集群中的服务。二、Istio 多集群的部署模型Istio 支持多种多集群部署模型选择哪种模型取决于你的隔离性、性能和可用性要求。Istio 的多集群架构主要围绕三个独立维度进行组合2.1 模型一Primary-Remote共享控制平面在这种模型中一个集群运行主 Istiod 控制平面其他远程集群连接到它。远程集群不运行自己的 Istiod而是通过 istio-remote 配置连接到主控制平面。text┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐│ Primary Cluster │ │ Remote Cluster │ │ Remote Cluster ││ ┌─────────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ ││ │ Istiod │ │ │ │ Remote │ │ │ │ Remote │ ││ │ (Control) │ │ │ │ Config │ │ │ │ Config │ ││ └──────┬──────┘ │ │ └───────────┘ │ │ └───────────┘ ││ │ │ │ │ │ ││ ┌──────┴──────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ ││ │ East-West │ │ │ │ East-West │ │ │ │ East-West │ ││ │ Gateway │ │◄───┼──│ Gateway │ │◄───┼──│ Gateway │ ││ └─────────────┘ │ │ └───────────┘ │ │ └───────────┘ │└─────────────────┘ └─────────────────┘ └─────────────────┘优点管理简单只有一个控制平面需要维护配置变更只需在主集群执行缺点单点故障主集群 Istiod 不可用会影响所有远程集群的配置下发2.2 模型二Multi-Primary多控制平面每个集群运行自己的 Istiod 实例控制平面之间通过信任域Trust Domain 建立互信。控制平面之间共享服务发现信息但每个集群独立管理自己的配置。text┌─────────────────┐ ┌─────────────────┐│ Cluster 1 │ │ Cluster 2 ││ ┌─────────────┐ │ │ ┌─────────────┐ ││ │ Istiod │ │ │ │ Istiod │ ││ │ (Primary) │ │ │ │ (Primary) │ ││ └──────┬──────┘ │ │ └──────┬──────┘ ││ │ │ │ │ ││ ┌──────┴──────┐ │ │ ┌──────┴──────┐ ││ │ East-West │ │◄───┼──│ East-West │ ││ │ Gateway │ │ │ │ Gateway │ ││ └─────────────┘ │ │ └─────────────┘ │└─────────────────┘ └─────────────────┘优点更好的故障隔离一个控制平面故障不影响其他集群配置更新延迟低每个集群的 Istiod 就近处理配置变更缺点管理更复杂需要配置跨集群的信任关系和证书同步需要为每个集群分别部署和维护 Istiod2.3 模型三Ambient 模式多集群Istio 1.27 引入了 Ambient 模式的多集群支持Alpha并在 1.29 中升级为 Beta。Ambient 模式采用轻量级模块化架构将数据平面的核心功能如加密转移到节点或命名空间级别的共享组件中。Ambient 多集群的关键设计东西向网关East-West Gateway 每个集群配置一个具有全局可路由 IP 的东西向网关作为跨集群通信的入口点。双倍 HBONEDouble HBONE 使用嵌套的 HBONE 连接高效保护跨集群流量。外部 HBONE 加密发往东西向网关的流量内部 HBONE 提供端到端加密。命名空间相同性模型服务在不同集群之间保留其现有的 DNS 名称无需更改应用代码。ServiceScope API网格管理员通过 ServiceScope 定义哪些服务是全局可访问的。默认情况下带有 istio.io/globaltrue 标签的服务即为全局服务。Ambient 多集群的优势无需在每个 Pod 中注入 Sidecar降低了资源开销跨集群流量自动加密和认证支持多网络拓扑不同网络间的集群互联三、多集群网络拓扑多集群服务网格的另一个关键维度是网络拓扑单网络Single Network 所有集群共享同一个扁平网络例如在同一 VPC 中。Pod 之间可以直接路由无需经过网关。多网络Multi-Network 集群位于不同的网络中例如跨云、跨 VPC。跨集群通信需要经过东西向网关East-West Gateway 。在 Istio 1.29 中Ambient 多网络多集群支持已进入 Beta 阶段新增了增强的端点发现机制HBONE 协议支持通过 baggage 头部在集群间交换对等元数据。四、实战配置 Primary-Remote 多集群以下是一个简化版的 Primary-Remote 多集群配置流程帮助你建立对多集群配置的整体认知。4.1 前提条件两个 Kubernetes 集群Cluster1 作为 PrimaryCluster2 作为 Remote两个集群之间网络互通已安装 istioctl4.2 配置 Primary 集群安装 Istio 并暴露控制平面# 生成 Primary 集群的配置文件catEOFprimary-cluster.yamlapiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: meshConfig: trustDomain: cluster.local values: global: meshID: mesh1 multiCluster: clusterName: cluster1 network: network1 EOF# 安装 Istioistioctlinstall-fprimary-cluster.yaml暴露 East-West Gateway# 安装 East-West Gatewaysamples/multicluster/gen-eastwest-gateway.sh\--meshmesh1--clustercluster1--networknetwork1|\kubectl apply-f- 启用跨集群服务发现bashkubectl apply-fsamples/multicluster/expose-services.yaml4.3 配置 Remote 集群获取 Primary 集群的远程配置# 在 Primary 集群上生成远程集群的配置istioctl x create-remote-secret\--namecluster2\--contextcluster1remote-secret.yaml安装 Remote 集群的 Istio# 安装 Remote 集群的 IstiocatEOFremote-cluster.yamlapiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: values: global: meshID: mesh1 multiCluster: clusterName: cluster2 network: network1 remotePilotAddress: PRIMARY_ISTIOD_IP EOFistioctlinstall-fremote-cluster.yaml应用远程 Secretkubectl apply-fremote-secret.yaml五、验证多集群配置5.1 部署跨集群服务在 Cluster1 中部署服务的 v1 版本在 Cluster2 中部署 v2 版本然后通过一个统一的 Service 暴露# Cluster1: 部署 v1kubectl apply-fsamples/helloworld/helloworld.yaml-lversionv1# Cluster2: 部署 v2kubectl apply-fsamples/helloworld/helloworld.yaml-lversionv25.2 验证跨集群访问从一个集群中的 Pod 访问另一个集群中的服务# 在 Cluster1 中执行kubectlexec-itsleep-xxx --curlhelloworld:5000/hello如果配置正确响应会交替来自 Cluster1 和 Cluster2 的 Pod。5.3 使用 Kiali 查看多集群拓扑Kiali 支持多集群配置可以在一个界面中查看所有集群的服务拓扑图。六、多集群安全配置在多集群环境中安全配置更加重要信任域配置所有集群应配置相同的 trustDomain或通过信任域联合Trust Domain Federation建立跨集群的信任关系。跨集群 mTLS跨集群流量通过 East-West Gateway 时会自动启用 mTLS 加密。授权策略AuthorizationPolicy 中的 source.principals 可以跨集群匹配服务身份格式为 cluster.local/ns//sa/。七、小结多集群服务网格将服务网格扩展到多个 Kubernetes 集群支持故障隔离、就近路由和高可用部署。三种部署模型Primary-Remote共享控制平面管理简单但存在单点故障、Multi-Primary多控制平面高可用但管理复杂、Ambient 多集群轻量级模块化架构Beta 阶段。网络拓扑单网络直接路由和多网络需 East-West Gateway决定了跨集群流量的路径。核心组件East-West Gateway 处理跨集群流量ServiceScope API 定义全局服务。可观测性Istio 1.29 增强了多集群的可观测性HBONE 协议支持对等元数据交换。