Envoy 集群管理 负载均衡算法
来源:原创
时间:2019-11-22
作者:脚本小站
分类:云原生
加权轮询:ROUND_ROBIN,权重都为1时为轮询,按照权重虚拟出多个端点进行轮询调度。适合短连接。
加权最少请求:LEAST_REQUEST,按照实际负载情况和权重来进行调度,适合长连接的情况,检查后端主机状态也要消耗时间。
环哈希:RING_HASH,根据请求的特点将请求固定到某个端点,计算cookie、header头或ip等属性将请求分配到哈希环某个区间中对应的节点。在哈希环中虚拟出很多节点,权重高的节点对应着更多的虚拟节点。环的个数在envoy中可以定义。
磁悬浮:MAGLEV 同环哈希,但是大小固定为65537,且需要主机映射的节点填满整个环。
随机:RANDOM 随机调度
原始目标集群负载均衡:ORIGINAL_DST_LB
负载均衡相关配置:
clusters: - name: ... ... load_assignment: {...} cluster_name: ... endpoints: [] # LocalityLbEndpoints列表, 每个列表项主要由位置、 端点列表、 权重和优先级四项组成; - locality: {...} # 位置定义 region: ... zone: ... sub_zone: ... lb_endpoints: [] # 端点列表 - endpoint: {...} # 端点定义 address: {...} # 端点地址 health_check_config: {...} # 当前端点与健康状态检查相关的配置; load_balancing_weight: ... # 当前端点的负载均衡权重, 可选; metadata: {...} # 基于匹配的侦听器、 过滤器链、 路由和端点等为过滤器提供额外信息的元数据, 常用用于提供服务配置或辅助负载均衡; health_status: ... # 端点是经EDS发现时, 此配置项用于管理式设定端点的健康状态, 可用值有UNKOWN、 HEALTHY、 UNHEALTHY、DRAINING、 TIMEOUT和DEGRADED; load_balancing_weight: {...} # 权重 priority: ... # 优先级 policy: {...} # 负载均衡策略设定 drop_overloads: [] # 过载保护机制, 丢弃过载流量的机制; overprovisioning_factor: ... # 整数值, 定义超配因子( 百分比) , 默认值为140, 即1.4; endpoint_stale_after: ... # 过期时长, 过期之前未收到任何新流量分配的端点将被视为过时, 并标记为不健康; 默认值0表示永不过时; lb_subset_config: {...} ring_hash_lb_config: {...} original_dst_lb_config: {...} least_request_lb_config: {...} common_lb_config: {...} health_panic_threshold: ... # Panic阈值, 默认为50%; zone_aware_lb_config: {...} # 区域感知路由的相关配置; locality_weighted_lb_config: {...} # 局部权重负载均衡相关的配置; ignore_new_hosts_until_first_hc: ... # 是否在新加入的主机经历第一次健康状态检查之前不予考虑进负载均衡;
轮询ROUND_ROBIN:
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: service_red port_value: 80 load_balancing_weight: 1 - endpoint: address: socket_address: address: service_blue port_value: 80 load_balancing_weight: 3 - endpoint: address: socket_address: address: service_green port_value: 80 load_balancing_weight: 5
加权最少请求LEST_REQUEST:
clusters: - name: webcluster1 connect_timeout: 0.25s type: STRICT_DNS lb_policy: LEAST_REQUEST least_request_lb_config: choice_count: 2 # 从中选两个点并选择连接数少的那个 http2_protocol_options: {} load_assignment: cluster_name: webcluster1 endpoints: - lb_endpoints: - endpoint: address: socket_address: address: service_red port_value: 80 load_balancing_weight: 1 - endpoint: address: socket_address: address: service_blue port_value: 80 load_balancing_weight: 3 - endpoint: address: socket_address: address: service_green port_value: 80 load_balancing_weight: 5
环哈希ring-hash:
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: "/" route: cluster: webcluster1 hash_policy: - header: header_name: User-Agent http_filters: - name: envoy.router clusters: - name: webcluster1 connect_timeout: 0.25s type: STRICT_DNS lb_policy: RING_HASH ring_hash_lb_config: maximum_ring_size: 1048576 minimum_ring_size: 1024 http2_protocol_options: {} load_assignment: cluster_name: webcluster1 endpoints: - lb_endpoints: - endpoint: address: socket_address: address: myservice port_value: 80