第 5
篇 把 destination Pod 四容器分工钉到可排障粒度;istio-xds
第 14 篇 用一篇对照说明 Linkerd 不是
xDS 实现。中间仍缺一层:控制面与
linkerd2-proxy 之间到底有哪些 gRPC 服务、每条
RPC 回答什么问题、以及排障口令为何是「查
destination.Get 流」而不是「查 EDS
NACK」。
本篇钉协议内核:linkerd2-proxy-api
仓库定义的 destination / identity / inbound / tap 四套
API,以及它们与 istiod/xDS
在寻址方式与错误语义上的机制差。不把
Linkerd 写成「轻量 istiod」或 xDS 子集。
本篇在系列中的位置
篇目 核心内容 第 5 篇 · destination 架构 四容器 Pod、Informer 驱动 第 6 篇 · linkerd2-proxy-api 四套 gRPC、专用 API vs xDS、错误语义 第 7 篇 · 服务发现流 per-target Get、EndpointTranslator系列目录 关键问题、阅读路径
版本锚定:Linkerd 2.20(源码 tag
version-2.20;公告 2026-06-23)。linkerd2go.mod钉github.com/linkerd/linkerd2-proxy-api v0.20.0。机制叙述对齐该 tag 的 proto 定义与controller/api/destination/server.go;不以linkerd.io/docs/live 站点冒充 2.20。无真实 Linkerd 集群则不粘贴伪造 gRPC 日志或linkerd check输出。
一、destination / identity / inbound / tap
linkerd2-proxy-api 仓库 README
写明:该仓库包含 Linkerd Proxy 与控制面通信的 gRPC
绑定,API 设计为 Kubernetes
无关的运行时配置抽象。四套服务分工如下。
| 服务 | 消费方 | 机制职责 |
|---|---|---|
| destination | 出站 linkerd2-proxy |
给定目标地址,流式返回端点集合、协议提示、mTLS
身份、遥测标签;另有 GetProfile 推送 L7
路由/重试/超时 |
| identity | 全部 meshed proxy | 代理提交 CSR,identity 签发绑定 ServiceAccount 的工作负载证书 |
| inbound | 入站 linkerd2-proxy |
按端口发现入站服务策略:授权要求、限速等 |
| tap | 控制面(tap 组件) | proxy 暴露 gRPC 服务端,供控制面查询流经代理的实时请求元数据 |
与 第 4 篇 的 CSR 路径、第 5 篇 的四容器拓扑衔接:destination 容器实现 destination / GetProfile RPC;identity Deployment 实现 identity RPC;policy 容器参与 inbound 策略求值;tap 是数据面向控制面的反向查询。
flowchart LR
proxy["linkerd2-proxy"] -->|"destination.Get"| dest["destination controller"]
proxy -->|"identity CSR"| ident["linkerd-identity"]
proxy -->|"inbound policy"| pol["policy container"]
tapcp["tap / viz"] -->|"tap query"| proxy
图:四套 API 的调用方向。节点为英文;正文用中文解释。出站发现走 destination;身份走 identity;入站授权走 inbound;观测走 tap。
二、专用 API vs xDS
xDS(见 istio-xds/)是与具体数据面解耦的通用资源协议:Envoy
按 类型 + 资源名 订阅 LDS/RDS/CDS/EDS
等,istiod 按类型推送
DiscoveryResponse。Linkerd
走的是相反取舍:linkerd2-proxy-api 只为
linkerd2-proxy
定制,不追求多数据面复用。
寻址差是排障的第一分叉:
| 维度 | istiod / xDS | Linkerd / destination |
|---|---|---|
| 协议 | 通用 xDS v3 多资源类型 | 专用 gRPC(destination / identity / inbound / tap) |
| 寻址 | 按类型订阅资源名集合 | 按目标服务名发起
destination.Get(path),每条出站目标一条流 |
| 更新形状 | 同类型下可多资源、SotW 或 Delta | 单流内 Update:add /
remove / no_endpoints |
| 多客户端 | sidecar / waypoint / ztunnel 共享协议栈 | 仅 linkerd2-proxy |
destination.proto 注释写清:Get
给定 destination
后返回长连接流;控制器在订阅开始必须尽快推送首条消息;客户端重连前可暂用陈旧缓存,但收到首条新消息前不得假定端点仍有效。这是
per-target 流模型,不是「订阅 EDS
类型下所有 Cluster」。
工程含义:把 Linkerd 当成「另一个
istiod」会在第一步指错组件——出站无端点应查
destination Get 流与 EndpointSlice
翻译,而不是查 xDS EDS 快照或 NACK 计数。
三、gRPC 错误非 ACK/NACK
istio-xds 第 11 篇 讨论 istiod 如何处理 NACK——这套复杂度来自 xDS 作为通用协议必须应对「任意客户端以任意方式拒绝任意资源类型」。
Linkerd 专用 API 没有资源级 ACK/NACK
状态机。destination.Get
要么建立流并持续收 Update,要么在 gRPC
层失败:
- 非法 authority →
InvalidArgument(如 IP 直查、Get不支持 IP 查询——见server.go) - Service 不存在 →
NotFound - 内部/Informer 错误 →
Internal或订阅错误 - 流落后过多 →
endpointTranslator队列溢出后关闭流(endpoint_updates_queue_overflow指标)
错误处理落在 标准 gRPC 状态码 +
客户端重连,而非 xDS 的
DiscoveryRequest 错误详情与 nonce
协商。这不是「更简单所以更好」的论断,而是可验证的机制事实:协议通用性与资源级协商复杂度是同一设计选择的两面(istio-xds/14
已述,本篇不重复优劣判断)。
四、对照 istio-xds/14(不重写)
istio-xds 第 14 篇 从 Istio 读者视角对照了三组件拆分、按目标查询 vs 类型订阅、SDS vs CSR 身份路径。本篇从 Linkerd 系列内侧补三点,避免读者在两系列间来回时对不上口径:
- 组件拓扑:destination ∥ identity ∥ proxy-injector 三 Deployment,destination Pod 内再拆 destination / sp-validator / policy / 反身 proxy 四容器(第 5 篇)。
- L7 信息来源:Istio 走
VirtualService/HTTPRoute → RDS;Linkerd 走 ServiceProfile →
GetProfile流(第 9 篇)。 - 身份路径:Istio 走 SDS 通用资源推送(envoy/11);Linkerd 走 identity 专用 CSR(第 4 篇)。
不重写 istiod 推送图、NACK/warming 全书——那些留在
istio-xds/。本系列后续 第 7
篇 展开 Get 流内的 EndpointTranslator;第 13 篇
把「查流」收进五轴口诀。
五、proto 版本边界
机制结论必须钉版本对:
| 锚点 | 2.20 事实 |
|---|---|
linkerd2 源码 |
tag version-2.20 |
linkerd2-proxy-api 依赖 |
v0.20.0(go.mod) |
| proto 目录 | linkerd2-proxy-api 仓库
./proto(destination / identity / inbound /
tap) |
| Rust crate | linkerd2-proxy-api crate,按 feature 启用各
API 客户端 |
边界门:
- 2.20 之后的 live 文档能力不得写入正文当当前事实(见 PLAN.md §7.1)。
linkerd2-proxy-api独立发版(v0.20.0等),与linkerd2小版本通过go.mod对齐;升级控制面须核对 proxy 与 API crate 是否同代。- inbound API 与 policy
CRD(
policy.linkerd.io)在 2.20 并存;Gateway API HTTPRoute 等资源的 policy-validator 校验见 第 8 篇、第 11 篇。
排障时「proto 字段是否存在」以 v0.20.0
的 .proto 为准,不以记忆或第三方博客为准。
参考资料
规范 / 官方文档 / 源码(A)
linkerd/linkerd2-proxy-apiREADME;proto/destination.proto、proto/inbound.proto等 @ v0.20.0linkerd/linkerd2tagversion-2.20:go.mod(linkerd2-proxy-api v0.20.0);controller/api/destination/server.go(GetRPC)- Linkerd Architecture(destination / identity / proxy-injector 职责)
站内对照(A/B)
学术谱系(A)
- McCanne & Jacobson, The BSD Packet Filter, USENIX Winter 1993(控制面「专用协议 vs 通用协议」谱系对照)
上一篇:destination 架构
下一篇:服务发现流:per-target Get 与 EndpointTranslator
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【Linkerd】控制面全景:缺口、五轴坐标系与 16 篇路线
相对 istio-xds/14 对照篇与 architecture/76 税文,钉清 Linkerd 2.20 非 xDS 控制面缺口;定义注入、identity、destination、策略与数据面五条轴,并强调 native sidecar 与 legacy 路径分列证据包。
Linkerd / 服务网格控制面:非 xDS 的 destination、identity 与 linkerd2-proxy
补齐站内 istio-xds 对照篇之上的 Linkerd 控制面内核:proxy-injector、identity CSR、destination 按目标流式推送、linkerd2-proxy 数据面,并以排障与相对 istiod/xDS、Ambient、Cilium L4 的选型收束。
【Linkerd】identity 服务:CSR、mTLS 与工作负载证书轮转
拆解 linkerd-identity 如何校验 CSR 并签发绑定 ServiceAccount 的工作负载证书;自动轮转与 issuer/trust anchor 分层,并对照 Envoy SDS 路径与失败落格。
【Linkerd】destination 架构:四容器 Pod 与 Informer 驱动
拆解 linkerd-destination Pod 内 destination、sp-validator、policy 与反身 proxy 四容器分工;Informer/EndpointTranslator 如何把 Kubernetes 状态流式推给数据面,并钉住 2.20 内存优化门。