【Linkerd】运维与升级:证书轮转与 2.20 destination 内存门
内容提要
本文介绍Linkerd 2.20运维要点:控制面升级需按CRD、控制面、数据面顺序执行;trust anchor轮转必须使用bundle过渡并滚动全网格,否则导致TLS握手失败;2.20优化destination内存,但需先确认版本;文档引用应以tag为准,避免live文档误导。
延伸解读
升级顺序为何重要
Linkerd 控制面升级必须按 CRD、控制面、数据面的顺序执行,否则可能导致 webhook 拒绝或 proxy 与 API 版本不匹配。文章强调,仅更换 proxy 镜像而不升级 CRD 是常见错误,且控制面 Ready 不代表数据面已同步。在 multicluster 场景下,各集群需按同一 trust 计划执行,避免跨集群 mTLS 失败。
trust anchor 轮转的常见陷阱
trust anchor 轮转必须使用 bundle 过渡并滚动全网格,否则会导致 TLS 握手失败。文章列举了未 bundle 直接换根、未滚动 meshed Pod、issuer 先于 anchor bundle 等失败模式,并指出 multicluster 只升一端会导致跨集群 mTLS 失败。这些陷阱凸显了轮转操作对纪律化 runbook 的依赖。
2.20 destination 内存优化的适用场景
2.20 重构 destination 控制器,通过共享端点过滤状态降低高 churn、大规模 EndpointSlice 场景下的内存占用。但文章明确表示,小集群未必能观察到差异,且内存优化不替代 Endpoint 配置错误的排查。运维时应先确认 destination 组件已升级,再考虑是否与内存问题相关。
文档引用应以 tag 为准
文章强调,机制结论应锚定源码 tag(如 version-2.20),而非 live 文档或 2-edge 版本,因为 live 文档可能包含后版本能力,不能作为 2.20 的事实依据。第三方帖子仅作线索,不单独支撑结论。这提醒运维人员在变更单中写明 tag,避免因文档误导而误判版本行为。
Q&A
Linkerd 2.20 控制面升级的正确顺序是什么?
Linkerd 2.20 控制面升级应遵循官方 Upgrade 任务文档:先升级 CRD/策略 API,确保 API 版本与 2.20 兼容;然后升级控制面 Deployment(使用 linkerd upgrade 或 Helm);接着滚动升级数据面,使 proxy 与 API 版本匹配;最后运行 linkerd check 验证。不要在未升级 CRD 的情况下只更换 proxy 镜像。
Linkerd trust anchor 轮转时为什么必须使用 bundle 过渡?
Linkerd trust anchor 轮转必须使用 bundle 过渡,因为如果直接更换根证书而不保留旧根,会导致所有依赖旧根验证的 proxy 出现 TLS 握手失败。使用 bundle 可以让新旧根并存,在滚动重启所有 meshed Pod 后,逐步切换到新根,避免服务中断。
Linkerd 2.20 的 destination 内存优化具体优化了什么?
Linkerd 2.20 重构了 destination 控制器的内部状态管理,通过跨相同过滤条件的订阅者共享端点过滤与 diff 状态,显著降低了高 churn、大规模 EndpointSlice 场景下的控制面内存占用。但该优化不替代 Endpoint 配置错误的排查,且小集群可能观察不到明显差异。
Linkerd 文档引用时为什么应该以 tag 版本为准而不是 live 文档?
因为 live 文档可能包含后续版本的新特性,如果将其当作 2.20 的事实,会导致误导。官方建议引用源码 tag(如 version-2.20)对应的文档和 changelog,确保机制结论与当前版本一致。
Linkerd trust anchor 轮转失败有哪些常见表现?
常见失败表现包括:未使用 bundle 直接换根导致大面积 TLS handshake error;未滚动 meshed Pod 导致间歇性握手失败;issuer 先于 anchor bundle 导致 linkerd check identity 警告;multicluster 只升级一端导致跨集群 gateway mTLS 失败。
Linkerd 2.20 升级后,native sidecar 和 legacy init+sidecar 会有什么影响?
2.20 默认启用 native sidecar,升级后新注入的 Pod 可能使用 native sidecar,而旧 Pod 可能仍是 legacy init+sidecar,两者可能并存。排障时需将证据包分列,不能混为一谈,避免误判为“注入坏了”。