3、多集群网络基础:集群间网络连通性要求、服务网格(Istio)在多集群存储中的作用、DNS与跨集群服务发现
3.1 多集群网络连通性核心要求
多集群存储架构的首要前提是建立可靠、低延迟、高吞吐的集群间网络。不同于单集群内部扁平化的 Pod 网络,跨集群通信面临 NAT、防火墙、非扁平网络拓扑等挑战。以下表格总结了多集群网络连通性的关键维度与最低要求:
| 维度 | 要求 | 典型方案 |
|---|---|---|
| 控制面互通 | Kube-API Server 端点之间 TCP 443 可达,用于联邦控制、资源同步 | VPN / 专线 / 公网 TLS |
| 数据面互通 | 存储节点(CSI Driver、NFS/S3 网关)之间 TCP/UDP 端口开放,延迟 < 10ms(同步复制)或 < 50ms(异步复制) | Direct Peering / 服务网格隧道 |
| Pod CIDR 不重叠 | 各集群的 Pod 与 Service CIDR 必须唯一,避免路由冲突 | 规划时分配独立 CIDR 段 |
| MTU 一致性 | 端到端 MTU ≥ 1400(考虑隧道封装开销),防止分片导致性能下降 | 调整 CNI 与底层网络 MTU |
| 安全隔离 | 集群间流量必须加密(mTLS / WireGuard),存储凭证不得明文穿越公网 | Istio mTLS / Cilium 加密 |
关键原则: 多集群存储网络应优先采用 东西向扁平互联 模式,避免通过中心代理转发存储 I/O 流量。每增加一跳代理,延迟增加 1-3ms,对于同步复制场景(如 RBD Mirroring)可能直接导致超时。
3.2 服务网格(Istio)在多集群存储中的角色
Istio 在多集群存储架构中承担 安全隧道、流量治理 与 可观测性 三重职责。下图展示了 Istio 如何连接两个集群中的存储组件:
3.3 Istio 在存储场景中的关键能力
- mTLS 自动加密: 存储控制器与数据节点之间的所有跨集群流量自动启用双向 TLS,无需在应用层配置证书。对于 RBD 镜像、NFS 挂载、S3 网关同步等敏感操作,mTLS 提供传输层零信任安全。
- 流量分割与故障转移: 通过 VirtualService 定义存储请求的权重路由。例如,80% 的读请求发往本地集群,20% 发往远端灾备集群;当本地存储节点故障时,自动 100% 切换至远端。
- 细粒度访问控制: 使用 AuthorizationPolicy 限制只有特定 ServiceAccount(如
csi-controller、replication-agent)才能访问跨集群存储端点,防止非存储组件滥用网络。 - 统一可观测性: 所有跨集群存储 I/O 请求自动生成分布式追踪(Jaeger/Zipkin),帮助定位延迟瓶颈。例如,区分“网络延迟”与“存储后端处理延迟”。
实践建议: 在 Istio 多集群存储部署中,建议将存储组件的 Sidecar 注入策略设为
DISABLED 并手动注入,避免自动注入导致存储 DaemonSet 重启顺序异常。同时,为存储命名空间设置 traffic.sidecar.istio.io/includeOutboundIPRanges: "0.0.0.0/0" 以确保所有跨集群流量都经过 Sidecar。
3.4 DNS 与跨集群服务发现
多集群存储依赖 全局 DNS 解析 实现存储端点的动态发现。Kubernetes 原生 DNS(CoreDNS)仅感知单集群,跨集群场景需要额外方案。下表对比了三种主流跨集群服务发现模式:
| 方案 | 原理 | 存储适用性 | 延迟 |
|---|---|---|---|
| Istio ServiceEntry + WorkloadEntry | 手动或自动将远端集群的 Service 注册为本地 ServiceEntry,DNS 解析由 Istio 代理完成 | 高(支持 TCP/UDP,与 mTLS 原生集成) | 低(本地 Sidecar 缓存) |
| CoreDNS Federation (k8s.io/dns) | 通过 CoreDNS 插件 k8s_external 或 federation 将远端集群的 Service 记录同步到本地 DNS |
中(仅支持 Service 名称,不支持端点级路由) | 中(依赖 DNS 缓存 TTL) |
| ExternalDNS + 全局 DNS 提供商 | 将集群 Service 的 DNS 记录同步到公有 DNS(如 Route53),客户端通过标准 DNS 解析 | 低(DNS 传播延迟高,不适合同步复制场景) | 高(秒级传播) |
对于存储场景,Istio ServiceEntry 模式 是最佳选择。以下是一个典型的跨集群存储服务发现配置示例:
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: remote-storage-gateway
namespace: storage-system
spec:
hosts:
- remote-storage.primary.svc.cluster-b.local
addresses:
- 10.200.1.100 # 远端集群 Service ClusterIP
ports:
- number: 2049
name: nfs
protocol: TCP
- number: 8080
name: s3-api
protocol: TCP
location: MESH_INTERNAL
resolution: DNS
endpoints:
- address: 192.168.10.50 # 远端集群 Pod IP
ports:
nfs: 2049
s3-api: 8080
labels:
cluster: cluster-b
role: storage-gateway
注意: 跨集群 DNS 解析必须考虑 缓存一致性。存储控制器通常使用长连接(如 NFS mount、RBD map),DNS 变更不会立即生效。建议在存储组件中配置
ndots:5 和 single-request-reopen 选项,避免 DNS 解析超时导致挂载失败。
3.5 跨集群服务发现流程(Istio 模式)
下图展示了存储控制器在集群 A 中如何通过 Istio 服务发现找到集群 B 的存储网关:
3.6 网络连通性验证清单
在部署多集群存储前,建议按以下清单逐项验证网络基础:
- Pod 到 Pod 连通性: 使用
kubectl exec在集群 A 的存储 Pod 中 ping 集群 B 的存储 Pod IP,确认 ICMP 可达。 - 端口可达性: 使用
nc -zv <远端IP> <端口>验证 NFS(2049)、S3(8080)、RBD(6789) 等存储端口开放。 - MTU 测试: 使用
ping -M do -s 1472 <远端IP>测试端到端 MTU,确保不低于 1400。 - 延迟基准: 使用
ping -c 100 <远端IP>记录平均延迟与丢包率,同步复制场景要求延迟 < 10ms,丢包率 < 0.1%。 - mTLS 握手验证: 在 Istio Sidecar 日志中搜索
mTLS handshake completed,确认跨集群连接已加密。 - DNS 解析测试: 在存储 Pod 内执行
nslookup remote-storage.primary.svc.cluster-b.local,确认返回正确的远端端点 IP。
生产级建议: 对于跨地域(跨数据中心)的多集群存储,务必部署 专用网络监控探针(如 Blackbox Exporter + Prometheus),持续监控集群间延迟、丢包和 DNS 解析成功率。设置告警阈值:延迟 > 20ms 触发警告,> 50ms 触发严重告警。