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