天天看點

了解 Linkerd Service Mesh 架構

從較高的層次上看,<code>Linkerd</code> 由一個控制平面(control plane) 和一個 資料平面(data plane) 組成。

控制平面是一組服務,提供對 <code>Linkerd</code> 整體的控制。

資料平面由在每個服務執行個體<code>“旁邊”</code>運作的透明微代理(micro-proxies)組成,作為 <code>Pod</code> 中的 <code>sidecar</code>。

這些代理會自動處理進出服務的所有 <code>TCP</code> 流量,并與控制平面進行通信以進行配置。

<code>Linkerd</code> 還提供了一個 CLI,可用于與<code>控制平面</code>和<code>資料平面</code>進行互動。

中文手冊(https://hacker-linner.com)

<code>Linkerd CLI</code> 通常在叢集外部運作(例如在您的本地機器上),用于與 <code>Linkerd</code> 互動。

Linkerd <code>控制平面</code>是一組在專用 <code>Kubernetes</code> 命名空間(預設為 <code>linkerd</code>)中運作的服務。

控制平面有幾個元件,列舉如下。

<code>資料平面代理</code>使用 <code>destination</code> 服務來确定其行為的各個方面。

它用于擷取服務發現資訊(即發送特定請求的位置和另一端預期的 <code>TLS</code> 身份);

擷取有關允許哪些類型的請求的<code>政策</code>資訊;

擷取用于通知<code>每條路由名額</code>、<code>重試</code>和<code>逾時</code>的服務配置檔案資訊;和更多其它有用資訊。

<code>identity</code> 服務充當 TLS 證書頒發機構,

接受來自代理的 CSR 并傳回簽名證書。

這些證書在代理初始化時頒發,用于代理到代理連接配接以實作 <code>mTLS</code>。

<code>proxy injector</code> 是一個 Kubernetes <code>admission controller</code>,它在每次建立 <code>pod</code> 時接收一個 <code>webhook</code> 請求。

此 <code>injector</code> 檢查特定于 <code>Linkerd</code> 的 <code>annotation</code>(<code>linkerd.io/inject: enabled</code>)的資源。

當該 <code>annotation</code> 存在時,<code>injector</code> 會改變 <code>pod</code> 的規範,

并将 <code>proxy-init</code> 和 <code>linkerd-proxy</code> 容器以及相關的啟動時間配置添加到 <code>pod</code> 中。

<code>Linkerd 資料平面</code>包含超輕型<code>微代理</code>,這些<code>微代理</code>部署為應用程式 <code>Pod</code> 内的 <code>sidecar</code> 容器。

由于由 <code>linkerd-init</code>(或者,由 <code>Linkerd</code> 的 <code>CNI</code> 插件)制定的 <code>iptables</code> 規則,

這些代理透明地攔截<code>進出</code>每個 <code>pod</code> 的 <code>TCP</code> 連接配接。

<code>Linkerd2-proxy</code> 是一個用 Rust 編寫的超輕、透明的<code>微代理</code>。

<code>Linkerd2-proxy</code> 專為 <code>service mesh</code> 用例而設計,并非設計為通用代理。

代理的功能包括:

<code>HTTP</code>、<code>HTTP/2</code> 和任意 <code>TCP</code> 協定的透明、零配置代理。

<code>HTTP</code> 和 <code>TCP</code> 流量的自動 <code>Prometheus</code> 名額導出。

透明、零配置的 <code>WebSocket</code> 代理。

自動、延遲感覺、第 <code>7</code> 層負載平衡。

非 <code>HTTP</code> 流量的自動第 <code>4</code> 層負載平衡。

自動 <code>TLS</code>。

按需診斷 <code>Tap API</code>。

還有更多。

代理支援通過 <code>DNS</code> 和目标 gRPC API 進行服務發現。

https://github.com/linkerd/linkerd2-proxy-api

您可以在此處閱讀有關這些微代理的更多資訊:

為什麼 Linkerd 不使用 Envoy

https://linkerd.io/2020/12/03/why-linkerd-doesnt-use-envoy/

Linkerd 最先進的 Rust 代理 Linkerd2-proxy

https://linkerd.io/2020/07/23/under-the-hood-of-linkerds-state-of-the-art-rust-proxy-linkerd2-proxy/

<code>linkerd-init</code> 容器作為

Kubernetes init 容器

添加到每個網格 <code>pod</code> 中,該容器在任何其他容器啟動之前運作。

它使用 <code>iptables</code> 通過代理将所有 <code>TCP</code> 流量,進出 <code>Pod</code> 的所有流量。

https://kubernetes.io/docs/concepts/workloads/pods/init-containers/