istio 的流量复制功能
istio 的流量复制在 VirtualService 中设置,istio 1.4.x 开始支持。
创建接收复制流量的服务
接收正常请求的服务是前面部署的 http-record v1 。我们准备把这个服务的流量复制同名的 v2 版本的服务。
用下面的 yaml 文件创建 http-record v2,只需要创建 deployment:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: http-record-v2
spec:
replicas: 1
template:
metadata:
labels:
app: http-record
version: v2
spec:
containers:
- image: lijiaocn/http-record:0.0.1
imagePullPolicy: IfNotPresent
name: http-record
ports:
- containerPort: 8080
设置镜像复制策略
编辑之前创建的名为 http-record 的 VirtualService,设置流量复制策略:
$ kubectl edit vs http-record
hosts:
- http-record
http:
- mirror:
host: http-record
subset: v2
mirror_percent: 100
route:
- destination:
host: http-record
subset: v1
weight: 100
上面的配置将 100% 的流量复制到 v2。
复制效果
在任意容器内或者通过 ingressgateway 访问 http-record:
$ curl http-record:8000
同时查看 v1 和 v2 的日志:
$ kubectl logs -f http-record-v1-5f9c95b7cf-t9tzx http-record
$ kubectl logs -f http-record-v2-d697c886-lqpsw http-record
会发现 http-record-v1 和 http-record-v2 的 pod 同时收到了相同的请求。
似乎不支持复制到另一个服务
尝试将到达 Bookinfo Application 的 productpage 的请求复制到 http-record,结果不成功,似乎不支持跨域名复制。
尝试的 yaml 如下:
$ kubectl edit vs productpage
...省略...
hosts:
- productpage
http:
- mirror:
host: http-record
subset: v1
mirror_percent: 100
route:
- destination:
host: productpage
subset: v1
...省略...
访问 productpage:
$ curl productpage:9080
http-record:v1 没有收到复制的请求,istio 不支持跨服务复制吗?(2019-11-22 18:16:01)。