初识 Linkerd 项目
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 路由工作机制示意图识别是指根据请求确定请求调用服务的过程,识别阶段的输出是 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 还是一个不错的选择。
版权声明: 本文为 InfoQ 作者【阿泽🧸】的原创文章。
原文链接:【http://xie.infoq.cn/article/e981a14bb52b9e9ffcff7b932】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论