金丝雀部署:

        引一部分流量到新版本中进行测试,测试新版本并获得用户反馈。如无问题则部署更多的新版本并引流到新版本中,有问题则回滚。

蓝绿部署:

        使用一整套与老版本完全一样的新实例来替换到新的版本,一次性切换所有流量,数据进行热备,旧版本不停机有问题随时切回老版本。

AB测试:

        比较两个版本,向用户随机展示两个或多个变体使用统计分析来确定那种变体对于给定的转化效果更好,每个版本给一定比例的流量。

流量镜像:

        将真实流量复制引入要测试的服务中但不影响真实用户。


灰度策略:管理流量请求策略

        基于请求内容发布:cookie内容、自定义Header。

        基于流量比例发布:根据期望的流量比例来分配流量,如AB测试。


灰度发布实施方式:

基于负载均衡:nginx、haproxy、lvs

基于kubernetes:Pod的滚动更新回滚等、service、Ingress

基于服务网格:流量管理、Envoy Gateway


Envoy流量迁移:

版本上线:蓝绿发布,AB测试、金丝雀发布

HTTP路由器:版本升级、AB测试

routes:
- match: # 定义路由匹配参数;
    prefix|path|regex: ... # 流量过滤条件,三者必须定义其中之一;
    runtime_fraction: # 额外匹配指定的运行时键值,每次评估匹配路径时,它必需低于此字段指示的匹配百分比;支持渐进式修改;
      default_value: # 运行时键值不可用时, 则使用此默认值;
        numerator: # 指定分子, 默认为0
        denominator: # 指定分母,小于分子时,最终百分比为1;分母可固定使用HUNDRED(默认)、TEN_THOUSAND和MILLION;
      runtime_key: routing.traffic_shift.KEY # 指定要使用的运行时键,其值需要用户自定义;
  route:
    custer: app1_v1
- match:
    prefix|path|regex: ... # 此处的匹配条件应该与前一个路由匹配条件相同,以确保能够分割流量;
  route:
    cluster: app1_v2 # 此处的集群通常是前一个路由项目中的目标集群应用程序的不同版本

示例:

admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    name: listener_http
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: vh_001
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                  runtime_fraction:
                    default_value:
                      numerator: 100
                      denominator: HUNDRED
                    runtime_key: routing.traffic_shift.myapp
                route:
                  cluster: myapp-v1.5
              - match:
                  prefix: "/"
                route:
                  cluster: myapp-v1.6
          http_filters:
          - name: envoy.router

  clusters:
  - name: myapp-v1.5
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: myapp-v1.5
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: myapp-v1.5
                port_value: 80

  - name: myapp-v1.6
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: myapp-v1.6
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: myapp-v1.6
                port_value: 80

修改numerator的值,即分子的值:

curl -XPOST 172.19.0.6:9901/runtime_modify?routing.traffic_shift.myapp=0