Linkerd 最新的 2.12 版本已经发布了,这个庞大的版本为 Linkerd 引入了基于路由的策略,允许用户以完全零信任的方式定义和执行基于 HTTP 路由的授权策略。这些策略建立在 Linkerd 强大的工作负载身份之上,由双向 TLS 保护,并使用 Kubernetes 新推出的 Gateway API
的类型进行配置。
更新日志
Linkerd 2.12 是采用 Gateway API
作为核心配置机制的第一步。虽然这个 API 对于服务网格用例来说还不是完美的,但它为这个版本提供了一个强大的起点,更重要的是,在 Gateway API 的基础上构建将使我们能够将特定于 Linkerd 的配置对象的数量保持在最低限度,即使我们引入了新功能。这是我们为 Kubernetes 成为最简单和最轻量的服务网格的目标的重要组成部分。此外 2.12 版本还引入了访问日志记录,这是一个期待已久的功能,允许 Linkerd 生成 Apache 样式的请求日志。它增加了对 iptables-nft
的支持,并引入了许多其他改进和性能增强。
Per-route 策略
Linkerd 的新的 per-route 策略扩展了现有的基于端口的策略,对服务如何被允许相互通信进行更精细的控制。这些策略是为采取零信任安全方法的组织设计的,这种方法不仅需要加密,还需要强大的工作负载身份和明确的授权。
- 将网络视为对抗性的:它们不依赖 IP 地址,也不要求 CNI 层或底层网络的任何其他方面是安全的。
- 使用安全的工作负载身份:Linkerd 的工作负载身份是由 ServiceAccounts 自动生成的,并在连接时通过双向 TLS 进行加密验证。
- 在 Pod 级别上强制执行:每个连接和每个请求都经过验证。
- 很容易的允许模式:有安全意识的采用者可以很容易地默认拒绝对敏感资源的访问,除非明确允许("最小特权原则")。
默认拒绝配置在 Kubernetes 中可能会有一些问题,因为 health 和 readiness 探针状态需要在没有授权的情况下通过。在 Linkerd 2.12 中,health 和 readiness 状态探测现在是默认授权的,但也可以明确授权,同时仍然锁定其他应用端点。
Gateway API
Linkerd 2.12 提供了支持 Kubernetes Gateway API 的第一步。虽然 Gateway API 最初是作为 Kubernetes 中长期存在的 Ingress 资源的一个更丰富、更灵活的替代品而设计的,但它为描述服务网状流量提供了一个很好的基础,并允许 Linkerd 将其增加的配置保持在最低水平。
在 Linkerd 2.12 中,Linkerd 提供了 Gateway API 的部分实现来配置 Linkerd 的基于路由的策略。这样我们就可以开始使用 Gateway API,而不用实现规范中对 Linkerd 没有意义的部分。随着 Gateway API 的发展,也会慢慢地更好满足 Linkerd 的需求。
访问日志
Linkerd 2.12 还引入了访问日志记录,它允许代理发出 Apache 样式的请求日志。出于性能和资源利用率的原因,此功能默认关闭(尤其是对于高流量工作负载),但也可以在需要它的情况下轻松启用。
其他更新
Linkerd 2.12 还有大量的其他改进、性能提升和错误修复,包括:
- 一个新的
config.linkerd.io/shutdown-grace-period
注解,用于配置代理的最大宽限期,以便优雅地关闭。 - 一个新的
iptables-nft
模式,用于 Linkerd 的 init 容器中的iptables-nft
支持。 - 修复了某些控制平面组件在信任根轮换后未按要求重启的问题。
- 修正了当在 Linkerd 命名空间中发现意外的 Pod 时,
linkerd check
命令崩溃的问题。 - 修改了
proxy.await
的 Helm 值,这样用户就可以在控制平面组件上禁用linkerd-await
。 - 注释,允许 Linkerd 扩展部署在必要时被自动缩放器驱逐。
- 能够在独立模式下运行
Linkerd CNI
插件。 - 多集群扩展中的 ServiceAccount token Secret,支持 Kubernetes 版本>= v1.24。
升级
现在我们将集群中的 Linkerd 升级到最新的 2.12 版本。
首先需要更新 Linkerd CLI 工具,执行如下所示的命令即可:
代码语言:javascript复制$ curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
这会将你的本地 CLI 升级到最新版本。当然我们有可以通过 Linkerd 的 Release 页面直接下载对应平台的 CLI 安装包。
代码语言:javascript复制$ wget https://github.91chi.fun/https://github.com//linkerd/linkerd2/releases/download/stable-2.12.0/linkerd2-cli-stable-2.12.0-darwin-arm64
$ sudo mv linkerd2-cli-stable-2.12.0-darwin-arm64 /usr/local/bin/linkerd
$ chmod x /usr/local/bin/linkerd
验证 CLI 已安装并正确运行:
代码语言:javascript复制$ linkerd version
Client version: stable-2.12.0
Server version: stable-2.11.1
可以看到 CLI 升级成功了,由于控制平面还没升级,所以看到的还是现在的 2.11.1 版本。
接下来就可以升级 Kubernetes 集群上的 Linkerd 控制平面了,不用担心,现有的数据平面将继续使用更新版本的控制平面运行,并且你的网格服务不会出现故障。
如果你使用的是 viz 插件自带的 Prometheus 组件,那么升级后数据会丢失,如果你配置的外置的 Prometheus 则不用担心该问题。
Linkerd SMI 扩展
如果你使用 CLI 安装了 Linkerd 2.11.x,并且正在使用 TrafficSplit CRD,则需要注意丢失 TS 的 CR,如果你不使用此 CRD,则可以忽略该注意事项。
TrafficSplit CRD 不再随 Linkerd 2.12.0 提供,而是由 Linkerd SMI
扩展提供。
同样首先从 Release 页面下载对应的可执行包:
代码语言:javascript复制$ wget https://github.91chi.fun/https://github.com//linkerd/linkerd-smi/releases/download/v0.2.0/linkerd-smi-0.2.0-darwin-arm64
$ chmod x linkerd-smi-0.2.0-darwin-arm64
$ sudo mv linkerd-smi-0.2.0-darwin-arm64 /usr/local/bin/linkerd-smi
$ linkerd-smi version
v0.2.0
同样 Linkerd SMI 也可以通过 CLI 工具进行安装,此扩展包含一个 SMI-Adaptor
,它将 SMI 资源转换为本地 Linkerd 资源。
$ linkerd smi install | kubectl apply -f -
$ linkerd smi check
此外也可以通过下面的 Helm 方式来安装 Linkerd SMI 扩展。但在安装该扩展之前,你需要在 CRD 中添加以下注释和标签,以便 linkerd-smi
chart 可以采用它:
$ kubectl annotate --overwrite crd/trafficsplits.split.smi-spec.io
meta.helm.sh/release-name=linkerd-smi
meta.helm.sh/release-namespace=linkerd-smi
# 添加smi repo仓库
$ helm repo add l5d-smi https://linkerd.github.io/linkerd-smi
$ helm upgrade --install linkerd-smi -n linkerd-smi --create-namespace l5d-smi/linkerd-smi
Release "linkerd-smi" has been upgraded. Happy Helming!
NAME: linkerd-smi
LAST DEPLOYED: Sun Sep 11 14:54:02 2022
NAMESPACE: linkerd-smi
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Linkerd SMI extension was successfully installed