☰
Linkerd 2.x 版本演进全解:从 CHANGES.md 看服务网格九年的架构变迁与升级实践
2026/10/8 13:23:24 网站建设 项目流程
  • 服务网格
  • 云原生
  • 可观测性

【免费下载链接】linkerd2

Ultralight, security-first service mesh for Kubernetes. Main repo for Linkerd 2.x.

项目地址:https://gitcode.com/gh_mirrors/li/linkerd2
点击查看免费下载

Linkerd 2.x 是 Kubernetes 上主打"极简、安全优先"的服务网格,本文以仓库根目录的 CHANGES.md(8129 行完整变更记录)为骨架,系统梳理从 Conduit 0.1.0 到 stable-2.14.0、edge-24.2.5 的版本演进脉络,涵盖 mTLS 安全模型、Gateway API 策略体系、多集群、CNI、Helm 安装模型等核心主题,并结合仓库内 charts、policy-controller、multicluster、cli 等源码佐证。读完本文,你将掌握 Linkerd 的版本命名规则、各 stable 里程碑的核心能力、关键 Helm 配置值与 CLI 命令,以及安全升级的注意事项。

一、版本体系与文档定位:edge / stable 双通道与变更记录的组织方式

Linkerd 2.x 采用edge(边缘版)与 stable(稳定版)双通道的发布模式(该模式在edge-18.9.2的变更记录中首次出现)。edge 版每月多次发布,快速迭代新特性;stable 版则从 edge 中挑选经过验证的功能固化发布,通常一年 2~3 个。

CHANGES.md 的组织方式也遵循这一规律:

  • 文件头部明确声明:自 edge-24.2.5 起,edge 版变更说明迁移至 GitHub 的自动化 Release Notes 功能,即 CHANGES.md 中的最新 edge 条目为edge-24.2.5,此后不再手工维护 edge 条目。
  • 每个版本条目按## <版本号>组织,内容采用分类清单:Proxy、Control Plane、CLI、Helm、Viz、Multicluster、CNI、Extensions等,每条变更后附 GitHub PR/Issue 编号(如[#12098])。
  • stable 版本条目通常还包含三段式结构:概述段落(Release highlights)、Upgrade notes(升级说明)、Full release notes(完整变更清单),多数版本还附有贡献者致谢名单。
版本通道示例版本定位变更记录特征
edgeedge-24.2.5快速迭代、尝鲜条目较短,聚焦增量修复
stablestable-2.14.0生产可用含概述、升级说明、完整清单
RCstable-2.12.0-rc2稳定版候选与对应 stable 高度重合
旧版v18.9.1(Conduit 时期)早期版本按 v 前缀命名

从版本号跨度可以清晰看到项目的历史脉络:早期 Conduit 采用v0.1.0、v18.8.x命名,后统一为edge-/stable-前缀,并维持到今天。仓库中对应版本的安装产物可在 charts/linkerd-control-plane、charts/linkerd-crds、charts/linkerd2-cni 等 Helm Chart 中查看。

二、安全基石:零配置 mTLS 与证书体系的演进

Linkerd 最核心的安全能力是零配置的 mutual TLS(mTLS),这一能力在不同 stable 版本中持续增强:

stable-2.7.0:外部证书签发与证书轮换

  • 新增对外部证书签发者(如 cert-manager)的支持,可将 Linkerd 的 PKI 与外部 CA 集成;
  • 将注入器与 tap API 的 Secret 类型改为kubernetes.io/tls(该变更实际落地于 stable-2.9.0),以便 cert-manager 等工具托管;
  • 简化证书轮换流程,linkerd check与linkerd upgrade命令增加了 TLS 证书校验。

stable-2.9.0:mTLS 覆盖全部 TCP 连接

  • 将零配置 mTLS 扩展至所有 TCP 连接:集群安装 Linkerd 后,TCP 流量即被透明加密与认证,而不再局限于 HTTP;
  • 引入ARM 架构支持;
  • 引入多核 proxy 运行时以提升吞吐(对应仓库中的 proxy-runtime.yml 与 Rust 侧 policy-controller/runtime 等构建配置可佐证运行时架构);
  • 支持 Kubernetes 服务拓扑感知路由与 EndpointSlice(见下节)。

stable-2.12.0 之后:身份与信任

  • identity 控制器引入 client-go 的QPS/Burst可配置项,默认值从5/10提升至100/200(见 edge-23.12.1 条目);
  • stable-2.12.1 起,所有注入的工作负载新增linkerd.io/trust-root-sha256注解,用于通过 Kubernetes API 统一比对各工作负载的信任锚(trust anchor);
  • edge-24.1.3 起,proxy 支持使用SPIRE 在 Kubernetes 之外提供身份,为后续 ExternalWorkload(网格外扩)铺路;
  • MeshTLSAuthentication资源校验放宽,允许 SPIFFE URI 身份(edge-24.1.1),并在 stable-2.14.0 中强制要求至少提供一个 identity/identityRef。

三、策略体系:从 ServerAuthorization 到 Gateway API 的演进

Linkerd 的策略能力经历了从自研 CRD 到拥抱 Gateway API 标准的大迁移,这是 2.12~2.14 版本的主线:

stable-2.12.0:路由级策略与零信任授权

  • 引入基于 HTTP 路由的授权策略,用户可基于 Gateway API 的 HTTPRoute 定义零信任授权策略,配合强工作负载身份与 mTLS 落地;
  • policy 控制器支持AuthorizationPolicy资源,可分别 targetHttpRoute或Server资源;
  • 移除默认安装中的 SMI 功能,TrafficSplit 改由独立的linkerd-smi扩展提供;
  • 新增policyController.probeNetworksHelm 值,用于配置探测网络范围。

stable-2.13.0:客户端策略(outbound)

  • 引入客户端侧策略(client-side policy):HTTPRoute 可以以 Service 作为parentRef,从而同时配置 outbound(客户端)与 inbound(服务端)proxy 的策略;
  • 新增动态请求路由(dynamic request routing)与HTTP 熔断(circuit breaking)能力,proxy 通过新的OutboundPoliciesAPI 获取路由规则;
  • 新增 proxy 指标:outbound_route_backend_http_requests_total、outbound_route_backend_grpc_requests_total、outbound_http_balancer_endpoints;
  • HTTPRoute 版本从v1alpha1升级为v1beta2;
  • 引入linkerd diagnostics policy命令展示 Service 的 outbound 策略(仓库中 cli/cmd/diagnostics_profile.go、cli/cmd/policy.go 为相关 CLI 实现)。

stable-2.14.0:HTTPRoute 能力补全

  • policy 控制器支持gateway.networking.k8s.ioHTTPRoute;
  • 支持RequestHeaderModifier、RequestRedirect、ResponseHeaderModifierHTTP 过滤器(可挂在 route 或 backend 级别);
  • 支持消费者命名空间(consumer namespace)中定义的 HTTPRoute;
  • 支持不带端口声明的parentRefs;
  • 引入 HTTPRoute 超时(timeout)配置能力。

四、多集群能力:从网关代理到直连镜像

多集群(multicluster)是 Linkerd 扩展体系的重要一环,仓库根目录 multicluster 与 multicluster/service-mirror 保存了全部实现代码。

  • stable-2.8.0:引入多集群扩展,linkerd multicluster子命令族提供跨集群服务发现工具;linkerd multicluster gateways暴露网关遥测;注意当时尚未支持 EKS,随后由 stable-2.8.1 修复(扩展 service-mirror 在无 IP 时解析目标集群 DNS 名称)。
  • stable-2.9.0:将单一service-mirror控制器重构为按目标集群分别安装的控制器(通过linkerd multicluster link安装);镜像机制从注解驱动改为源集群通过 label selector 声明要导出的服务;新增linkerd multicluster unlink。
  • stable-2.14.0:引入直连 pod-to-pod 多集群镜像——当集群部署在扁平网络上时,跨集群流量无需再经过网关,增强了多集群认证并减少了对公共负载均衡器的依赖;新增remoteDiscoverySelector字段,支持由控制面在远端集群执行镜像服务的发现而非在源集群创建 Endpoints;service-mirror 控制器新增 leader-election 与 HA 模式;新增logFormat、gateway.deploymentAnnotations、gateway.terminationGracePeriodSeconds、gateway.loadBalancerSourceRanges等配置项。

五、安装与升级模型:Helm Chart 拆分与安装流程变迁

安装模型是 Linkerd 演进中变化最大、对运维影响最直接的方面:

CLI 安装路径

  • 早期版本通过curl https://run.linkerd.io/install | sh一键安装(stable-2.1.0~2.7.0 说明中的标准方式);
  • stable-2.4.0 引入分阶段安装:linkerd install config与linkerd install control-plane,升级对应linkerd upgrade config/linkerd upgrade control-plane;
  • stable-2.12.0 起强制分离 CRD 安装:必须先执行linkerd install --crds,再执行linkerd install;升级时先linkerd upgrade --crds再linkerd upgrade。

Helm 路径

  • stable-2.5.0 首次引入 Helm 支持;stable-2.6.0 发布公开 Helm 仓库;
  • stable-2.12.0 将原先的linkerd2Chart 拆分为linkerd-crds与linkerd-control-plane,二者以 SemVer 独立于 Linkerd 版本进行版本管理(对应仓库中的 charts/linkerd-crds 与 charts/linkerd-control-plane,各有独立的 Chart.yaml 与 Chart.lock);
  • CNI 插件 Chart 独立维护于 charts/linkerd2-cni,多集群 Chart 位于 multicluster/charts。

关键 Helm 配置值(来自仓库 charts/linkerd-control-plane/values.yaml)

CHANGES.md 中提到的部分配置值可直接在 Chart 中找到,例如policyController.probeNetworks(stable-2.12.0 引入):

# -- The networks from which probes are performed. # # By default, all networks are allowed so that all probes are authorized. probeNetworks: - 0.0.0.0/0 - "::/0"

CHANGES.md 还记录了其他重要 Helm 值,包括:

版本引入配置值作用
stable-2.12.0proxy.await控制面组件是否启用linkerd-await(现可禁用)
stable-2.12.0policyController.probeNetworks配置探测允许的来源网络
edge-23.11.4Proxy.NativeSidecar以原生 sidecar(init-container 形态)运行 proxy
edge-24.1.3createNamespaceMetadataJob控制安装时是否运行 namespace-metadata Job
edge-23.12.1identityQPS/Burst控制 identity 控制器访问 Kubernetes API 的速率
edge-23.10.1vizpodAnnotations为 Viz Prometheus Deployment 追加注解

六、CNI 与初始化:iptables 配置与自愈能力

Linkerd 通过linkerd-proxy-init(initContainer 模式)或linkerd-cni(DaemonSet 模式)完成流量重定向的 iptables 规则配置。

  • stable-2.8.0:linkerd-cni从 experimental 晋升为stable;
  • stable-2.13.0:新增network-validatorinit 容器——在启用 CNI 时于 linkerd-proxy 启动前校验本地 iptables 规则是否生效;它替代原noop容器,以nobody身份运行并丢弃全部 capabilities(对应模板见 charts/partials/templates/_network-validator.tpl);同时新增proxyInit.privileged开关控制proxy-init是否以特权进程运行;
  • edge-24.1.1:引入cni-repair-controller二进制(随 CNI 插件镜像发布),自动重启那些未收到 iptables 配置的错误 Pod;
  • edge-23.11.4:支持 Kubernetes 1.29 的native sidecar 容器(Beta),改善 proxy 相对其他容器的启停顺序,修复注入Job长期存在的关闭问题,并允许其他initContainer的流量被 proxy 接管——通过新增注解config.alpha.linkerd.io/proxy-enable-native-sidecar启用。

七、CLI 与诊断命令的持续演化

CHANGES.md 记录了 CLI 命令从无到有、从粗到精的完整过程。以下命令均在仓库 cli/cmd 目录下有对应实现(如 prune.go、inject.go、install.go、diagnostics.go 等):

引入版本命令/能力说明
stable-2.4.0linkerd install config/control-plane分阶段安装
stable-2.4.0linkerd edges细粒度 TLS 身份体系可观测
stable-2.4.0linkerd inject --enable-debug-sidecar调试 sidecar
stable-2.5.0linkerd --as、tap/top/profileRBAC 收紧用户模拟与鉴权
stable-2.5.0linkerd stat trafficsplits、-A/--all-namespaces流量拆分指标与全局查询
stable-2.6.0linkerd tap -o json(含请求/响应头)、--cluster-domain、--disable-heartbeat可观测与自定义域
stable-2.9.0linkerd inject --ingress、fish shell 补全入口控制器场景
stable-2.10.1Apple Silicon M1 二进制、linkerd repair版本感知平台与修复
stable-2.13.0linkerd prune清理不再属于 Linkerd manifests 的资源
stable-2.13.0linkerd diagnostics policy(outbound)策略诊断
edge-24.1.1linkerd diagnostics endpointsjson 输出增加 metric 标签与权重端点诊断

此外,stable-2.5.0 引入--use-wait-flag(CNI 使用 iptables-w)、--restrict-dashboard-privileges;edge-23.10.1 起linkerd viz tap支持-o jsonpath过滤字段;linkerd check在 stable-2.13.0 中新增扩展命名空间配置校验,edge-23.11.4 引入。

八、可观测性:Viz 扩展、tap 与分布式追踪

Linkerd 的遥测能力在 2.5~2.14 期间从内嵌 Prometheus 逐步走向扩展化:

  • stable-2.6.0:引入分布式追踪支持,proxy 内置 trace;新增config.linkerd.io/trace-collector注解实现按 Pod 追踪;linkerd tap新增 json 输出并暴露请求/响应头;
  • stable-2.8.0:Grafana 可被禁用并指向外部实例;Jaeger/OpenCensus 作为 add-on 配置;linkerd profile --open-api支持x-linkerd-retryable、x-linkerd-timeout注解;
  • stable-2.9.0:Prometheus 迁入 add-on(默认启用),支持禁用内置实例与BYOP(Bring-Your-Own-Prometheus)——新增global.prometheusUrlHelm 值指向外部 Prometheus;支持将指标持久化到卷而非内存;
  • stable-2.13.0:viz 新增tap.ignoredHeaders值;linkerd viz子命令新增--viz-namespace标志,避免遍历所有命名空间的权限需求;
  • stable-2.14.0:proxy 新增outbound_http_balancer_endpoints指标;linkerd viz tap支持-o jsonpath;修复 remote_write 配置导致 Prometheus 配置失效的问题。

九、性能与可靠性:Destination 控制器与 proxy 的持续打磨

CHANGES.md 中大量条目围绕Destination 控制器(服务发现)与proxy 数据面的可靠性展开,以下是几个具有代表性的问题模式:

  • 服务发现卡死类:edge-23.10.3 修复 proxy 停止读取服务发现更新时 Destination 控制器停止处理端点变更、导致流量发往陈旧端点的问题(对应 issue #11480、#11279、#10590);edge-23.12.4 修复 Pod IP 发现无限挂起的问题;
  • 背压与过载:stable-2.13.0 起 proxy 对流式更新启用时间限制;edge-23.10.3 修复 stable-2.13.0 引入的回归——proxy 不终止未使用的发现 watch,反向压迫 Destination 控制器;
  • 可观测性补强:edge-23.11.2 在 Destination 控制器新增 informer lag 直方图指标,用于跟踪被 watch 对象落后于 apiserver 的程度;edge-23.12.3 新增控制面访问 Kubernetes API 错误的计数指标;edge-24.2.3 新增 Destination 控制器 workqueue 丢弃项计数器;
  • 协议/端口语义:edge-24.2.2 修复 Server 选择器不再选中某资源时,该资源 opaque 端口未恢复默认语义的问题;edge-23.12.3 修复未网格化 Pod 且端口位于默认 opaque 列表时 profile 查询的误报;
  • 负载均衡器重构:edge-23.12.2 重构 proxy balancer——均衡变更可与请求处理解耦,fail-fast 熔断在队列上生效避免请求无限排队,并新增排队延迟直方图、failfast 状态、发现更新计数、端点池大小等指标;
  • 错误码语义:edge-24.1.3 起 Destination 控制器对不存在的服务正确返回INVALID_ARGUMENT状态码;edge-24.2.4 修复 proxy 日志与指标不一致问题。

这类修复对应的实现散落在 controller/api/destination(服务发现)与 controller/proxy-injector(注入)等目录,例如 destination 下包含opaque_ports_adaptor.go、syncronized_get_stream.go、fallback_profile_listener.go等与上述问题直接相关的模块。

十、网格外扩(Mesh Expansion):ExternalWorkload 的前瞻布局

从 edge-23.12.1 到 edge-24.2.4,CHANGES.md 记录了 ExternalWorkload(网格外扩)能力的渐进式建设:

  • edge-23.12.1:引入ExternalWorkloadCRD(支撑即将到来的网格外扩特性),对应 CRD 模板位于 charts/linkerd-crds/templates/workload;
  • edge-23.12.3:MeshTLSAuthentication校验允许 SPIFFE URI 身份;
  • edge-24.1.1/24.1.2/24.1.3:控制面与数据面逐步打通——proxy 使用 SPIRE 提供 Kubernetes 外身份,Destination 控制器新增 ExternalWorkload EndpointSlice 控制器;
  • edge-24.2.1:改进 ExternalWorkload Endpoints 控制器的 leader election 以避免漏事件、改进生成的 EndpointSlice 命名、限制单个 ExternalWorkload 的 IP 数量;
  • edge-24.2.4:ExternalWorkload CRD 升级至v1beta1,meshTls字段更名为meshTLS。

十一、Conduit 时代的遗产:v0.1.0~v18.9.x 的起点

CHANGES.md 保留了项目前身 Conduit 的早期记录,便于理解 2.x 的能力基线:

  • v0.1.0:首个公开版本,仅支持 gRPC 服务,要求 Kubernetes 1.8+;
  • v0.2.0:支持 HTTP/1.x 与原始 TCP 流量;
  • v0.1.3~v18.9.1:陆续补齐conduit check、shell 补全、tap、注入状态报告、proxy 就绪/存活探针等能力;
  • edge-18.9.2:确立edge / stable 双通道发布模式,此后版本体系沿用至今。

十二、升级实践要点

综合 CHANGES.md 中的 Upgrade notes,安全升级的关键步骤可归纳为:

  1. 读取目标版本的升级说明:每个 stable 版本都附有专属 upgrade notice(如 stable-2.14.0、2.13.0、2.12.0),升级前务必确认破坏性变更;
  2. 按顺序升级 CRD 与控制面(≥2.12):CLI 路径依次执行linkerd upgrade --crds与linkerd upgrade;Helm 路径依次升级linkerd-crds与linkerd-control-plane;
  3. 保留 mTLS 密钥:linkerd upgrade会保留既有控制面配置与 mTLS secrets(stable-2.5.0 起的标准行为);
  4. 关注镜像仓库变更:stable-2.9.0 将默认镜像仓库从gcr.io切换为ghcr.io,私有镜像同步用户需特别注意;
  5. 注意最低 Kubernetes 版本:edge-23.12.2 起最低支持 Kubernetes 1.22;
  6. 利用诊断命令验证:升级后用linkerd check、linkerd diagnostics、linkerd viz stat验证控制面健康、策略生效与流量状态。

结语

CHANGES.md 不只是一份流水账,它完整记录了 Linkerd 从"仅支持 gRPC 的实验项目"成长为"具备零信任策略、多集群直连、网格外扩能力"的生产级服务网格的每一步决策:安全上坚持默认 mTLS,策略上坚定拥抱 Gateway API 标准,安装上走向 CRD 与控制面分离的 Helm 模型,可靠性上围绕 Destination 控制器与 proxy 做了长期修复。对于正在使用或计划引入 Linkerd 的团队,这份变更记录既是版本选择的依据,也是理解当前代码库(charts、controller、multicluster、policy-controller、cli)设计动机的最佳入口。

  • 服务网格
  • 云原生
  • 可观测性

【免费下载链接】linkerd2

Ultralight, security-first service mesh for Kubernetes. Main repo for Linkerd 2.x.

项目地址:https://gitcode.com/gh_mirrors/li/linkerd2
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询