- 服务网格
- 云原生
- 可观测性
【免费下载链接】linkerd2
Ultralight, security-first service mesh for Kubernetes. Main repo for Linkerd 2.x.
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(完整变更清单),多数版本还附有贡献者致谢名单。
| 版本通道 | 示例版本 | 定位 | 变更记录特征 |
|---|---|---|---|
| edge | edge-24.2.5 | 快速迭代、尝鲜 | 条目较短,聚焦增量修复 |
| stable | stable-2.14.0 | 生产可用 | 含概述、升级说明、完整清单 |
| RC | stable-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.0 | proxy.await | 控制面组件是否启用linkerd-await(现可禁用) |
| stable-2.12.0 | policyController.probeNetworks | 配置探测允许的来源网络 |
| edge-23.11.4 | Proxy.NativeSidecar | 以原生 sidecar(init-container 形态)运行 proxy |
| edge-24.1.3 | createNamespaceMetadataJob | 控制安装时是否运行 namespace-metadata Job |
| edge-23.12.1 | identityQPS/Burst | 控制 identity 控制器访问 Kubernetes API 的速率 |
| edge-23.10.1 | vizpodAnnotations | 为 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.0 | linkerd install config/control-plane | 分阶段安装 |
| stable-2.4.0 | linkerd edges | 细粒度 TLS 身份体系可观测 |
| stable-2.4.0 | linkerd inject --enable-debug-sidecar | 调试 sidecar |
| stable-2.5.0 | linkerd --as、tap/top/profileRBAC 收紧 | 用户模拟与鉴权 |
| stable-2.5.0 | linkerd stat trafficsplits、-A/--all-namespaces | 流量拆分指标与全局查询 |
| stable-2.6.0 | linkerd tap -o json(含请求/响应头)、--cluster-domain、--disable-heartbeat | 可观测与自定义域 |
| stable-2.9.0 | linkerd inject --ingress、fish shell 补全 | 入口控制器场景 |
| stable-2.10.1 | Apple Silicon M1 二进制、linkerd repair版本感知 | 平台与修复 |
| stable-2.13.0 | linkerd prune | 清理不再属于 Linkerd manifests 的资源 |
| stable-2.13.0 | linkerd diagnostics policy(outbound) | 策略诊断 |
| edge-24.1.1 | linkerd 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,安全升级的关键步骤可归纳为:
- 读取目标版本的升级说明:每个 stable 版本都附有专属 upgrade notice(如 stable-2.14.0、2.13.0、2.12.0),升级前务必确认破坏性变更;
- 按顺序升级 CRD 与控制面(≥2.12):CLI 路径依次执行
linkerd upgrade --crds与linkerd upgrade;Helm 路径依次升级linkerd-crds与linkerd-control-plane; - 保留 mTLS 密钥:
linkerd upgrade会保留既有控制面配置与 mTLS secrets(stable-2.5.0 起的标准行为); - 关注镜像仓库变更:stable-2.9.0 将默认镜像仓库从
gcr.io切换为ghcr.io,私有镜像同步用户需特别注意; - 注意最低 Kubernetes 版本:edge-23.12.2 起最低支持 Kubernetes 1.22;
- 利用诊断命令验证:升级后用
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.
相关推荐
actix-web 版本演进全景解读:从 CHANGES.md 看 Actix Web 4.x 核心 API 变迁与升级指南
actix web 版本演进全景解读:从 CHANGES.md 看 Actix Web 4.x 核心 API 变迁与升级指南 导读 本文以 actix web
后端Web框架PyTorch Lightning 版本演进全解析:从 CHANGELOG 读懂 2.x 时代的架构变迁与升级策略
PyTorch Lightning 版本演进全解析:从 CHANGELOG 读懂 2.x 时代的架构变迁与升级策略 本文以仓库内 src/lightning/p
人工智能深度学习机器学习预训练分布式训练微调MessageKit 版本演进全解读:从 CHANGELOG 看 Swift 聊天 UI 框架的 4.x 架构变迁与升级路径
MessageKit 版本演进全解读:从 CHANGELOG 看 Swift 聊天 UI 框架的 4.x 架构变迁与升级路径 本文以仓库根目录 CHANGELO
即时通讯移动开发UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考