Envoy 集群管理 子集合区域感知路由
来源:原创
时间:2019-11-25
作者:脚本小站
分类:云原生
子集:
将集群中的每个端点赋予键值属性,一个端点可有多个键值属性。称为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