2. 集群(Cluster)概念与配置:Cluster定义、端点管理、负载均衡策略、健康检查机制

在 Envoy 的 xDS 动态配置体系中,Cluster 是流量调度的核心抽象。它定义了一组提供相同服务的上游主机(端点),并决定了 Envoy 如何将请求分发到这些主机上。本章将深入剖析 Cluster 的定义结构、端点管理机制、负载均衡策略以及健康检查的实现原理,为后续的集群升级治理与节点池巡检打下坚实基础。

2.1 Cluster 定义与核心字段

Cluster 在 Envoy 中通过 envoy/config/cluster/v3/cluster.proto 定义。一个完整的 Cluster 配置包含名称、连接类型、端点发现方式、负载均衡策略、健康检查配置等关键字段。以下是一个典型的 Cluster 配置示例:

{
  "name": "service-backend-cluster",
  "type": "EDS",                          // 端点发现类型
  "eds_cluster_config": {
    "eds_config": {
      "ads": {}                           // 通过 ADS 动态获取端点
    }
  },
  "connect_timeout": "0.25s",
  "lb_policy": "ROUND_ROBIN",            // 负载均衡策略
  "health_checks": [                      // 健康检查配置
    {
      "timeout": "1s",
      "interval": "5s",
      "unhealthy_threshold": 3,
      "healthy_threshold": 1,
      "http_health_check": {
        "path": "/healthz"
      }
    }
  ],
  "outlier_detection": {                  // 异常点检测
    "consecutive_5xx": 5,
    "interval": "10s",
    "base_ejection_time": "30s"
  }
}
关键字段说明:
  • type:端点发现方式,支持 STATIC(静态)、STRICT_DNS(严格DNS)、LOGICAL_DNS(逻辑DNS)、EDS(端点发现服务)和 ORIGINAL_DST(原始目标)。
  • lb_policy:负载均衡算法,决定请求如何分配到端点。
  • health_checks:主动健康检查配置,Envoy 定期探测端点健康状态。
  • outlier_detection:被动健康检查(异常点检测),基于实际请求成功率驱逐不健康端点。

2.2 端点(Endpoint)管理机制

端点是 Cluster 中实际处理请求的上游主机。Envoy 通过 LDS(监听器发现服务) 和 EDS(端点发现服务) 实现动态端点管理。端点管理涉及三个核心概念:LocalityLbEndpoints(本地负载均衡端点)、LbEndpoint(负载均衡端点)和 Endpoint(端点地址)。

端点管理层次结构:
  • ClusterLoadAssignment:EDS 返回的顶级资源,包含一个或多个 LocalityLbEndpoints。
  • LocalityLbEndpoints:按地域(region/zone/sub-zone)分组的端点集合,支持优先级和权重。
  • LbEndpoint:单个端点实例,包含地址、端口、健康状态(HEALTHY/UNHEALTHY)、元数据等。
  • Endpoint:底层地址信息,通常为 socket 地址(IP:Port)。
端点管理层次结构 ClusterLoadAssignment LocalityLbEndpoints region=us-east-1 LocalityLbEndpoints region=us-west-2 LocalityLbEndpoints region=eu-central-1 LbEndpoint health_status: HEALTHY LbEndpoint health_status: HEALTHY LbEndpoint health_status: UNHEALTHY Endpoint 10.0.1.5:8080 Endpoint 10.0.2.8:8080 Endpoint 10.0.3.2:8080 说明:EDS 返回 ClusterLoadAssignment,按地域分组为 LocalityLbEndpoints, 每个 LbEndpoint 包含健康状态和元数据,最终映射到具体的 Endpoint 地址。

2.3 负载均衡策略

Envoy 提供了多种负载均衡策略,以适应不同的流量分发需求。策略的选择直接影响请求的分布均匀性和服务响应时间。以下是 Envoy 支持的几种主要负载均衡策略:

策略名称 算法描述 适用场景 注意事项
ROUND_ROBIN 轮询选择端点,每个端点依次被选中 端点性能均匀、无状态服务 端点权重不同时需配合权重轮询
LEAST_REQUEST 选择当前活跃请求数最少的端点 请求处理时间差异大、长连接服务 需要维护活跃请求计数器
RING_HASH 一致性哈希,基于哈希环分配请求 会话保持、缓存亲和性 端点增减时影响最小
RANDOM 随机选择一个端点 测试环境、简单负载场景 分布不均匀概率较高
MAGLEV 改进的一致性哈希,负载分布更均匀 大规模集群、需要低偏差 计算开销略高于 RING_HASH
CLUSTER_PROVIDED 由集群自身提供负载均衡逻辑 自定义负载均衡器 需要实现 Envoy 的负载均衡接口
负载均衡策略选择建议:
  • 对于大多数微服务场景,LEAST_REQUEST 通常能提供比 ROUND_ROBIN 更好的尾部延迟表现。
  • 需要会话保持时,优先使用 RING_HASH 并配置合适的哈希策略(如基于 Header 或 Cookie)。
  • 在端点权重差异较大的场景下,Envoy 会自动根据权重调整轮询或最少请求的选择概率。

2.4 健康检查机制

Envoy 的健康检查机制分为 主动健康检查 和 被动健康检查(异常点检测) 两种。两者协同工作,确保流量只被分发到健康的上游端点。

2.4.1 主动健康检查

Envoy 定期向端点发送探测请求(HTTP、TCP、gRPC 等),根据响应判断端点健康状态。关键配置参数包括:

  • timeout:探测超时时间,超过此时间视为失败。
  • interval:探测间隔,两次探测之间的等待时间。
  • unhealthy_threshold:连续失败次数阈值,达到后标记为不健康。
  • healthy_threshold:连续成功次数阈值,达到后标记为健康。
  • http_health_check / tcp_health_check / grpc_health_check:探测类型。

2.4.2 被动健康检查(异常点检测)

异常点检测基于实际请求的响应状态进行被动判断,无需额外探测流量。当端点连续出现 5xx 错误、连接超时、拒绝连接等情况时,Envoy 会将其临时驱逐出负载均衡池。

健康检查与异常点检测流程 主动健康检查 发送 HTTP/TCP/gRPC 探测 连续成功 ≥ healthy_threshold 连续失败 ≥ unhealthy_threshold 标记为 HEALTHY 标记为 UNHEALTHY 被动健康检查(异常点检测) 监控实际请求的 5xx/超时/拒绝 连续错误 ≥ outlier_detection 阈值 临时驱逐(ejection) 驱逐超时后自动恢复 重新加入负载均衡池 协同工作
健康检查最佳实践:
  • 主动健康检查的 interval 不宜过短(建议 ≥ 1s),避免对端点造成不必要的探测压力。
  • 异常点检测的 base_ejection_time 应设置为合理的驱逐时长,通常为 30s~60s,避免频繁驱逐和恢复。
  • 在 Kubernetes 环境中,结合 Readiness Probe 和 Envoy 的健康检查,可以实现更精细的流量管理。
  • 对于 gRPC 服务,优先使用 gRPC Health Checking Protocol,减少协议转换开销。

2.5 集群升级治理中的配置要点

在集群升级治理场景中,Cluster 配置需要特别关注以下方面:

  • 端点平滑迁移:通过 EDS 动态更新端点列表,逐步替换旧版本端点,避免流量中断。
  • 负载均衡权重调整:在升级过程中,降低旧版本端点的权重,逐步将流量导向新版本。
  • 健康检查阈值调优:升级期间适当降低 unhealthy_threshold,加速不健康端点的剔除。
  • 异常点检测参数:设置合理的驱逐比例(max_ejection_percent),防止大规模驱逐导致容量不足。
节点池巡检与热更新实践: 在节点池巡检场景中,通过 EDS 动态下发端点健康状态和元数据,Envoy 可以实时感知节点池中每个节点的运行状况。结合 outlier_detection 的 success_rate_minimum_hosts 和 success_rate_request_volume 参数,可以更精确地识别异常节点,实现热更新过程中的自动驱逐与恢复。