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 如何连接两个集群中的存储组件:

Istio 多集群存储互联架构 集群 A(生产主) 存储控制器 (CSI Controller) 数据节点 (NFS Gateway) Envoy Sidecar(mTLS + 流量策略) 集群 B(灾备/只读) 存储代理 (Replication Agent) 数据节点 (Read Replica) Envoy Sidecar(mTLS + 流量策略) mTLS 隧道 Istio 控制面(跨集群共享 / 联邦) Pilot · Citadel · Galley · 全局服务注册表 说明:存储控制器与数据节点通过 Envoy Sidecar 建立 mTLS 隧道,控制面统一管理跨集群服务发现与流量路由。 存储 I/O 流量始终在 Sidecar 之间直连,不经过控制面,避免性能瓶颈。

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 的存储网关:

跨集群存储服务发现流程(Istio ServiceEntry) ① 存储控制器 发起 DNS 查询 ② Istio Sidecar 拦截 DNS 请求 ③ 匹配 ServiceEntry 返回远端端点 IP ④ 建立 mTLS 连接 到远端 Pod IP ⑤ 存储 I/O 直连 NFS / S3 / RBD 说明:整个发现过程在 Sidecar 层面完成,存储控制器无需感知远端集群的 DNS 后缀或网络拓扑。 DNS 查询延迟通常 < 5ms(Sidecar 本地缓存),连接建立后存储 I/O 走直连隧道,不经过 DNS。

3.6 网络连通性验证清单

在部署多集群存储前,建议按以下清单逐项验证网络基础:

  1. Pod 到 Pod 连通性: 使用 kubectl exec 在集群 A 的存储 Pod 中 ping 集群 B 的存储 Pod IP,确认 ICMP 可达。
  2. 端口可达性: 使用 nc -zv <远端IP> <端口> 验证 NFS(2049)、S3(8080)、RBD(6789) 等存储端口开放。
  3. MTU 测试: 使用 ping -M do -s 1472 <远端IP> 测试端到端 MTU,确保不低于 1400。
  4. 延迟基准: 使用 ping -c 100 <远端IP> 记录平均延迟与丢包率,同步复制场景要求延迟 < 10ms,丢包率 < 0.1%。
  5. mTLS 握手验证: 在 Istio Sidecar 日志中搜索 mTLS handshake completed,确认跨集群连接已加密。
  6. DNS 解析测试: 在存储 Pod 内执行 nslookup remote-storage.primary.svc.cluster-b.local,确认返回正确的远端端点 IP。
生产级建议: 对于跨地域(跨数据中心)的多集群存储,务必部署 专用网络监控探针(如 Blackbox Exporter + Prometheus),持续监控集群间延迟、丢包和 DNS 解析成功率。设置告警阈值:延迟 > 20ms 触发警告,> 50ms 触发严重告警。