【Linkerd】ServiceProfile:L7 路由、重试与 sp-validator

💡 原文中文,约5100字,阅读约需12分钟。
📝

内容提要

本文介绍Linkerd 2.20中ServiceProfile的L7流量管理机制。ServiceProfile CRD定义路由、重试和超时,由destination控制器通过GetProfile流推送至数据面。sp-validator webhook负责写入前校验,失败时直接拒绝。与Gateway API分工:SP用于网格内路由,GAPI用于南北向。排障时需区分写入失败(validator)、行为失败(Get vs GetProfile)和策略拒绝(403)。

🔎

延伸解读

三轴排障:先分清写入、行为与策略

文章强调,ServiceProfile 相关故障需按三轴区分:写入失败由 sp-validator 拒绝,表现为 apply 直接报错;行为失败需检查 Get 与 GetProfile 流,如重试不生效可能因 is_retryable 未设置或 retry_budget 耗尽;403 则属于策略轴,与 SP 无关。避免将不同轴的证据混为一谈。

SP 与 Gateway API 的分工边界

ServiceProfile 用于网格内 L7 路由、重试和超时,而 Gateway API 主要处理南北向流量。两者控制面入口不同:SP 经 sp-validator 校验,GAPI 经 policy-validator。若同一 Service 上规则冲突,优先级未定,需以官方文档为准。选型时可将 GAPI 视为边界扩展,SP 作为网格内经典配置。

重试与超时配置的常见误区

重试不生效常被误判为发现问题,实际需检查路由的 is_retryable 标记及 retry_budget 是否耗尽。超时与预期不符时,应核对 route 的 timeout 字段,而非臆测 Service 注解。这些 L7 行为由 GetProfile 流推送,与 Get 流(发现)和策略流(403)相互独立。

Q&A

Linkerd 2.20 中 ServiceProfile 的作用是什么?

ServiceProfile 是 Linkerd 原生的 L7 流量描述,绑定到某个 Service(按 FQDN),定义 routes、retryBudget、dstOverrides 等,用于按路径路由、重试、超时和失败分类。数据面不直接读 CRD,而是由 destination 控制器 watch ServiceProfile,翻译成 DestinationProfile 消息经 GetProfile 流推送。

sp-validator 在 Linkerd 中负责什么?校验失败时会发生什么?

sp-validator 是 destination Pod 内的一个容器,注册为 ValidatingWebhookConfiguration,拦截 linkerd.io serviceprofiles 的 CREATE/UPDATE,在写入 API server 前进行语法和语义校验。校验失败时,kubectl apply 会直接报错,数据面从未见过该 profile,因此不会出现“路由不命中”的情况。

ServiceProfile 与 Gateway API 在 Linkerd 中的分工是什么?

ServiceProfile 主要用于网格内(mesh 内)的 L7 路由、重试和超时,控制面入口是 linkerd.io ServiceProfile,校验 webhook 是 sp-validator,数据面下发走 GetProfile 流。Gateway API(如 HTTPRoute)主要用于南北向流量和 GAPI 生态互操作,控制面入口是 gateway.networking.k8s.io 和 policy.linkerd.io HTTPRoute,校验 webhook 是 policy-validator,数据面下发经 policy-controller 编译后汇入 proxy 策略/profile 链。

在 Linkerd 中,重试不生效可能的原因有哪些?

重试不生效可能的原因包括:ServiceProfile 未正确加载(如 CRD 未同名、watcher 未收到、validator 曾拒绝)、路由的 is_retryable 未设置、retry_budget 耗尽(如 retry_ratio、min_retries_per_second、ttl 配置不当)。需要检查 L7 轴(GetProfile 流)而非发现轴或策略轴。

Linkerd 中 ServiceProfile 的 dstOverrides 字段有什么作用?

dstOverrides 用于将请求按权重拆分到多个 authority,每个 authority 会触发独立的 destination.Get 调用,与 per-target 模型衔接。如果拆分配置错误,可能表现为部分后端永远无流量,而不是单条 route 正则错误。

如何区分 ServiceProfile 写入失败和行为失败?

写入失败指 sp-validator 在 CRD 写入 API server 前拒绝,kubectl apply 直接报错,此时数据面从未见过该 profile。行为失败指 profile 已成功写入并加载,但运行时行为不符合预期,如路由不匹配、重试不生效等,此时应检查 GetProfile 流内容、ProfileWatcher 是否收到、命名是否对齐等。

🏷️

标签

➡️

继续阅读