Linkerd是云原生软件公司Buoyant推出的开源项目,是全球范围内第一个完善的Service Mesh项目。Linkerd作为下一代云应用的基础网络层,通过自动化负载均衡、服务发现和运行时恢复能力等诸多特性,使得企业能够在不牺牲可靠性的情况下将其计算架构平滑地从单体服务转移到微服务架构。

一、主要特性

Linkerd提供如下主要特性。

1)高性能、高扩展性的集群通信能力。每秒以最小的时延及负载处理万级数量的请求,Linkerd 2.0的数据平面当前大小仅为10MB左右,并且99.9%的请求耗时小于1ms;部署方便,业务代码和配置不需要任何修改,特别方便水平扩展。

2)支持多种服务发现方式,并且扩展非常方便。支持各种服务发现机制,如基于文件(File-based)、ZooKeeper、Consul及Kubernetes;增加自定义的服务发现机制比较方便,扩展性强。

3)强大的负载均衡算法支持。推荐使用基于感知时延的负载均衡算法,通过实时统计数据RPC延迟、要处理请求队列大小决定如何分发请求,反馈实时性强,能够根据当前的实时压力情况调整负载;内置多种负载均衡算法,可以根据实际场景灵活选用。

4)完善的多协议支持。支持HTTP 2.0、HTTP 1.1、gRPC、Thrift多种协议。

5)动态路由。针对HTTP协议,支持多种路由策略;支持动态路由机制,可以通过动态修改路由规则实现蓝绿部署、金丝雀部署、流量迁移等;

6)内置完善的log/Metric/Trace。Linkerd通过收集服务间通信的各种统计数据,构建起强大的仪表盘,具体包含每个服务当前的运行状态,请求的成功率,系统的实时拓扑等。

7)多平台支持。Linkerd通过收集服务间通信的各种统计数据,构建起强大的仪表盘,具体包含每个服务当前的运行状态,请求的成功率,系统的实时拓扑等。

二、路由机制

路由机制是Linkerd的核心,Linkerd的主要工作就是收到一个请求消息,然后将该请求消息转发到合适的目的节点,这个过程中主要由服务识别(Identification)、绑定(Binding)、解析(Resolution)和负载均衡4个主要步骤组成,其中识别、绑定、解析属于路由管理的范畴。

初识Linkerd项目_Linkerd

Linkerd路由工作机制示意图识别是指根据请求确定请求调用服务的过程,识别阶段的输出是service name,识别过程是根据识别类型,从请求消息生成一个特定的字符串,这个字符串与随后和这个请求关联,Linkerd路由会有一个默认前缀/svc,Linkerd会将默认前缀加上这个字符串作为本次请求的路由标识往后传递,对于HTTP请求来说,Linkerd默认情况下使用一个io.l5d.header.token类型的标识,它使用HTTP请求头中的Host字段作为标识,比如curl-H"Host:data"http://example/hello,路由标识时被转换为/svr/data。同时,识别是一个可扩展的插件,用户可以使用自定义的识别逻辑,将请求按照自己的意愿转换到相应的识别。

通过识别阶段确定了service name之后,由dtab组件根据service name绑定,确定目标服务的集群名称。绑定阶段输出的是client name,client name是目标集群的名称,类似于DNS的域名,和service name只包含目标服务信息不同,client name中还包含集群、区域以及环境等信息。

dtab负责对绑定规则进行管理,比如dtab规则配置如下:/svc=>/#/io.l5d.fs,我们的/svc/test被转换为:/#/io.l5d.fs/test,client name一般以“/$”或者“/#”开头。绑定是Linkerd中变化非常多的一个阶段,Linkerd中的很多场景需求,比如蓝绿测试、小流量灰度等均通过绑定来实现。解析是服务发现的过程,通过named组件将目标集群名称client name转换成一组可用的节点,Linkerd会通过配置文件配置当前使用的服务发现方式,确定服务发现方式后,就可以根据client name,从服务发现中获取节点信息。

三、核心架构

架构层面,Linkerd也是分为控制平面和数据平面,其中控制平面由下面几个部分组成。

1)Controller控制器:控制器由负责不同控制功能的多个容器组成,主要包括public-api、proxy-api、destination和tap,其中public-api负责Linkerd对外的API交互;

2)Web:Web是Linkerd提供的仪表板;

3)Prometheus:Prometheus负责Linkerd Metric信息的收集和存储;

4)Grafana:Grafana负责Linkered的可视化。

Linkered的数据平面采用的是Rust语言实现的轻量级高性能Proxy代理,通过配置Iptables,它可以透明地管理Kubernetes Pod的入口和出口流量,甚至可以对一个正在运行中的服务透明无感知地添加Linkered代理。Linkered支持HTTP、HTTP/2和TCP协议,通过按需诊断tap API,Linkered拥有强大的可视化监控和诊断能力。

从Linkered的整体架构看,Linkered已经完全舍弃了打造Service Mesh平台的想法,内置具体的统计和可视化组件,聚焦为用户提供开箱即可的Service Mesh能力,当前Linkered确实已经非常轻量,对于没有特别要求的通用场景,Linkered还是一个不错的选择。