4. Istio 多集群部署模式详解:多主模式(Multi-Primary)

多主模式(Multi-Primary)是 Istio 多集群部署中最灵活、最对称的架构。每个集群都拥有独立的控制面(istiod),且每个集群都能独立地管理自身的工作负载与流量策略。集群之间通过东西向网关(East-West Gateway)建立双向的 mTLS 连接,实现跨集群的服务发现与流量路由。

4.1 架构原理

在多主模式下,每个 Kubernetes 集群都部署一套完整的 Istio 控制面组件,包括 istiod、Ingress Gateway 和 East-West Gateway。所有集群处于对等地位,不存在主从关系。其核心设计原则包括:

  • 控制面自治:每个集群的 istiod 独立处理本集群的配置分发与证书签发,不依赖其他集群的控制面。
  • 数据面扁平互联:各集群的 Sidecar Proxy 通过东西向网关建立直接的 mTLS 隧道,实现 Pod IP 级别的连通性。
  • 服务发现联邦:通过 ServiceEntry 和 Endpoint 的跨集群同步,使每个集群都能感知到其他集群的服务实例。
关键优势: 多主模式消除了单点故障,任一集群的控制面故障不会影响其他集群的正常运行;同时支持独立的版本升级与灰度发布,适合大规模、多团队的生产环境。
多主模式(Multi-Primary)架构总览 多主模式(Multi-Primary)架构总览 集群 1(Cluster-1) istiod(控制面) East-West Gateway Service A (v1) Service B (v1) 集群 2(Cluster-2) istiod(控制面) East-West Gateway Service A (v2) Service C (v1) mTLS 隧道 mTLS 隧道 跨集群服务发现 ServiceEntry + Endpoint 同步 多主模式核心特征 • 每个集群拥有独立控制面,无主从依赖 • 东西向网关建立双向 mTLS 隧道,实现 Pod IP 级互联 • 通过 ServiceEntry 实现跨集群服务发现,支持版本化路由

4.2 东西向网关配置

东西向网关(East-West Gateway)是多主模式的关键组件,负责在不同集群之间建立安全的通信隧道。与南北向的 Ingress Gateway 不同,东西向网关专门处理集群内部的跨集群流量,通常暴露在专用的端口上。

4.2.1 东西向网关的核心职责

职责 说明 协议/端口
mTLS 隧道建立 在集群之间建立双向 TLS 认证的加密隧道 TCP 15443
服务流量转发 将跨集群的服务请求转发到目标集群的 Pod IP TCP 15443
证书交换 在集群之间交换根证书,建立信任关系 TCP 15443
健康检查 检测对端集群的可用性,自动剔除故障端点 TCP 15443

4.2.2 配置示例

以下是一个典型的东西向网关配置,使用 IstioOperator 进行部署:

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: eastwest-gateway
spec:
  profile: empty
  components:
    ingressGateways:
      - name: istio-eastwestgateway
        label:
          istio: eastwestgateway
          app: istio-eastwestgateway
          topology.istio.io/network: network-1
        enabled: true
        k8s:
          service:
            ports:
              - port: 15443
                targetPort: 15443
                name: tls
              - port: 15012
                targetPort: 15012
                name: tls-istiod
              - port: 15017
                targetPort: 15017
                name: tls-webhook
  values:
    gateways:
      istio-ingressgateway:
        env:
          ISTIO_META_ROUTER_MODE: "sni-dnat"
配置要点: 必须设置 ISTIO_META_ROUTER_MODE: "sni-dnat" 环境变量,使网关能够根据 SNI 信息进行智能路由。同时,每个集群的东西向网关需要暴露 15443 端口用于跨集群 mTLS 通信,15012 端口用于控制面同步,15017 端口用于 Webhook 回调。

4.2.3 跨集群证书信任配置

多主模式要求所有集群共享同一个根证书(Root CA),或者通过中间 CA 建立信任链。配置方式如下:

# 在集群 1 中创建 Secret,包含根证书和中间证书
kubectl create secret generic cacerts -n istio-system \
  --from-file=ca-cert.pem \
  --from-file=ca-key.pem \
  --from-file=root-cert.pem \
  --from-file=cert-chain.pem

# 在集群 2 中创建相同的 Secret(使用相同的根证书)
kubectl create secret generic cacerts -n istio-system \
  --from-file=ca-cert.pem \
  --from-file=ca-key.pem \
  --from-file=root-cert.pem \
  --from-file=cert-chain.pem

4.3 跨集群服务发现

在多主模式下,跨集群服务发现通过 ServiceEntry 和 Endpoint 自动同步 实现。Istio 提供了 istioctl create-remote-secret 命令,自动生成用于跨集群访问的 Secret,并在目标集群中创建对应的 ServiceEntry。

4.3.1 服务发现流程

  1. 生成远程 Secret:在集群 1 中执行 istioctl create-remote-secret --name=cluster-1,生成包含集群 1 访问信息的 Secret。
  2. 应用 Secret:将生成的 Secret 应用到集群 2 的 istio-system 命名空间中。
  3. 自动创建 ServiceEntry:集群 2 的 istiod 检测到 Secret 后,自动为集群 1 中的服务创建对应的 ServiceEntry 和 WorkloadEntry。
  4. 端点同步:集群 1 中的服务端点变化时,通过东西向网关实时同步到集群 2。

4.3.2 自动生成的 ServiceEntry 示例

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: mesh-expansion-cluster-1
  namespace: istio-system
spec:
  hosts:
  - "*.cluster-1.local"
  location: MESH_INTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  - number: 443
    name: https
    protocol: HTTPS
  resolution: DNS
  endpoints:
  - address: 192.168.1.100
    ports:
      http: 15443
      https: 15443
    labels:
      security.istio.io/tlsMode: istio
      topology.istio.io/network: network-1
注意事项: 自动生成的 ServiceEntry 默认使用 MESH_INTERNAL 位置,表示这些服务属于网格内部。如果集群之间的网络存在 NAT 或防火墙,需要手动调整 endpoints 中的地址为可路由的公网 IP。

4.3.3 多主模式 vs 其他模式对比

特性 多主模式 主从模式 外部控制面
控制面数量 每个集群独立 仅主集群有 独立部署
故障隔离 优秀(单集群故障不影响其他) 一般(主集群故障影响全局) 良好(控制面独立)
配置复杂度 中等 低 高
跨集群延迟 低(直连) 中(经主集群转发) 低(直连)
版本升级 独立升级 需协调主从 独立升级
适用场景 多团队、多区域生产 测试、小规模部署 混合云、边缘计算
跨集群服务发现流程 跨集群服务发现流程 集群 1 istiod Service A Pod East-West GW 集群 2 istiod Service B Pod East-West GW ① 生成 Remote Secret ② 应用 Secret ③ 创建 ServiceEntry ④ 端点同步

4.4 多主模式部署验证

部署完成后,可以通过以下命令验证多主模式的跨集群通信是否正常:

# 在集群 1 中验证能否解析集群 2 的服务
kubectl exec -it deploy/sleep -n default -- curl -s http://service-b.cluster-2.local:80

# 查看集群 1 中的 ServiceEntry 是否已自动创建
kubectl get serviceentry -n istio-system

# 验证东西向网关的 mTLS 连接状态
istioctl proxy-status -n istio-system

# 检查跨集群流量是否经过加密
kubectl logs -l app=istio-eastwestgateway -n istio-system -c istio-proxy | grep "mTLS"
生产建议: 多主模式推荐用于 3 个以上集群的部署场景。每个集群应部署在不同的可用区或区域,以实现地理级别的容灾。东西向网关建议使用独立的 LoadBalancer Service,并配置外部 DNS 记录,确保集群之间可以通过稳定的域名互相访问。