最新发布的 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 的加持,实现更加复杂的功能。