您现在的位置是:亿华云 > 应用开发

让我们一起聊聊 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 check 

Helm

要安装 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)