讓我們一起聊聊 Linkerd Smi 擴(kuò)展入門
文末本文轉(zhuǎn)載自微信公眾號(hào)「黑客下午茶」,作者為少 。轉(zhuǎn)載本文請(qǐng)聯(lián)系黑客下午茶公眾號(hào)。
Service Mesh Interface 是 Kubernetes 上服務(wù)網(wǎng)格的標(biāo)準(zhǔn)接口。它定義了一組資源,可用于實(shí)現(xiàn)該資源的服務(wù)網(wǎng)格。您可以在規(guī)范中閱讀有關(guān)它的更多信息。
- https://smi-spec.io/
- https://github.com/servicemeshinterface/smi-spec
目前,Linkerd 支持 SMI 的 TrafficSplit 規(guī)范, 該規(guī)范可用于在本地執(zhí)行跨服務(wù)的流量拆分。這意味著您可以在沒有任何額外組件/配置的情況下應(yīng)用 SMI 資源, 但這顯然有一些缺點(diǎn),因?yàn)?Linkerd 可能無法添加特定于它的額外特定配置, 因?yàn)?SMI 更像是服務(wù)網(wǎng)格功能的最小公分母。
為了解決這些問題,Linkerd 可以使用一個(gè)適配器, 將 SMI 規(guī)范轉(zhuǎn)換為它可以理解和執(zhí)行操作的原生 Linkerd 配置。這也消除了與 SMI 資源與控制平面的額外原生耦合, 并且適配器可以獨(dú)立移動(dòng)并擁有自己的發(fā)布周期。Linkerd SMI 是一個(gè)可以做到這一點(diǎn)的擴(kuò)展。
- https://www.github.com/linkerd/linkerd-smi
本指南將引導(dǎo)您安裝 SMI 擴(kuò)展并配置 TrafficSplit 規(guī)范,以跨服務(wù)執(zhí)行流量拆分(Traffic Splitting)。
前提條件
要使用本指南,您需要在集群上安裝 Linkerd。
安裝 Linkerd-SMI 擴(kuò)展
CLI
通過運(yùn)行以下命令安裝 SMI 擴(kuò)展 CLI 二進(jìn)制文件:
- curl -sL https://linkerd.github.io/linkerd-smi/install | sh
或者,您可以直接通過發(fā)布頁(yè)面下載 CLI。
- https://github.com/linkerd/linkerd-smi/releases
第一步是將 Linkerd-SMI 擴(kuò)展安裝到您的集群上。此擴(kuò)展包含一個(gè) SMI-Adaptor,可將 SMI 資源轉(zhuǎn)換為原生 Linkerd 資源。
要安裝 Linkerd-SMI 擴(kuò)展,請(qǐng)運(yùn)行以下命令:
- linkerd smi install | kubectl apply -f -
您可以通過運(yùn)行以下命令來驗(yàn)證 Linkerd-SMI 擴(kuò)展是否已正確安裝:
- linkerd smi check
Helm
要安裝 linkerd-smi Helm chart,請(qǐng)運(yùn)行:
- helm repo add l5d-smi https://linkerd.github.io/linkerd-smi
- helm install l5d-smi/linkerd-smi --generate-name
安裝示例應(yīng)用程序
首先,讓我們安裝示例應(yīng)用程序。
- # 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 -
這將安裝一個(gè)簡(jiǎn)單的客戶端和兩個(gè)服務(wù)器部署。服務(wù)器部署之一,即 faling-svc 總是返回 500 錯(cuò)誤, 而另一個(gè),即 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
默認(rèn)情況下,客戶端將訪問 backend-svc 服務(wù)。這在 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 √
配置流量拆分
現(xiàn)在,讓我們應(yīng)用一個(gè) TrafficSplit 資源在 backend-svc 上執(zhí)行流量拆分, 以在它和 failing-svc 之間分配負(fù)載。
- 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
因?yàn)?smi-adaptor 監(jiān)視 TrafficSplit 資源, 它會(huì)自動(dòng)創(chuàng)建相應(yīng)的 ServiceProfile 資源來執(zhí)行相同的操作。這可以通過檢索 ServiceProfile 資源來驗(yàn)證。
- 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>
正如我們所見,已經(jīng)創(chuàng)建了一個(gè)帶有 DstOverrides 的相關(guān) ServiceProfile 來執(zhí)行 TrafficSplit。
可以通過運(yùn)行 edges 命令來驗(yàn)證流量拆分。
- 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 資源上運(yùn)行 stat 子命令來驗(yàn)證。
- 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 日志來驗(yàn)證。
- 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'"
清理
通過運(yùn)行以下命令刪除 trafficsplit-sample 資源
- kubectl delete namespace/trafficsplit-sample
結(jié)論
不過,Linkerd 目前支持直接讀取 TrafficSplit 資源,ServiceProfiles 總是優(yōu)先于 TrafficSplit 資源。將在進(jìn)一步的版本中刪除對(duì) TrafficSplit 資源的支持,在該版本中,需要 linkerd-smi 擴(kuò)展以將 SMI 資源與 Linkerd 一起使用。