【Linkerd】linkerd2-proxy-api:专用 gRPC 与 xDS 寻址差
内容提要
本文介绍Linkerd 2.20控制面与linkerd2-proxy间的四套gRPC API:destination、identity、inbound和tap。与istiod/xDS通用协议不同,Linkerd采用专用API,按目标服务名流式查询,错误处理基于gRPC状态码而非ACK/NACK。排障时需查destination.Get流,而非EDS快照。文章强调版本锚定v0.20.0,并对比了与Istio在组件拓扑、L7信息和身份路径上的差异。
延伸解读
排障第一分叉:查流而非查快照
Linkerd 的 destination API 按目标服务名建立独立 gRPC 流,每条出站目标一条流,控制器在订阅开始即推送首条消息。因此,当出站端点异常时,应检查 destination.Get 流中的 Update(add/remove/no_endpoints),而不是像 Istio 那样查看 EDS 快照或 NACK 计数。这一机制差异决定了排障路径的根本不同。
gRPC 错误码取代 ACK/NACK
Linkerd 专用 API 没有 xDS 的资源级 ACK/NACK 状态机,错误处理依赖标准 gRPC 状态码:非法 authority 返回 InvalidArgument,服务不存在返回 NotFound,内部错误返回 Internal。流落后过多时,endpointTranslator 队列溢出会关闭流。理解这一点有助于快速定位问题,避免套用 xDS 的排障思路。
版本锚定:v0.20.0 的边界
本文所有机制描述均锚定 Linkerd 2.20 与 linkerd2-proxy-api v0.20.0。proto 字段是否存在以该版本的 .proto 文件为准,而非记忆或第三方博客。升级控制面时,需核对 proxy 与 API crate 是否同代,避免因版本不匹配导致行为差异。
Q&A
Linkerd 2.20 中 linkerd2-proxy 与控制面之间有哪些 gRPC API?
Linkerd 2.20 中 linkerd2-proxy 与控制面之间有四套 gRPC API:destination、identity、inbound 和 tap。destination 用于出站服务发现,identity 用于证书签发,inbound 用于入站策略,tap 用于控制面查询代理的实时请求元数据。
Linkerd 的 destination API 与 Istio 的 xDS 在寻址方式上有什么不同?
Linkerd 的 destination API 采用按目标服务名发起 destination.Get 流的方式,每个出站目标对应一条流;而 Istio 的 xDS 是按类型订阅资源名集合,如 LDS、RDS、CDS、EDS 等。Linkerd 是专用 API,仅服务于 linkerd2-proxy,而 xDS 是通用协议,支持多种数据面。
在 Linkerd 中,如果出站服务没有端点,应该如何排查?
在 Linkerd 中,如果出站服务没有端点,应该检查 destination.Get 流以及 EndpointSlice 的翻译过程,而不是查看 xDS EDS 快照或 NACK 计数。因为 Linkerd 使用专用 API,错误处理基于 gRPC 状态码,而非 xDS 的 ACK/NACK 机制。
Linkerd 的 destination.Get 在出错时如何返回错误?
Linkerd 的 destination.Get 在出错时使用标准 gRPC 状态码,例如:非法 authority 返回 InvalidArgument,服务不存在返回 NotFound,内部错误返回 Internal。此外,如果流落后过多,endpointTranslator 队列溢出会关闭流。客户端需要根据状态码进行重连。
Linkerd 的 identity API 与 Istio 的 SDS 在身份路径上有什么不同?
Linkerd 使用 identity 专用 API,代理提交 CSR,identity 服务签发绑定 ServiceAccount 的工作负载证书;而 Istio 使用 SDS 通用资源推送。Linkerd 的身份路径是 CSR 方式,Istio 是 SDS 方式。
Linkerd 2.20 中 linkerd2-proxy-api 的版本是多少?
Linkerd 2.20 中 linkerd2-proxy-api 的版本是 v0.20.0,该版本在 linkerd2 的 go.mod 中指定。
Linkerd 的 inbound API 有什么作用?
Linkerd 的 inbound API 用于入站 linkerd2-proxy 按端口发现入站服务策略,包括授权要求和限速等。它由 policy 容器参与策略求值。