【Envoy 数据面】Cluster 与负载均衡:优先级、Locality、Subset 与健康检查入口
内容提要
Envoy中Cluster是上游逻辑分组,路由选定名字后,主机选择按优先级、本地性、子集和负载均衡算法逐层收窄。优先级用超额配置健康分数渗漏流量,子集依赖元数据匹配,错误回退会伪装成无上游。选中主机后,连接池、熔断和异常检测决定是否返回503。
延伸解读
优先级渗漏的数学假设与容量陷阱
Envoy 的优先级流量渗漏基于一个关键假设:满健康的下一档能接住上一档的全部负载。若 P=0 有 10 台而 P=1 只有 2 台,当 P=0 健康比例低于约 72% 时,流量开始向 P=1 溢出,但 P=1 容量可能不足,导致整体容量不够时按比例分配,而非直接 503。排障时需先确认各优先级的主机数量与健康状态,避免误判为负载均衡算法问题。
子集误配的隐蔽失败模式
子集负载均衡依赖端点元数据与路由 metadata_match 的精确匹配。若路由携带 version=canary,但 selector 未声明 version 键,或 EDS 未打 metadata,请求会落入 fallback。若 fallback 为 NO_FALLBACK,则表现为 no healthy upstream,而 RDS/CDS 配置看似正确。加权集群中,metadata_match 会与路由级条件合并,加权侧覆盖同名键,只改路由级 metadata 而不改权重项,可能导致流量仍匹配 prod
健康检查与异常检测的协同
负载均衡只在当前健康集合上选择主机。主动健康检查(HC)改变主机的健康状态与权重,从而影响优先级健康分数和候选集;异常检测(outlier)则被动地从集合中临时摘除失败主机。未配置主动 HC 时,不要假设挂掉的进程会被自动踢出,除非 outlier 或 EDS health_status 介入。排障时应将 HC 状态、outlier 驱逐和熔断拒请求分开看待。
Q&A
Envoy中Cluster是什么?它包含哪些配置?
Cluster是Envoy中上游服务的逻辑分组,包含协议选项、负载均衡策略、熔断阈值、异常检测、健康检查以及Endpoint列表。
Envoy主机选择的过程是怎样的?
主机选择是一个逐层收窄的过程:优先级(Priority)→ 本地性(Locality)→ 子集(Subset)→ 负载均衡算法。
Envoy优先级负载均衡中,overprovisioning factor默认值是多少?流量如何渗漏?
默认overprovisioning factor为1.4。当高优先级健康比例低于约72%时,流量开始向低优先级溢出。例如,50%健康时约70%流量留在P=0,30%到P=1。
Envoy中Locality权重和优先级渗漏有什么关系?
Locality权重与优先级渗漏是正交的:优先级决定流量是否离开高优先级,Locality决定在同一优先级内如何按区域分配。
Envoy支持哪些负载均衡策略?各自有什么特点?
支持加权轮询、最少请求(P2C)、环哈希、Maglev和随机。最少请求等权时用P2C,不等权时用动态有效权重;环哈希是Ketama风格一致哈希;Maglev是固定表一致哈希,构建/查找更快但主机变更时扰动通常大于环哈希;随机在无主动健康检查时往往优于朴素轮询。
Envoy子集负载均衡如何工作?有哪些回退策略?
子集负载均衡通过端点元数据(envoy.lb命名空间)将主机分组,路由通过metadata_match精确匹配子集。回退策略有NO_FALLBACK(默认,无匹配时视同无主机)、ANY_ENDPOINT(忽略元数据在全集群上LB)和DEFAULT_SUBSET(落到默认元数据集合)。
子集误配会导致什么现象?如何排查?
子集误配(如元数据不匹配或selector键缺失)可能导致请求落入fallback,若为NO_FALLBACK则表现为无健康上游。排查时需检查EDS中主机元数据与路由metadata_match是否匹配,以及selector键是否声明。
Envoy中主动健康检查和异常检测有什么区别?
主动健康检查是主动探活,可改变健康集合和权重;异常检测是被动驱逐,根据失败/延迟等将主机临时移出LB集合。二者可同时启用,成功主动检查默认可uneject。