土法炼钢 · 系统与基础设施

【Linkerd】linkerd2-proxy 数据面:入站、出站与限流感知负载均衡

文章导航

分类入口
kubernetesnetwork
标签入口
#linkerd#linkerd2-proxy#dataplane#ewma#load-balancing#rate-limit#protocol-detection#v2.20

目录

第 9 篇 把 ServiceProfile 与 destination 合流钉在 L7 轴。第 6 篇 已说明控制面经 destination.Get() / identity CSR 与代理对话。本篇落到 linkerd2-proxy 本身:一次 TCP 连接如何在入站/出站链上被探测、鉴权、路由与选端点。

常见误区有三:把 proxy 当成「另一个 Envoy」去查 Listener/Cluster;把 EWMA 当成可随意换的 round-robin;把 HTTP 429 当成「成功响应」却不理解 2.20 Load Biaser 为何要注入惩罚延迟。排障时数据面症状落在五轴轴 5——但轴 1–4 未否证前不要先改负载均衡注解。

本篇在系列中的位置

篇目 核心内容
第 9 篇 · ServiceProfile L7 路由/重试/超时进入 destination
第 10 篇 · linkerd2-proxy 数据面 协议探测、入站/出站链、EWMA 与 2.20 Load Biaser
第 11 篇 · Gateway API 与多集群 GAPI 1.5.1 门与南北向分工
系列目录 全部篇目

版本锚定:Linkerd 2.20(源码 tag version-2.20;公告 2026-06-23)。负载均衡与 Load Biaser 注解以 Load Balancing 参考文档为准。无真实集群则不粘贴伪造 proxy metrics / curl 延迟榜。


一、协议探测

linkerd2-proxy 在 accept 后先做协议探测(protocol detection),决定走 HTTP 语义还是 opaque TCP 直通。这与 Envoy HCM 里显式 filter_chains / codec_type 的配置模型不同:Linkerd 侧更少 CRD→xDS 翻译层,更多在数据面按字节流推断。

探测结果 典型处理 与策略/L7 的关系
HTTP/1.x 或 HTTP/2 解析 :authority / Host、方法、路径;可走 ServiceProfile / GAPI 路由 轴 4(策略与 L7)
非 HTTP(opaque) 按 Service 端口与 opaquePorts 等配置直通或受限转发 轴 1(opaque/inbound 端口,见第 3 篇
TLS(对端发起) 与 identity 签发的工作负载证书、mTLS 握手链合流 轴 2

探测失败或与应用实际协议不一致时,表象常是「连得上但路由不命中」或「metrics 里没有 route 维度」——先核对端口是否被标为 opaque,而不是先改 ServiceProfile。

学术谱系上,sidecar 内嵌微代理承接 L7 语义,延续 Burns & Beda Designing Distributed Systems 的 sidecar 模式;Linkerd 选择专用 Rust 代理而非通用 Envoy,设计动机见官方 Why Linkerd Doesn’t Use Envoy(B 级叙述,机制仍以 linkerd2-proxy 源码与架构文档为 A 级)。


二、入站/出站处理链

一次 meshed 调用可拆成出站(outbound)入站(inbound)两条链,均发生在同一 linkerd2-proxy 进程内,但监听与策略求值点不同。

flowchart LR
  app_out["App outbound syscall"]
  ob_proxy["proxy outbound listener"]
  dest_rpc["destination.Get stream"]
  peer_in["peer proxy inbound"]
  ob_proxy --> dest_rpc
  ob_proxy -->|"mTLS"| peer_in
  peer_in --> app_in["App inbound port"]

出站链(本 Pod 发起)

  1. 应用流量经 iptables/CNI 或 native sidecar 重定向进入 proxy 出站监听器(轴 1,第 3 篇)。
  2. proxy 向 destination 订阅按目标Get() 流,拿到端点列表、identity 提示、策略与 ServiceProfile 派生路由(轴 3–4,第 5–7 篇)。
  3. 选定端点后发起 mTLS(轴 2);HTTP 层应用超时/重试(若 ServiceProfile 或 GAPI 已配置)。

入站链(本 Pod 接收)

  1. 对端 proxy 的 mTLS 连接进入 inbound listener。
  2. 策略容器求值结果经 destination 下发:Server / AuthorizationPolicy / MeshTLSAuthentication(第 8 篇)。
  3. 通过后转发到应用容器目标端口;入站 metrics 在 2.20 有增强(公告节),本篇不写未核对的指标名列表。

与控制面的分界:proxy watch Kubernetes API;端点与策略陈旧、空流、拒绝等多半落在轴 3–4,而非「proxy 坏了」。502/超时在轴 5 否证前,应先确认 destination 流与 identity 证书(轴 2–3)。


三、负载均衡

出站选端点默认使用 EWMA(exponentially-weighted moving average):按各后端近期延迟加权,倾向更快实例,并对慢端点降权。官方文档写明:典型部署无需额外调参即可工作。

概念 机制 排障含义
EWMA 滑动窗口内延迟指数加权 突发慢实例会被降权,非严格 round-robin
端点池 来自 destination 流的富化 EndpointSlice 池空 → 先查轴 3,不是 LB 算法
熔断 / 摘除 与失败率、超时等配合(HAZL 等路径见 tag 文档) 与 2.20 rate-limit 感知扩展正交

争论点(工程而非论文排名):自适应 LB 在尾延迟友好与可预测性之间取舍——EWMA 对慢端点敏感,但在全体端点同时过载时仍可能放大热点;rate-limit 响应因「返回极快」在纯 EWMA 下反而可能吸引更多流量(见下一节官方文档对反馈环的说明)。这是 2.20 引入 Load Biaser 的直接动机,不是未测的「更快百分之几」。


四、2.20 rate-limit-aware LB(机制,非 benchmark)

2.20 起,EWMA 可选配 Load Biaser:当后端用 HTTP 429 或 gRPC RESOURCE_EXHAUSTED 显式表达过载时,proxy 把这些响应视为负载信号,向 EWMA 注入可配置惩罚延迟,并把 Retry-After 等 pushback 提示纳入上界。

启用方式(Service 注解,Load Balancing 文档):

注解 含义
balancer.alpha.linkerd.io/penalize-failures 为该 Service 启用 Load Biaser;默认 false
balancer.alpha.linkerd.io/load-biaser-penalty 对限流/失败响应注入的延迟惩罚;默认 5s
balancer.alpha.linkerd.io/load-biaser-max-retry-after 接受的 Retry-After 上限;默认 300s

机制链(不写本站 benchmark):

  1. 未启用时,429/RESOURCE_EXHAUSTED 在 LB 视角仍可能像「快速成功」,EWMA 反而抬高其权重 → 客户端看到限流风暴。
  2. 启用后,惩罚项进入 EWMA,流量迁向未限流实例;与熔断/摘除逻辑在 2.20 公告中一并叙述为「限流感知」。
  3. 限流可能来自上游 API,也可能来自 Linkerd 自身 rate limit 策略——Biaser 不区分来源,只认响应码语义。

开放问题:惩罚默认值是否应在不同 SLO 下统一;与 ServiceProfile 重试叠加时的风暴行为——需结合 workload 在变更单里写明注解开关,系列第 16 篇回收选型语境。


五、与 Envoy 边界(外链)

维度 linkerd2-proxy(本系列) Envoy(envoy/ 系列)
配置来源 destination/identity 专用 gRPC API xDS(LDS/CDS/EDS/RDS/SDS…)
扩展模型 Rust 内建栈;非 Wasm/HTTP filter 生态 Filter chain / HCM / network filter 组合
排障坐标 五轴 + per-target 流(第 13 篇 Listener/Cluster warming、xDS NACK(istio-xds/15
负载均衡 EWMA + 可选 Load Biaser 多种 LB 策略 + outlier detection 等

不要混读:在 Linkerd 集群里查不到 Envoy 的 cluster warming;在 Istio+Envoy 里也没有 destination.Get() 流。数据面实现对照见 istio-xds/14,本篇不展开 Envoy Filter 全书。

下一篇谈 Gateway API 1.5.1 门与 mesh 路由相对 Envoy Gateway 南北向分工。


参考资料

规范 / 官方文档(A/B)

论文 / 设计谱系

本系列


上一篇ServiceProfile

下一篇Gateway API 与多集群

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。


By .