在 Linkerd2 中進行流量拆分

最新發布的

Linkerd 2.4

,加入了對流量拆分的支持。

安裝最新版本之後,可以看到這個流量拆分功能所使用的 API 資源並非來自 Linkerd,而是 SMI 規範的一部分。

$ curl -sL https://run.linkerd.io/install | sh
...
$ kubectl api-resources | grep -i split
trafficsplits ts split.smi-spec.io true TrafficSplit

和 Istio 的 Service + Selector 的拆分方式不同,Linkerd 其實沒有什麼特別的上游定義方式,簡單的定義獨立的 Service 即可。例如我們要從 flaskapp 服務分流到 v1 和 v2 兩個版本,在 Istio 中,需要定義一個 flaskapp 服務,然後使用標籤,在 Service 的標籤子集中,選擇兩組 Subset 作為目的地。而在 Linkerd/SMI 中,就需要分別定義三個服務了,例如 flaskapp、flaskapp-v1、flaskapp-v2。下面簡單操練一下。

$ wget https://raw.githubusercontent.com/fleeto/istio-for-beginner/master/code/flaskapp/flaskapp.istio.yaml
$ linkerd inject flaskapp.istio.yaml | kubectl apply -f -
...
$ wget https://raw.githubusercontent.com/fleeto/istio-for-beginner/master/code/sleep/sleep.yaml
$ linkerd inject sleep.yaml | kubectl apply -f -
...

分別安裝了兩個版本的 flaskapp,和一個版本的 sleep 服務之後。再創建兩個 flaskapp 的分版本服務。

apiVersion: v1
kind: Service
metadata:
name: flaskapp-v1
labels:
app: flaskapp

spec:
selector:
app: flaskapp
version: v1
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: flaskapp-v2
labels:
app: flaskapp
spec:
selector:
app: flaskapp
version: v2
ports:
- name: http
port: 80
targetPort: 80

創建兩個服務之後,就可以嘗試拆分了,同樣是一個 YAML:

apiVersion: split.smi-spec.io/v1alpha1
kind: TrafficSplit
metadata:
name: flask-split
spec:
service: flaskapp
backends:
- service: flaskapp-v1
weight: 1
- service: flaskapp-v2
weight: 500m

注意這裡的定義和 Istio 也稍有不同,使用權重而非百分比進行分流。

可以在 Sleep 中進行測試:

$ for i in {1..1000}; do curl -sSL http://flaskapp/env/version | grep v1; done | wc -l
660

可以看到,按照我們的權重分配,成功進行了分流。但是目前在 SMI 中並沒有看到條件選擇的相關內容,因此目前的功能可能還比較初級。可以通過 Flagger 的加持,實現更加複雜的功能。


分享到:


相關文章: