從較高的層次上看,<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/