Alexander S. Gillis 2023-07-05
Linkerd 是一个开源的网络代理,作为 Kubernetes 的服务网格(service mesh)进行安装。Linkerd 最初由 Buoyant 公司开发,是最早与“服务网格”这一术语相关联的产品之一。
在 IT 领域,服务网格是一种专用的基础设施层,用于控制服务与服务之间的通信,并使应用程序的不同部分能够相互通信。服务网格通常用于基于云的应用程序、容器和微服务架构中。
在微服务应用中,管理可能多达数百个服务之间的通信会迅速变得非常复杂。Linkerd 可以作为一种云编排工具,通过提供诸如负载均衡、服务发现、代理集成与透明性、自适应路由、故障恢复、断路器(circuit breaking)以及遥测监控(instrumentation)等功能,来保障这些服务间通信的安全性。
Linkerd 是如何工作的?
Linkerd 作为一个独立的代理运行。它不依赖于特定的编程语言或库,可以在容器或微服务环境中使用。
Linkerd 最常见的两种部署模型是每主机部署(per-host)和边车模式部署(sidecar):
- 在每主机部署中,一个 Linkerd 实例被附加到一个物理或虚拟主机上,该主机上所有应用程序服务实例的流量都会通过这个 Linkerd 实例进行路由。
- 在边车部署中,每个应用程序服务实例都配备一个对应的 Linkerd 实例,这种模式特别适用于容器化应用。
Linkerd 可以通过以下三种配置方式与应用程序服务进行通信:
- 服务到 Linkerd(Service-to-linker):每个服务实例将其流量路由到对应的 Linkerd 实例,然后由该 Linkerd 实例处理后续的流量规则。
- Linkerd 到服务(Linker-to-service):Linkerd 边车接收并路由流量到对应的服务实例,而不是让服务实例直接接收流量。
- Linkerd 到 Linkerd(Linker-to-linker):结合上述两种配置,Linkerd 实例首先接收传入的流量并将其路由到对应的服务实例;而该服务实例在发送出站流量时,又会将流量回传给其对应的 Linkerd 实例。
Linkerd 的优势
Linkerd 的设计初衷是解决大规模应用程序和系统的运维与管理难题。
服务之间的交互是应用程序运行时行为的关键组成部分。通过提供一个抽象层来控制这些通信,Linkerd 为开发者提供了更高的可见性和可靠性。如果没有这样一个专用的控制层,就很难衡量和诊断应用程序的问题与故障。
Linkerd 的潜在优势包括:
- 简化微服务和容器之间服务通信的复杂性;
- 更容易记录和说明应用程序各部分之间的交互方式;
- 通过将通信逻辑与主应用程序代码解耦,提供更强的可见性和控制能力;
- 使应用管理者能够在不修改应用程序本身的情况下解决通信和机制方面的问题;
- 提供通用的服务网格功能,例如延迟感知的负载均衡、服务发现、追踪(tracing)和遥测监控(instrumentation);
- 使服务提供者能够选择最适合其服务的编程语言;
- 使应用程序代码更加高效,并更易于扩展。
Linkerd 与 Istio 的比较
Istio 是由 Google、IBM 和 Lyft 提供的开源服务网格,被设计为一种通用的控制平面。尽管 Istio 最初是为 Kubernetes 开发的,但后来已扩展支持多种平台。
Istio 的功能包括负载均衡、身份与密钥管理、故障注入、混合部署、服务间认证、监控和日志记录。此外,Istio 还提供自动边车注入功能,可自动将边车代理添加到用户创建的 Pod 中。
Linkerd 和 Istio 都是构建基础服务网格的合适选项。Istio 的功能集比 Linkerd 更丰富,这使其在更复杂的配置场景中具有优势。然而,Istio 的学习曲线较陡峭,用户体验也相对不够友好。例如,Istio 的控制平面配置较为复杂。不过,如果坚持使用 Istio 的默认选项和设置,用户的使用体验会相对轻松一些。