天天看点

了解 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/