「Pod Running 但流量没进 mesh」与「meshed 但 403/502」很少落在同一层。前者可能是 proxy-injector、native sidecar 启动顺序或 iptables/CNI;后者可能是 identity CSR、destination 空流、AuthorizationPolicy 或 linkerd2-proxy 健康。一上来重装控制面或改 ServiceProfile,会把可恢复的轴 3 问题放大成双故障。
本文是系列第 13 篇:按第
1 篇与 PLAN.md
§八做症状 →
轴映射。口诀不变:先点名轴,再下钻组件。native
sidecar(2.20 默认)与 legacy
init+sidecar 在轴 1–2
分列证据包。升级与 trust 门见第 12
篇。无 Linkerd 集群则不粘贴伪造
linkerd check / viz 指标。
本篇在系列中的位置
篇目 核心内容 第 12 篇 · 运维与升级 trust anchor 与 destination 内存门 第 13 篇 · 排障坐标系 五轴否证;native/legacy 证据包 第 14 篇 · 对照替代路径 istio-xds、Ambient、Cilium L4 系列目录 全部篇目
版本锚定:Linkerd 2.20(tag
version-2.20)。linkerd check分类以该版本 CLI 语义为准。Istio 侧排障五轴见 istio-xds/15——同名「五轴」不是同一坐标系。
一、口诀
轴 1 注入与网格成员 — proxy-injector;namespace 注解;native sidecar vs init+sidecar;opaque ports
轴 2 身份与 mTLS — identity CSR;工作负载 cert;issuer / trust anchor
轴 3 destination/发现 — destination.Get 流;EndpointSlice;端点富化(identity/zone)
轴 4 策略与 L7 — Server、AuthorizationPolicy、MeshTLSAuthentication;ServiceProfile;GAPI HTTPRoute
轴 5 数据面与健康 — linkerd2-proxy inbound/outbound;metrics/tap;destination 控制面 OOM
native vs legacy
分列:证据包标题须写明注入路径——例如
native-sidecar-2.20 或
legacy-init-sidecar。轴 1 的「缺 proxy 容器」在
native 路径可能是 sidecar 启动门未满足;在 legacy 路径可能是
init 未完成。不可混贴 iptables 证据与
restartPolicy: Never Job 的 sidecar 语义。
flowchart TD
symptom["Symptom"]
symptom --> name["Name Linkerd axis first"]
name --> a1["Axis1 inject membership"]
name --> a2["Axis2 identity mTLS"]
name --> a3["Axis3 destination discovery"]
name --> a4["Axis4 policy L7"]
name --> a5["Axis5 dataplane health"]
a1 --> split["Split native vs legacy evidence"]
症状 → 轴(入口表)
| 症状(入口) | 优先轴 | 先查 | 不要先做 |
|---|---|---|---|
| Pod 无 linkerd-proxy / 未注入 | 1 | namespace 注解、injector webhook、是否跳过注入 | 改 destination |
| Job/CronJob 未完成或永不 Ready | 1 | native sidecar 与完成语义;legacy init 退出码 | 当成应用 bug |
| TLS handshake error / 身份不匹配 | 2 | 工作负载 cert、issuer、trust anchor bundle | 改 ServiceProfile 路由 |
| 无端点 / 错后端 / 发现延迟 | 3 | Get() 流、EndpointSlice、Service 端口 |
重装 proxy-injector |
| 403 / 策略拒绝 / 路由不命中 | 4 | Server、AuthorizationPolicy、SP/GAPI 是否被加载 | 先升控制面 |
| 502 / 超时 / viz 无指标 | 5(先否证 1–4) | proxy 日志、inbound/outbound;destination OOM | 当成「对端未 mesh」 |
| 跨集群调用失败 | 2 + 11 | 共享 trust anchor、gateway、export 标签 | 单集群 destination 口诀 |
默认顺序:轴 1 成员资格 → 轴 2 握手 → 轴 3 端点 → 轴 4 策略/L7 → 轴 5 数据面。一次否证一轴。
二、注入失败
表象:Pod 未 mesh;无
linkerd-proxy 容器;流量绕过 sidecar;opaque
端口行为与预期不符。
分列证据包:
| 路径 | 证据包要点 |
|---|---|
| native sidecar(2.20 默认) | Pod spec restartPolicy、sidecar 容器
restartPolicy: Always;启动门与主容器就绪顺序(第 2
篇) |
| legacy init+sidecar | linkerd-init 完成态;iptables 规则或 CNI
注解(第 3
篇) |
| 共用 | linkerd.io/inject、namespace
注解;config.linkerd.io/skip-inbound-ports /
opaque 配置 |
| 子问题 | 轴 | 动作 |
|---|---|---|
| webhook 未命中 | 1 | 查 proxy-injector、API server 调用失败 |
| 注入被跳过 | 1 | 查注解与版本门 |
| 重定向未生效 | 1→3 边界 | 先完成轴 1 再查流量是否到达 proxy |
三、identity 失败
表象:meshed Pod 间 TLS handshake error;证书 SAN 与 ServiceAccount 不符;anchor 轮转后全挂。
| 子问题 | 核对 |
|---|---|
| 工作负载证书 | CSR 是否由 identity 签发;自动轮转是否停滞 |
| Issuer | 是否由当前 trust anchor 签发(第 12 篇) |
| Trust anchor | bundle 窗口内是否已滚动全 mesh;multicluster 各集群是否一致 |
| 与 Envoy SDS 对照 | 外链 envoy/11;Linkerd
无 SDS,勿查 Secret xDS |
「握手失败」在否证轴 1 后优先轴 2,不要先改 ServiceProfile(轴 4)。
四、destination 与策略
表象:linkerd routes / viz
显示无路由;调用直连 ClusterIP 有响应、经 mesh
无端点;403;SP 校验 webhook 拒绝。
| 子问题 | 轴 | 动作 |
|---|---|---|
| 空端点、错 subset | 3 | EndpointSlice、destination Get()(第 7
篇) |
| 策略拒绝 | 4 | AuthorizationPolicy、Server port(第 8 篇) |
| SP 未生效 / 校验失败 | 4 | sp-validator、CRD 字段(第 9 篇) |
| GAPI 路由沉默 | 4 | CRD 版本与字段是否 ⊆ GAPI 1.2.1(第 11 篇) |
与「对端未 mesh」区分:未 mesh 常表现为明文或非预期路径(轴 1);meshed 但空流是轴 3。勿把两者都说成「网络不通」。
五、数据面与健康
表象:502 Bad Gateway;请求超时;tap/metrics 无入站流量;destination Pod OOM 或内存持续上涨。
| 子问题 | 核对 |
|---|---|
| proxy 进程健康 | inbound/outbound 监听;是否与控制面 API 版本匹配 |
| 限流与 LB | HTTP 429 风暴是否需 Load Biaser(第 10 篇) |
| destination 控制面 | 2.20 内存重构是否已部署(第 12 篇);EndpointSlice churn |
| tap / metrics | 轴 5 观测;非根因 |
轴 5 与轴 3 分界:destination 已推送端点且策略允许,但 proxy 仍 502 → 查 proxy 与对端 inbound;destination 未推送 → 留在轴 3–4。
六、与 istio-xds 五轴不混因果
| 项目 | Linkerd 本系列 | istio-xds 系列 |
|---|---|---|
| 控制面协议 | linkerd2-proxy-api gRPC;per-target
Get() 流 |
xDS;type-subscription;ADS |
| 排障入口 | 本文五轴 + native/legacy 分列 | istio-xds/15 等 |
| 典型口令 | 「先点名轴」→ destination 流 / identity CSR | Listener/Cluster warming、xDS NACK |
| 数据面 | linkerd2-proxy | Envoy |
同集群可能并存 Istio 与 Linkerd 的讨论在第 14 篇,但证据包不可混贴:
- Linkerd「无端点」不用 istio
EDS空 cluster 解释。 - Istio「xDS NACK」不用 Linkerd destination gRPC 状态码类比。
- 两侧都有「五轴」字样,轴含义不同,混因果会指错组件(把 istiod 当成 destination)。
需要 xDS/istiod 全书坐标时,回到 istio-xds/;需要 Envoy Filter 坐标时,回到 envoy/。
参考资料
本系列(A)
- 第 1 篇 · 五轴定义;PLAN.md §八
- 第 2–12 篇各轴主文;尤其 10、12
对照(勿混因果)
官方(A)
- Linkerd
Architecture;
linkerd check文档 @ 2.20 - Announcing Linkerd 2.20(native sidecar 默认)
上一篇:运维与升级
下一篇:对照替代路径
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【Linkerd】网格成员与注入:proxy-injector 与 native sidecar 门
以 Linkerd 2.20 为锚,拆解 proxy-injector 如何把 Pod 变成 mesh 成员;native sidecar 默认与 legacy init+sidecar 分列证据包,以及 opaque ports 与 membership 失败落格。
【Linkerd】运维与升级:证书轮转与 2.20 destination 内存门
按 2.20 tag 钉控制面升级顺序、trust anchor/issuer 分层轮转、destination 内存重构运维门;附 live vs tag 门禁与否证检查表。无集群则不写升级成功叙事。
Linkerd / 服务网格控制面:非 xDS 的 destination、identity 与 linkerd2-proxy
补齐站内 istio-xds 对照篇之上的 Linkerd 控制面内核:proxy-injector、identity CSR、destination 按目标流式推送、linkerd2-proxy 数据面,并以排障与相对 istiod/xDS、Ambient、Cilium L4 的选型收束。
【Linkerd】控制面全景:缺口、五轴坐标系与 16 篇路线
相对 istio-xds/14 对照篇与 architecture/76 税文,钉清 Linkerd 2.20 非 xDS 控制面缺口;定义注入、identity、destination、策略与数据面五条轴,并强调 native sidecar 与 legacy 路径分列证据包。