3. 多集群网络基础:集群间网络连通性要求、DNS解析、TLS/mTLS证书信任链

在构建跨集群Envoy流量调度体系之前,必须夯实多集群网络的基础设施。本章聚焦三个核心维度:网络连通性(L3/L4可达性)、DNS解析(服务发现与域名路由)以及TLS/mTLS证书信任链(身份验证与加密通信)。任何一层的缺失或配置错误,都会直接导致Envoy跨集群调度失败或性能劣化。

3.1 集群间网络连通性要求

Envoy实例之间、Envoy与控制平面(如Istiod)之间、以及跨集群的服务Pod之间,必须满足严格的网络连通性条件。以下表格总结了关键连通性需求:

通信方向 协议 端口 用途 连通性要求
Envoy → 远端Envoy TCP / HTTP / gRPC 自定义(如80, 443, 8080) 跨集群业务流量转发 双向可达,延迟稳定,MTU一致
Envoy → 远端控制面 gRPC / XDS 15012 (Istiod) 拉取端点发现、监听器、路由配置 必须可达,支持长连接
控制面 → 远端控制面 gRPC / TCP 15012 / 15014 多集群服务发现同步(如Istio Mesh Expansion) 跨集群网络扁平或通过VPN/专线
Sidecar → 本地控制面 gRPC / XDS 15012 本地配置下发 本地集群内可达
常见陷阱: 跨集群网络未开启IP转发或存在对称NAT,导致Envoy主动建立的gRPC长连接被中间防火墙中断。建议使用WireGuard或Cilium ClusterMesh建立扁平Overlay网络,避免NAT穿透问题。

3.2 DNS解析:跨集群服务发现的核心

Envoy通过DNS解析获取上游集群的端点IP。在多集群场景下,DNS解析面临两个关键挑战:全局唯一域名与跨集群DNS可达性。

3.2.1 DNS解析模式对比

模式 实现方式 适用场景 延迟 一致性
全局DNS(ExternalDNS + CoreDNS) 每个集群注册Service到全局DNS 跨云、跨地域 中等(依赖TTL) 最终一致性
Istio ServiceEntry + DNS代理 Envoy代理DNS请求,返回虚拟IP 同城多活、Mesh内 低(本地缓存) 强一致性(控制面驱动)
Kubernetes联邦DNS kube-dns跨集群同步 传统联邦架构 高(同步延迟) 最终一致性

3.2.2 DNS解析故障排查清单

  • 检查DNS记录是否存在: dig @<dns-server> <service>.<namespace>.svc.cluster.local
  • 验证Envoy DNS缓存: Envoy默认使用c-ares库,可通过config_dump查看DNS解析状态。
  • 确认跨集群DNS转发: 确保CoreDNS配置了forward . <peer-cluster-dns>规则。
  • TTL设置: 跨集群场景建议TTL设置为30-60秒,平衡收敛速度与DNS服务器压力。
最佳实践: 在Istio多集群部署中,优先使用ServiceEntry + WorkloadEntry方式定义跨集群服务,并启用DNS代理(meshConfig.defaultConfig.proxyMetadata.DNS_PROXY_ENABLE: "true"),让Envoy直接响应DNS查询,减少对全局DNS的依赖。

3.3 TLS/mTLS证书信任链

跨集群通信必须建立双向身份验证。Envoy支持上游TLS上下文和下游TLS上下文配置。在多集群场景下,证书信任链的设计直接影响安全性与性能。

3.3.1 证书信任链架构

下图展示了跨集群mTLS通信的证书信任链结构:

跨集群mTLS证书信任链 根CA (Root CA) 集群A 中间CA 集群B 中间CA Envoy A 证书 Envoy B 证书 mTLS 双向验证 说明:每个集群拥有独立的中间CA,由全局根CA签发。Envoy实例持有由本地中间CA签发的证书。 mTLS握手时,双方交换证书,并分别验证对方证书链是否可追溯到同一根CA。

3.3.2 证书信任链配置要点

  • 统一根CA: 所有集群必须信任同一个根CA,否则mTLS握手将失败。
  • 中间CA隔离: 每个集群使用独立的中间CA,便于证书吊销和集群级安全策略。
  • 证书轮换: Envoy支持自动证书轮换(通过SDS),轮换周期建议设置为24小时。
  • SAN(Subject Alternative Name): 证书中必须包含Envoy实例的SPIFFE ID(如spiffe://cluster.local/ns/<ns>/sa/<sa>),用于身份验证。

3.3.3 mTLS性能影响与优化

因素 影响 优化建议
握手延迟 每次新连接增加1-3 RTT 启用TLS会话复用(Session Resumption)
证书链长度 每增加一级CA,握手数据量增加约1KB 使用2级CA(根CA + 中间CA),避免超过3级
加密算法 ECDHE比DHE快3-5倍 优先使用ECDHE-RSA-AES256-GCM-SHA384
SDS轮换频率 频繁轮换增加控制面负载 轮换周期设为24小时,并启用证书缓存
性能调优提示: 在Envoy的tls_context中设置common_tls_context.alpn_protocols: ["h2", "http/1.1"],优先使用HTTP/2连接,减少TLS握手次数。同时启用session_ticket_keys实现无状态会话恢复。

3.4 综合故障排查流程

当跨集群Envoy流量调度出现问题时,建议按以下步骤排查:

  1. 验证网络连通性: 使用ping、telnet或nc测试Envoy Pod之间的端口可达性。
  2. 检查DNS解析: 在Envoy Pod内执行nslookup <service>.<namespace>.svc.cluster.local,确认返回正确的远端ClusterIP。
  3. 验证TLS证书: 使用openssl s_client -connect <remote-envoy>:443 -showcerts检查证书链是否完整。
  4. 查看Envoy日志: 搜索SSL error、connection failure、dns resolve等关键字。
  5. 确认控制面同步: 检查Istiod日志,确认跨集群Endpoint是否已正确推送至Envoy。
关键提醒: 证书信任链断裂是跨集群通信中最隐蔽的故障。如果Envoy日志中出现TLS error: certificate verify failed,请立即检查根CA是否一致、中间CA是否被正确签发、以及SAN是否匹配Envoy的SPIFFE ID。