Linkerd SMI 扩展入门
内容整理来自于官方文档
Service Mesh Interface 是 Kubernetes
上服务网格的标准接口。它定义了一组资源,可用于实现该资源的服务网格。您可以在规范中阅读有关它的更多信息。
- https://smi-spec.io/
- https://github.com/servicemeshinterface/smi-spec
目前,Linkerd
支持 SMI
的 TrafficSplit
规范, 该规范可用于在本地执行跨服务的流量拆分。这意味着您可以在没有任何额外组件/配置
的情况下应用 SMI
资源, 但这显然有一些缺点,因为 Linkerd
可能无法添加特定于它的额外特定配置, 因为 SMI
更像是服务网格功能的最小公分母
。
为了解决这些问题,Linkerd
可以使用一个适配器, 将 SMI
规范转换为它可以理解和执行操作的原生 Linkerd
配置。这也消除了与 SMI
资源与控制平面的额外原生耦合, 并且适配器可以独立移动并拥有自己的发布周期。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
一起使用。
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的