Linkerd
Linkerd 是一个面向云原生应用的 Service Mesh 组件,也是 CNCF 项目之一。它为服务间通信提供了一个统一的管理和控制平面,并且解耦了应用程序代码和通信机制,从而无需更改应用程序就可以可视化控制服务间的通信。linkerd 实例是无状态的,可以以每个应用一个实例 (sidecar) 或者每台 Node 一个实例的方式部署。

Linkerd 的主要特性包括
服务发现
动态请求路由
HTTP 代理集成,支持 HTTP、TLS、gRPC、HTTP/2 等
感知时延的负载均衡,支持多种负载均衡算法,如 Power of Two Choices (P2C) Least Loaded、Power of Two Choices (P2C) peak ewma、Aperture: least loaded、Heap: least loaded、Round robin 等
熔断机制,自动移除不健康的后端实例,包括 fail fast(只要连接失败就移除实例)和 failure accrual(超过 5 个请求处理失败时才将其标记为失效,并保留一定的恢复时间 )两种
分布式跟踪和度量

Linkerd 原理
Linkerd 路由将请求处理分解为多个步骤
(1) IDENTIFICATION:为实际请求设置逻辑名字(即请求的目的服务),如默认将 HTTP 请求
GET http://example/hello赋值名字/svc/example(2) BINDING:dtabs 负责将逻辑名与客户端名字绑定起来,客户端名字总是以
/#或/$开头,比如
(3) RESOLUTION:namer 负责解析客户端名,并得到真实的服务地址(IP + 端口)
(4) LOAD BALANCING:根据负载均衡算法选择如何发送请求

Linkerd 部署
Linkerd 以 DaemonSet 的方式部署在每个 Node 节点上:
默认情况下,Linkerd 的 Dashboard 监听在每个容器实例的 9990 端口(注意未在 l5d 服务中对外暴露),可以通过服务的相应端口来访问。
Grafana 和 Prometheus
TLS
Zipkin
NAMERD
Ingress Controller
Linkerd 也可以作为 Kubernetes Ingress Controller 使用,注意下面的步骤将 Linkerd 部署到了 l5d-system namespace。
然后通过 kubernetes.io/ingress.class: "linkerd" annotation 使用 linkerd ingress 控制器:
更多使用方法见这里。
应用示例
可以通过 HTTP 代理和 linkerd-inject 等两种方式来使用 Linkerd。
HTTP 代理
应用程序在使用 Linkerd 时需要为应用设置 HTTP 代理,其中
HTTP 使用
$(NODE_NAME):4140HTTP/2 使用
$(NODE_NAME):4240gRPC 使用
$(NODE_NAME):4340
在 Kubernetes 中,可以使用 Downward API 来获取 NODE_NAME,比如
linkerd-inject
参考文档
最后更新于