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):4140

  • HTTP/2 使用 $(NODE_NAME):4240

  • gRPC 使用 $(NODE_NAME):4340

在 Kubernetes 中,可以使用 Downward API 來獲取 NODE_NAME,比如

linkerd-inject

參考文檔

Last updated