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)。
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 会将其临时驱逐出负载均衡池。
- 主动健康检查的 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),防止大规模驱逐导致容量不足。