【Linkerd】网格成员与注入:proxy-injector 与 native sidecar 门

💡 原文中文,约9200字,阅读约需22分钟。
📝

内容提要

本文介绍Linkerd 2.20服务网格的网格成员与注入机制。核心是proxy-injector webhook在Pod创建时注入linkerd-proxy,2.20默认采用native sidecar模式(init容器带restartPolicy: Always),替代传统legacy模式(普通容器加linkerd-init)。文章提供排障指南,区分未注入与已注入但重定向未就绪,并说明opaque ports配置及membership失败排查方法,强调先读Pod spec再查配置。

🔎

延伸解读

注入形态决定排障证据包

2.20 默认 native sidecar 后,排障时不能只看集群版本,必须检查 Pod spec:native 路径下 linkerd-proxy 位于 initContainers 且 restartPolicy: Always,legacy 路径下 proxy 在 containers 且另有一次性 linkerd-init。未重启的旧 Pod 仍保留升级前 spec,因此同一集群可能混部两种形态,证据包需分列。

opaque 与 skip 端口语义不同

opaque ports 仍经 proxy 但跳过 HTTP 探测,保留 mTLS 与指标;skip ports 则绕过 proxy,放弃 mTLS,仅适合调试。opaque 注解应标在接收方,skip-outbound 标在发送方。Pod 级 opaque-ports 是覆盖而非追加默认列表,误以为追加会导致端口未按预期处理。

注入失败与 xDS 无关

membership 只由 admission 结果决定,与后续 xDS 订阅无关。未注入时不应归因于 destination 未推送,而应检查注入注解、namespace 策略及 injector webhook 状态。linkerd inject 的 dry-run 只预览 YAML,不替代集群内 webhook 注册是否成功。

Q&A

Linkerd 2.20 中 proxy-injector 的作用是什么?

proxy-injector 是 Linkerd 控制面中的一个 MutatingAdmissionWebhook,它在 Pod 创建时拦截 AdmissionReview 请求,检查 namespace 或 workload 是否带有注入注解(如 linkerd.io/inject: enabled),如果命中,则修改 Pod spec,注入 linkerd-proxy 容器、必要的环境变量和卷挂载,使 Pod 成为 mesh 成员。

Linkerd 2.20 默认的 sidecar 注入模式是什么?与 legacy 模式有何区别?

Linkerd 2.20 默认采用 native sidecar 模式,即 linkerd-proxy 以带 restartPolicy: Always 的 init 容器注入,而 legacy 模式中 proxy 是普通容器,另有一个一次性 linkerd-init init 容器。区别在于启动顺序(native 下 proxy 在应用 initContainers 之前就绪)、Job 终止行为(native 下 proxy 随主容器退出)以及 Pod spec 中的位置(initContainers vs containers)。

如何关闭 Linkerd 2.20 的 native sidecar 模式,回退到 legacy 模式?

可以通过全局 Helm 参数 proxy.nativeSidecar: false 关闭,或在 namespace/workload 上使用注解 config.linkerd.io/proxy-enable-native-sidecar: "false" 覆盖。注意 config.beta.linkerd.io/proxy-enable-native-sidecar 在 2.20 已弃用。

Linkerd 中 opaque ports 和 skip ports 有什么区别?

opaque ports 配置后流量仍经过 proxy,但跳过 HTTP 协议探测,按 TCP 透传,保留 mTLS 和指标;skip ports 则通过 iptables 绕过 proxy,不保留 mTLS 和观测。opaque 一般优先于 skip,前者只关闭探测,后者仅适合调试。

如何排查 Pod 未注入 linkerd-proxy 的问题?

首先检查 Pod 是否带有 linkerd.io/inject 注解或所在 namespace 的注入策略,确认注入条件是否命中;其次检查 proxy-injector webhook 是否正常运行(Deployment 和 webhook 配置),以及 injector 是否可用。如果 webhook 失败或未注册,自动注入会失败。

Linkerd 2.20 中 native sidecar 模式对 Job 终止有什么影响?

在 legacy 模式下,proxy 作为普通容器可能在 Job 主容器退出后继续运行,导致 Pod 无法进入 Completed 状态;而 native sidecar 模式下,kubelet 会按平台语义与主容器协同终止 proxy,避免该问题。

Linkerd 中如何配置 opaque ports?推荐在什么位置配置?

可以通过 Pod 注解 config.linkerd.io/opaque-ports 配置,但该注解是覆盖默认值而非追加。推荐优先在 Service 上设置 ports[].appProtocol(Kubernetes 1.19+),使 meshed 客户端在协议探测前获知语义;仅当 headless、直连 Pod IP 或 unmeshed 客户端等场景才使用 Pod 注解。

🏷️

标签

➡️

继续阅读