本文目录导读:

Linkerd 是一个轻量级、高性能的服务网格(Service Mesh)实现,它的核心目标是解决微服务架构中的通信问题,比如可观测性、安全性和可靠性,它的设计哲学是“Keep it simple”(保持简单),相比于 Istio 等其它服务网格,Linkerd 的部署、管理和资源占用都更轻量。
Linkerd 通过在每个微服务旁边部署一个透明的“代理”(sidecar 代理)来工作,所有服务之间的流量都会被这个代理拦截,从而在不修改应用代码的情况下,实现各种高级功能。
下面从几个方面详细解释 Linkerd 是如何实现服务网格的:
核心工作原理:数据平面与控制平面
Linkerd 架构分为两大部分:
-
数据平面:
- 本质上是每个 Pod 中运行的一个轻量级代理(通常是
linkerd-proxy,基于 Rust 语言编写,性能和安全性很高)。 - 这个代理接管所有进出该 Pod 的网络流量,它不会修改你的应用代码,但它是一个透明的中间人。
- 关键功能:
- HTTP/2 和 gRPC 代理:自动将流量升级到更高效的 HTTP/2 或 gRPC 协议。
- mTLS:自动为服务间通信启用双向TLS加密,保证通信安全。
- 负载均衡:基于延迟、成功率等动态指标进行智能负载均衡。
- 熔断、重试、超时:增强服务调用的可靠性。
- 指标收集:收集请求延迟、成功率、流量量等关键指标。
- 本质上是每个 Pod 中运行的一个轻量级代理(通常是
-
控制平面:
- 一组独立的微服务,负责管理和配置整个网格。
- 核心组件:
destination:服务发现和路由决策的中心,它告诉代理应该把请求发送到哪里。identity:证书颁发机构(CA),负责管理 mTLS 所需的证书和密钥。proxy-injector:自动将 Linkerd 代理注入到新的 Pod 中(通过准入控制器)。tap:允许查看实时请求和响应流,用于调试。web:提供基于浏览器的 Dashboard。controller:控制平面的大脑,协调各个组件。
Linkerd 如何实现关键功能?
-
服务发现与路由:
- Linkerd 不使用 Kubernetes 原生的 kube-proxy(这是它和很多其他服务网格的关键区别),它通过自己高性能的
destination服务(基于 gRPC)直接与 Kubernetes API Server 通信,获取服务端点信息。 - 当一个服务(Service A)想要调用另一个服务(Service B)时:
- Service A 的 Linkerd 代理拦截了这个请求(目标可能是
http://service-b:8080)。 - 代理向控制平面的
destination服务询问service-b的当前所有健康端点 (Pod IP)。 destination服务返回一个动态更新的端点列表(考虑了负载均衡权重、健康检查、端点失败等)。- 代理根据负载均衡算法(如EWMA,指数加权移动平均)选择一个最佳端点,然后建立连接并转发请求。
- Service A 的 Linkerd 代理拦截了这个请求(目标可能是
- Linkerd 不使用 Kubernetes 原生的 kube-proxy(这是它和很多其他服务网格的关键区别),它通过自己高性能的
-
安全性(mTLS):
- 这是 Linkerd 的核心卖点之一。
- 它默认启用端到端的双向 TLS(mTLS)。
- 工作原理:
- 控制平面的
identity组件充当 CA,为每个 Pod 或工作负载签发短期证书。 - 当服务 A 的代理连接到服务 B 的代理时,它们会进行 TLS 握手。
- 双方验证彼此的身份(证明自己是合法的服务 A 和服务 B),这确保了流量只能在被授权和受信任的服务之间流动,阻止了中间人攻击和未经授权的访问。
- 所有通信在此过程中自动加密,无需修改应用代码或管理证书。
- 控制平面的
-
可靠性(熔断、重试、超时):
- 这些功能直接在 Linkerd 代理中实现,非常高效。
- 重试:代理可以自动重试失败的请求(网络闪断或服务临时不可用),Linkerd 会检测“幂等”请求(即重试不会造成副作用的请求,如GET请求)并安全地重试。
- 熔断:如果目标服务持续失败(响应时间过长或出现5xx错误),Linkerd 会主动切断到该服务的连接,避免“雪崩效应”,它通过监控后端服务的“失败率”来决定何时断开连接、何时尝试重新连接。
- 超时:可以为请求设置超时时间,如果某个处理超出了这个时间,代理会主动关闭连接,避免请求无限期挂起。
-
可观测性:
- Linkerd 默认生成非常丰富的黄金指标(RED指标:Rate, Errors, Duration)。
- 它会自动收集所有服务间通信的以下数据:
- 请求速率 (RPS):每秒请求数。
- 错误率:5xx 错误率。
- 延迟分布 (P50, P95, P99):请求处理时间的百分位数。
- 这些数据通过
linkerd viz插件(一个可选组件)聚合,并提供:- Web Dashboard:一个漂亮的界面,显示服务拓扑、每个服务的健康状态、延迟等。
- Prometheus & Grafana:数据可以导出到标准的可观测性栈中。
linkerd tap:允许实时查看(抓包)流经网格的请求和响应,这对调试非常有用。
-
故障注入与流量拆分:
- 虽然不如 Istio 的 VirtualService 功能丰富,但 Linkerd 提供了流量拆分功能,用于金丝雀发布和 A/B 测试。
- 你可以将一部分流量(10%)指向服务的一个新版本,观察其行为,而无需直接修改路由规则,这通过
ServiceProfile资源和TrafficSplitCRD(自定义资源定义)实现。
与 Istio 的主要区别
| 特性 | Linkerd | Istio |
|---|---|---|
| 设计哲学 | 极简、轻量,专注于核心功能。 | 功能丰富、强大,提供了非常多的功能,更重量级。 |
| 代理 | 基于 Rust 的 linkerd-proxy,更轻量、更安全、性能更优。 |
基于 Envoy(C++编写),功能强大但资源消耗相对较高。 |
| 学习曲线 | 非常简单,概念少,命令少,易于上手。 | 陡峭,概念多(Gateway, VirtualService, DestinationRule等),配置复杂。 |
| 安全性 | 默认开启 mTLS,开箱即用,零配置。 | mTLS 默认开启,但需要配置全局或命名空间策略。 |
| 服务发现 | 直接与 Kubernetes API 通信,绕过 kube-proxy。 | 使用 Envoy 和 Pilot,与 Kubernetes API 和 Istio 自身组件交互。 |
| 核心特性 | 侧重:可观测性、可靠性(重试、熔断)、安全(mTLS)。 | 侧重:高级流量管理(路由、分流、故障注入)、安全策略(鉴权、灾备)、多集群支持。 |
| 资源开销 | 极低,通常每个代理消耗很少的 CPU 和内存。 | 较高,Enovy 代理和 Istio 控制平面消耗资源更多。 |
| 社区与成熟度 | CNCF 毕业项目,非常成熟,在中小型和大型企业中均有大量应用。 | CNCF 毕业项目,成熟度很高,是业界功能最丰富的服务网格。 |
Linkerd 适合谁?
- 微服务数量中等(几十到几百个),但希望快速获得服务网格的核心价值(可观测性、安全、可靠性)的团队。
- 对性能敏感、资源预算有限的团队(每个 Pod 额外消耗的资源极少)。
- 希望零配置或极简配置就能开启安全的 mTLS 的团队。
- 团队规模不大,希望服务网格简单易用、运维成本低的团队。
不适合的场景:
- 需要非常复杂、细粒度的流量管理(如基于 URI、Header、Cookie 的路由,复杂的故障注入)。
- 需要多集群、多网络环境的强一致性策略管理。
- 对Envoy 生态有深度依赖的团队。
Linkerd 通过在 Pod 中部署一个 极轻量、基于 Rust 的代理,透明地拦截所有服务间流量,自动实现 mTLS 加密、动态负载均衡、指标监控、自动重试和熔断,并且这一切几乎不需要修改你的应用代码,它的核心理念是:简单、快速、安全。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播