Istio1.1新特性之TCP Weighted Cluster

Weighted Cluster

Istio支持在多个cluster之间设置权重,通过设置不同的subset和weight,可以实现很多丰富的功能,如大家熟悉的各种灰度发布(金丝雀发布/蓝绿部署/ABTest)等都是由此变化而来。

下面的例子熟悉Istio的同学应该都不陌生:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
      weight: 75

这个例子来自官方实例 bookinfo :

https://istio.io/docs/reference/config/istio.networking.v1alpha3/#DestinationWeight

在这里设置了v1和v2的流量分别为75%和25%。

只支持HTTP

但是,1.1版本之前的Istio,对于 Weighted Cluster 只支持HTTP协议(包括HTTP1.1/HTTP2/gRPC)。对于 TCP 和 TLS,虽然 VirtualService 的设置上和HTTP一直,但是实际上在执行时会做验证。

pilot/pkg/model/validation.go 中,validateTLSRoute()会对 TLS 做限制:

if len(tls.Route) != 1 {
    errs = appendErrors(errs, errors.New("TLS route must have exactly one destination"))
}

validateTCPRoute()会对 TCP 做限制:

if len(tcp.Route) != 1 {
    errs = appendErrors(errs, errors.New("TCP route must have exactly one destination"))
}

导致 TCP 和 TLS 都只能设置一个destination,也就无法实现分流。

增加对TCP和TLS的支持

在 Envoy 1.8 版本之后,增加对TCP和TLS的 Weighted Cluster 支持。而在即将发布的Istio 1.1 版本中也加入同样提供支持。

具体的 github PR 如下:

这两个PR的作者 Venil Noronha 写了一篇博客文章详细说明了 TCP和TLS的 Weighted Cluster 的用法,具体请见下文:

Raw TCP Traffic Shaping with Istio 1.1.0

简单摘录一下关键点:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: route
spec:
  hosts:
  - "*"
  gateways:
  - gateway
  tcp: # <-- 这里!
  - match:
    - port: 31400
    route:
    - destination:
        host: tcp-echo-server
        port:
          number: 9000
        subset: v1
      weight: 80
    - destination:
        host: tcp-echo-server
        port:
          number: 9000
        subset: v2
      weight: 20

总结

这个特性很小,基本上一看就明白,如果有需要的时候直接用就好。

唯一需要感叹的是:Envoy 和 Istio 的社区基础真好,总有人把各种之前没有完成的细节做好。

Avatar
敖小剑
中年码农

我目前研究的方向主要在Microservice、Servicemesh、Serverless等和Cloud Native相关的领域,欢迎交流和指导

相关