集群简介
Cluster 是 Envoy 的核心概念之一,代表了后端服务的一个集合,用来路由出站请求。这个概念在负载均衡、服务发现和故障处理中扮演了关键角色。
Cluster 的定义与功能
Cluster 是 Envoy 配置中定义的逻辑服务端点的集合。每个 Cluster 包含了一组逻辑上相似的服务实例,这些服务实例能够处理相同类型的请求。Envoy 将请求路由到这些实例,通常基于配置的负载均衡策略。
服务发现类型
Envoy 支持多种服务发现机制,适用于不同规模和动态性的后端服务:
- STATIC:静态配置 IP/端口,适合后端实例固定的小型场景。
- STRICT_DNS:定期异步解析 DNS,适合实例经常变动、支持 DNS 解析的服务。
- LOGICAL_DNS:只在新建连接时解析 DNS,适合大规模 Web 服务,减少连接池抖动。
- EDS(Endpoint Discovery Service):通过 xDS 动态下发端点,适合大规模、动态编排环境。
- ORIGINAL_DST:用于透明代理场景,直接转发到原始目的地址。
工程实践建议:小规模可用 STATIC,云原生/容器环境推荐 EDS,动态 DNS 推荐 STRICT_DNS。
健康检查与异常检测
- 主动健康检查:定期向后端实例发送 HTTP/TCP/gRPC/Redis 检查请求,判定健康状态。
- 被动健康检查(异常检测):通过 outlier detection 机制,自动剔除响应异常的实例。
典型配置片段:
health_checks:
- timeout: 1s
interval: 5s
unhealthy_threshold: 3
healthy_threshold: 2
http_health_check:
path: "/healthz"
熔断与流量控制
- 熔断(Circuit Breaker):限制最大连接数、请求数、重试数等,防止后端雪崩。
- 连接池化:提升高并发下的连接复用效率。
- 超时与重试:可配置请求超时和自动重试,增强健壮性。
熔断配置示例:
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 1000
max_requests: 2000
max_pending_requests: 100
max_retries: 3
负载均衡策略
Envoy 支持多种负载均衡算法,满足不同业务需求:
- 轮询(ROUND_ROBIN):默认,适合大多数场景。
- 最少请求(LEAST_REQUEST):优先分配给当前负载低的实例。
- 一致性哈希(RING_HASH/MAGLEV):适合会话保持、缓存等场景。
- 随机(RANDOM):简单高效,适合无状态服务。
负载均衡配置示例:
lb_policy: LEAST_REQUEST
高级特性与工程价值
- 子集选择:基于元数据实现灰度发布、版本路由等。
- 连接预热:集群初始化时预热连接,提升冷启动性能。
- 流量镜像与速率限制:支持流量复制和限流,便于测试和防护。
动态能力
通过 xDS API(如 CDS/EDS),可实现集群和端点的动态增删改查,无需重启。
工程实践建议:合理配置健康检查、熔断和负载均衡策略,是保障微服务系统高可用和弹性的关键。