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