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

流量镜像配置示例

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'

 

posted @ 2022-09-05 16:45  小吉猫  阅读(495)  评论(0编辑  收藏  举报