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的跨集群同步,使每个集群都能感知到其他集群的服务实例。
关键优势: 多主模式消除了单点故障,任一集群的控制面故障不会影响其他集群的正常运行;同时支持独立的版本升级与灰度发布,适合大规模、多团队的生产环境。
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 服务发现流程
- 生成远程 Secret:在集群 1 中执行
istioctl create-remote-secret --name=cluster-1,生成包含集群 1 访问信息的 Secret。 - 应用 Secret:将生成的 Secret 应用到集群 2 的
istio-system命名空间中。 - 自动创建 ServiceEntry:集群 2 的 istiod 检测到 Secret 后,自动为集群 1 中的服务创建对应的
ServiceEntry和WorkloadEntry。 - 端点同步:集群 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 其他模式对比
| 特性 | 多主模式 | 主从模式 | 外部控制面 |
|---|---|---|---|
| 控制面数量 | 每个集群独立 | 仅主集群有 | 独立部署 |
| 故障隔离 | 优秀(单集群故障不影响其他) | 一般(主集群故障影响全局) | 良好(控制面独立) |
| 配置复杂度 | 中等 | 低 | 高 |
| 跨集群延迟 | 低(直连) | 中(经主集群转发) | 低(直连) |
| 版本升级 | 独立升级 | 需协调主从 | 独立升级 |
| 适用场景 | 多团队、多区域生产 | 测试、小规模部署 | 混合云、边缘计算 |
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 记录,确保集群之间可以通过稳定的域名互相访问。