您现在的位置是:亿华云 > 应用开发
让我们一起聊聊 Linkerd Smi 扩展入门
亿华云2025-10-03 22:06:20【应用开发】5人已围观
简介文末本文转载自微信公众号「黑客下午茶」,作者为少 。转载本文请联系黑客下午茶公众号。Service Mesh Interface 是 Kubernetes 上服务网格的标准接口。它定义了一组资源,可用
文末本文转载自微信公众号「黑客下午茶」,让们作者为少 。起聊转载本文请联系黑客下午茶公众号。展入
Service Mesh Interface 是让们 Kubernetes 上服务网格的标准接口。它定义了一组资源,起聊可用于实现该资源的展入服务网格。您可以在规范中阅读有关它的让们更多信息。
https://smi-spec.io/ https://github.com/servicemeshinterface/smi-spec目前,起聊Linkerd 支持 SMI 的展入 TrafficSplit 规范, 该规范可用于在本地执行跨服务的让们流量拆分。这意味着您可以在没有任何额外组件/配置的起聊情况下应用 SMI 资源, 但这显然有一些缺点,展入因为 Linkerd 可能无法添加特定于它的让们额外特定配置, 因为 SMI 更像是起聊服务网格功能的最小公分母。
为了解决这些问题,展入Linkerd 可以使用一个适配器, 将 SMI 规范转换为它可以理解和执行操作的原生 Linkerd 配置。这也消除了与 SMI 资源与控制平面的云南idc服务商额外原生耦合, 并且适配器可以独立移动并拥有自己的发布周期。Linkerd SMI 是一个可以做到这一点的扩展。
https://www.github.com/linkerd/linkerd-smi本指南将引导您安装 SMI 扩展并配置 TrafficSplit 规范,以跨服务执行流量拆分(Traffic Splitting)。
前提条件
要使用本指南,您需要在集群上安装 Linkerd。
安装 Linkerd-SMI 扩展
CLI
通过运行以下命令安装 SMI 扩展 CLI 二进制文件:
curl -sL https://linkerd.github.io/linkerd-smi/install | sh或者,您可以直接通过发布页面下载 CLI。
https://github.com/linkerd/linkerd-smi/releases第一步是将 Linkerd-SMI 扩展安装到您的集群上。此扩展包含一个 SMI-Adaptor,可将 SMI 资源转换为原生 Linkerd 资源。
要安装 Linkerd-SMI 扩展,请运行以下命令:
linkerd smi install | kubectl apply -f -您可以通过运行以下命令来验证 Linkerd-SMI 扩展是否已正确安装:
linkerd smi checkHelm
要安装 linkerd-smi Helm chart,请运行:
helm repo add l5d-smi https://linkerd.github.io/linkerd-smi helm install l5d-smi/linkerd-smi --generate-name安装示例应用程序
首先,让我们安装示例应用程序。
# create a namespace for the sample application kubectl create namespace trafficsplit-sample # install the sample application linkerd inject https://raw.githubusercontent.com/linkerd/linkerd2/main/test/integration/trafficsplit/testdata/application.yaml | kubectl -n trafficsplit-sample apply -f -这将安装一个简单的客户端和两个服务器部署。服务器部署之一,即 faling-svc 总是返回 500 错误, 而另一个,高防服务器即 backend-svc 总是返回 200。
kubectl get deployments -n trafficsplit-sample NAME READY UP-TO-DATE AVAILABLE AGE backend 1/1 1 1 2m29s failing 1/1 1 1 2m29s slow-cooker 1/1 1 1 2m29s默认情况下,客户端将访问 backend-svc 服务。这在 edges 子命令中很明显。
linkerd viz edges deploy -n trafficsplit-sample SRC DST SRC_NS DST_NS SECURED prometheus backend linkerd-viz trafficsplit-sample √ prometheus failing linkerd-viz trafficsplit-sample √ prometheus slow-cooker linkerd-viz trafficsplit-sample √ slow-cooker backend trafficsplit-sample trafficsplit-sample √配置流量拆分
现在,让我们应用一个 TrafficSplit 资源在 backend-svc 上执行流量拆分, 以在它和 failing-svc 之间分配负载。
cat <<EOF | kubectl apply -f - apiVersion: split.smi-spec.io/v1alpha2 kind: TrafficSplit metadata: name: backend-split namespace: trafficsplit-sample spec: service: backend-svc backends: - service: backend-svc weight: 500 - service: failing-svc weight: 500 EOF因为 smi-adaptor 监视 TrafficSplit 资源, 它会自动创建相应的 ServiceProfile 资源来执行相同的操作。这可以通过检索 ServiceProfile 资源来验证。
kubectl describe serviceprofile -n trafficsplit-sample Name: backend-svc.trafficsplit-sample.svc.cluster.local Namespace: trafficsplit-sample Labels: <none> Annotations: <none> API Version: linkerd.io/v1alpha2 Kind: ServiceProfile Metadata: Creation Timestamp: 2021-08-02T12:42:52Z Generation: 1 Managed Fields: API Version: linkerd.io/v1alpha2 Fields Type: FieldsV1 fieldsV1: f:spec: .: f:dstOverrides: Manager: smi-adaptor Operation: Update Time: 2021-08-02T12:42:52Z Resource Version: 3542 UID: cbcdb74f-07e0-42f0-a7a8-9bbcf5e0e54e Spec: Dst Overrides: Authority: backend-svc.trafficsplit-sample.svc.cluster.local Weight: 500 Authority: failing-svc.trafficsplit-sample.svc.cluster.local Weight: 500 Events: <none>正如我们所见,已经创建了一个带有 DstOverrides 的相关 ServiceProfile 来执行 TrafficSplit。
可以通过运行 edges 命令来验证流量拆分。
linkerd viz edges deploy -n trafficsplit-sample SRC DST SRC_NS DST_NS SECURED prometheus backend linkerd-viz trafficsplit-sample √ prometheus failing linkerd-viz trafficsplit-sample √ prometheus slow-cooker linkerd-viz trafficsplit-sample √ slow-cooker backend trafficsplit-sample trafficsplit-sample √ slow-cooker failing trafficsplit-sample trafficsplit-sample √这也可以通过在 TrafficSplit 资源上运行 stat 子命令来验证。
linkerd viz stat ts/backend-split -n traffic-sample NAME APEX LEAF WEIGHT SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 backend-split backend-svc backend-svc 500 100.00% 0.5rps 1ms 1ms 1ms backend-split backend-svc failing-svc 500 0.00% 0.5rps 1ms 1ms 1ms这也可以通过检查 smi-adaptor 日志来验证。
kubectl -n linkerd-smi logs deploy/smi-adaptor smi-adaptor time="2021-08-04T11:04:35Z" level=info msg="Using cluster domain: cluster.local" time="2021-08-04T11:04:35Z" level=info msg="Starting SMI Controller" time="2021-08-04T11:04:35Z" level=info msg="Waiting for informer caches to sync" time="2021-08-04T11:04:35Z" level=info msg="starting admin server on :9995" time="2021-08-04T11:04:35Z" level=info msg="Starting workers" time="2021-08-04T11:04:35Z" level=info msg="Started workers" time="2021-08-04T11:05:17Z" level=info msg="created serviceprofile/backend-svc.trafficsplit-sample.svc.cluster.local for trafficsplit/backend-split" time="2021-08-04T11:05:17Z" level=info msg="Successfully synced trafficsplit-sample/backend-split"清理
通过运行以下命令删除 trafficsplit-sample 资源
kubectl delete namespace/trafficsplit-sample结论
不过,Linkerd 目前支持直接读取 TrafficSplit 资源,ServiceProfiles 总是优先于 TrafficSplit 资源。将在进一步的版本中删除对 TrafficSplit 资源的支持,在该版本中,需要 linkerd-smi 扩展以将 SMI 资源与 Linkerd 一起使用。亿华云
很赞哦!(4)