Envoy 流量镜像
流量镜像
-
流量镜像,也称为流量复制或影子镜像
- 流量镜像功能通常用于在生产环境进行测试,通过将生产流量镜像拷贝到测试集群或者新版本集群,实现新版本接近真实环境的测试,旨在有效地降低新版本上线的风险;
-
将流量转发至一个集群(主集群)的同时再转发到另一个集群(影子集群)
-
无须等待影子集群返回响应
-
支持收集影子集群的常规统计信息,常用于测试
-
默认情况下,路由器会镜像所有请求;也可使用如下参数配置转发的流量比例
- runtime_key:运行时键,用于明确定义向影子集群转发的流量的百分比,取值范围为0-10000,每个数字表示0.01%的请求比例;定义了此键却未指定其值时,默认为0;
-
流量镜像使用场景
-
验证新版本:实时对比镜像流量与生产流量的输出结果,完成新版本目标验证
-
测试:用生产实例的真实流量进行模拟测试
- 隔离测试数据库:与数据处理相关的业务,可使用空的数据存储并加载测试数据,针对该数据进行镜像流量操作,实现测试数据的隔离
流量镜像配置格式
--
route:
cluster|weighted_clusters:
...
request_mirror_policies: []
- cluster": "..."
runtime_fraction": "{...}"
default_value: # 运行时键值不可用时,则使用此默认值;
numerator: # 指定分子,默认为0;
denominator: # 指定分母,小于分子时,最终百分比为1;分母可固定使用HUNDRED(默认)、TEN_THOUSAND和MILLION;
runtime_key: routing.request_mirror.KEY # 指定要使用的运行时键,其值需要用户自定义;
trace_sampled: {…} # 是否对trace span进行采样,默认true
流量镜像配置示例
front-envoy.yaml
admin:
profile_path: /tmp/envoy.prof
access_log_path: /tmp/admin_access.log
address:
socket_address:
address: 0.0.0.0
port_value: 9901
layered_runtime:
layers:
- name: admin
admin_layer: {}
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 80 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: demoapp
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: demoappv10
request_mirror_policies:
- cluster: demoappv11
runtime_fraction:
default_value:
numerator: 20 # 默认只镜像demoappv10集群上20%的流量到该集群
denominator: HUNDRED
runtime_key: routing.request_mirror.demoapp
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: demoappv10
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: demoappv10
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: demoappv10
port_value: 80
- name: demoappv11
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: demoappv11
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: demoappv11
port_value: 80
动态调整镜像流量的比例
# 我们可以通过runtime_layer中的routing.request_mirror.demoapp键来调整镜像的流量的比例,例如,将其调整到100%,即镜像所有流量的方法如下;
curl -XPOST 'http://envoy_ip:9901/runtime_modify?routing.request_mirror.demoapp=100'