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
參考文檔
Last updated