了解 Linkerd Service Mesh 架構
本文轉載自微信公眾號「黑客下午茶」,作者為少 。轉載本文請聯系黑客下午茶公眾號。
從較高的層次上看,Linkerd 由一個控制平面(control plane) 和一個 數據平面(data plane) 組成。
控制平面是一組服務,提供對 Linkerd 整體的控制。
數據平面由在每個服務實例“旁邊”運行的透明微代理(micro-proxies)組成,作為 Pod 中的 sidecar。這些代理會自動處理進出服務的所有 TCP 流量,并與控制平面進行通信以進行配置。
Linkerd 還提供了一個 CLI,可用于與控制平面和數據平面進行交互。
系列
中文手冊(https://hacker-linner.com)
CLI
Linkerd CLI 通常在集群外部運行(例如在您的本地機器上),用于與 Linkerd 交互。
控制平面(control plane)
Linkerd 控制平面是一組在專用 Kubernetes 命名空間(默認為 linkerd)中運行的服務。控制平面有幾個組件,列舉如下。
目標服務(destination)
數據平面代理使用 destination 服務來確定其行為的各個方面。它用于獲取服務發現信息(即發送特定請求的位置和另一端預期的 TLS 身份);獲取有關允許哪些類型的請求的策略信息;獲取用于通知每條路由指標、重試和超時的服務配置文件信息;和更多其它有用信息。
身份服務(identity)
identity 服務充當 TLS 證書頒發機構, 接受來自代理的 CSR 并返回簽名證書。這些證書在代理初始化時頒發,用于代理到代理連接以實現 mTLS。
代理注入器(proxy injector)
proxy injector 是一個 Kubernetes admission controller,它在每次創建 pod 時接收一個 webhook 請求。此 injector 檢查特定于 Linkerd 的 annotation(linkerd.io/inject: enabled)的資源。當該 annotation 存在時,injector 會改變 pod 的規范, 并將 proxy-init 和 linkerd-proxy 容器以及相關的啟動時間配置添加到 pod 中。
數據平面(data plane)
Linkerd 數據平面包含超輕型微代理,這些微代理部署為應用程序 Pod 內的 sidecar 容器。由于由 linkerd-init(或者,由 Linkerd 的 CNI 插件)制定的 iptables 規則, 這些代理透明地攔截進出每個 pod 的 TCP 連接。
代理(Linkerd2-proxy)
Linkerd2-proxy 是一個用 Rust 編寫的超輕、透明的微代理。 Linkerd2-proxy 專為 service mesh 用例而設計,并非設計為通用代理。
代理的功能包括:
- HTTP、HTTP/2 和任意 TCP 協議的透明、零配置代理。
- HTTP 和 TCP 流量的自動 Prometheus 指標導出。
- 透明、零配置的 WebSocket 代理。
- 自動、延遲感知、第 7 層負載平衡。
- 非 HTTP 流量的自動第 4 層負載平衡。
- 自動 TLS。
- 按需診斷 Tap API。
- 還有更多。
代理支持通過 DNS 和目標 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/
Linkerd init 容器
linkerd-init 容器作為 Kubernetes init 容器 添加到每個網格 pod 中,該容器在任何其他容器啟動之前運行。它使用 iptables 通過代理將所有 TCP 流量,進出 Pod 的所有流量。
- https://kubernetes.io/docs/concepts/workloads/pods/init-containers/