子集:

将集群中的每个端点赋予键值属性,一个端点可有多个键值属性。称为metadata。

metadata:
  key: value

内部定义子集选择器的subset_selector,用来将具有相同键值的端点划分为一组。

需要路由的参与用来调度到匹配的子集。

route:
  metadata_match:

子集内的负载均衡调度策略依然采用lb_policy。

未匹配到子集则采用回退策略,有三种:

NO_FALLBACK:无回退策略,无法提供正常响应,返回错误信息

ANY_ENDPOINT:把所有主机当成一个组,用lb_policy算法进行调度。

DEFAULT_SUBSET:调度到事先定义好的子集上。

主机子集元数据必须定义在envoy.lb 过滤器下。

使用ClusterLoadAssignment定义主机时才支持主机元数据。

endpoints:
- lb_endpoints:
  - endpoint:
    metadata:
    filter_metadata:
      envoy.lb:
        version: 1.0 # 键值
        stage: 'prod' # 键值

定义子集选择器:

clusters:
- name ...
  ...
  lb_subset_config
    fallback_policy: "..." # 回退策略, 默认为NO_FALLBACK
    default_subset: "{...}" # 回退策略DEFAULT_SUBSET使用的默认子集;
    subset_selectors: [] # 子集选择器
    - keys: [] # 定义一个选择器, 指定用于归类主机元数据的键列表;
      fallback_policy: ... # 当前选择器专用的回退策略;
  locality_weight_aware: "..." # 是否在将请求路由到子集时考虑端点的位置和位置权重; 存在一些潜在的缺陷;
  scale_locality_weight: "..." # 是否将子集与主机中的主机比率来缩放每个位置的权重;
  panic_mode_any: "..." # 是否在配置回退策略且其相应的子集无法找到主机时尝试从整个集群中选择主机;
  list_as_any": ..."

子集选择器示例:

    lb_subset_config:
      fallback_policy: DEFAULT_SUBSET            
      default_subset:
        stage: "prod"
        version: "1.0"
        type: "std"
      subset_selectors:
      - keys: ["stage", "type"]
      - keys: ["stage", "version"]
      - keys: ["version"]
      - keys: ["xlarge", "version"]

路由元数据匹配:

routes:
  - name: ...
  match: {...}
  route: {...} # 路由目标, cluster和weighted_clusters只能使用其一;
  cluster:
    metadata_match: {...} # 子集负载均衡器使用的端点元数据匹配条件; 若使用了weighted_clusters且内部定义了metadat_match,
    # 则元数据将被合并, 且weighted_cluster中定义的值优先; 过滤器名称应指定为envoy.lb;
    filter_metadata: {...} # 元数据过滤器
      envoy.lb: {...}
        key1: value1
        key2: value2
        ...
    weighted_clusters: {...}
      clusters: []
      - name: ...
        weight: ...
        metadata_match: {...}

示例:

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: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                  headers:
                  - name: x-custom-version
                    value: pre-release
                route:
                  cluster: webcluster1
                  metadata_match:
                    filter_metadata:
                      envoy.lb:
                        version: "1.2-pre"
                        stage: "dev"
              - match:
                  prefix: "/"
                  headers:
                  - name: x-hardware-test
                    value: memory
                route:
                  cluster: webcluster1
                  metadata_match:
                    filter_metadata:
                      envoy.lb:
                        type: "bigmem"
                        stage: "prod"
              - match:
                  prefix: "/"
                route:
                  weighted_clusters:
                    clusters:
                    - name: webcluster1
                      weight: 90
                      metadata_match:
                        filter_metadata:
                          envoy.lb:
                            version: "1.0"
                    - name: webcluster1
                      weight: 10
                      metadata_match:
                        filter_metadata:
                          envoy.lb:
                            version: "1.1"
                  metadata_match:
                    filter_metadata:
                      envoy.lb:
                        stage: "prod"
          http_filters:
          - name: envoy.router

  clusters:
  - name: webcluster1
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: webcluster1
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: e1
                port_value: 80
          metadata:
            filter_metadata:
              envoy.lb:
                stage: "prod"
                version: "1.0"
                type: "std"
                xlarge: true
        - endpoint:
            address:
              socket_address:
                address: e2
                port_value: 80
          metadata:
            filter_metadata:
              envoy.lb:
                stage: "prod"
                version: "1.0"
                type: "std"
        - endpoint:
            address:
              socket_address:
                address: e3
                port_value: 80
          metadata:
            filter_metadata:
              envoy.lb:
                stage: "prod"
                version: "1.1"
                type: "std"
        - endpoint:
            address:
              socket_address:
                address: e4
                port_value: 80
          metadata:
            filter_metadata:
              envoy.lb:
                stage: "prod"
                version: "1.1"
                type: "std"
        - endpoint:
            address:
              socket_address:
                address: e5
                port_value: 80
          metadata:
            filter_metadata:
              envoy.lb:
                stage: "prod"
                version: "1.0"
                type: "bigmem"
        - endpoint:
            address:
              socket_address:
                address: e6
                port_value: 80
          metadata:
            filter_metadata:
              envoy.lb:
                stage: "prod"
                version: "1.1"
                type: "bigmem"
        - endpoint:
            address:
              socket_address:
                address: e7
                port_value: 80
          metadata:
            filter_metadata:
              envoy.lb:
                stage: "dev"
                version: "1.2-pre"
                type: "std"
    lb_subset_config:
      fallback_policy: DEFAULT_SUBSET            
      default_subset:
        stage: "prod"
        version: "1.0"
        type: "std"
      subset_selectors:
      - keys: ["stage", "type"]
      - keys: ["stage", "version"]
      - keys: ["version"]
      - keys: ["xlarge", "version"]
    health_checks:
    - timeout: 5s
      interval: 10s
      unhealthy_threshold: 2
      healthy_threshold: 1
      http_health_check:
        path: /healthz
        expected_status: 200