Опция случайной балансировки нагрузки прокси-сервера Envoy не является случайной
Мы используем приведенный ниже YAML-файл балансировки нагрузки Envoy. Он работает, но НЕ распределяет запросы между узлами 1, 2 и 3 случайным образом. В нашем случае высокая нагрузка исходит от одного исходного IP-адреса (клиентского сервера). Мы хотим распределить трафик по узлам следующим образом:
Запрос 1 -> Узел 1 Запрос 2 -> Узел 2 Запрос 3 -> Узел 3 Запрос 4 -> Узел 1
Однако происходит вот что:
Запрос 1 -> Узел 1 Запрос 2 -> Узел 1 Запрос 3 -> Узел 1 Запрос 4 -> Узел 1
Через ДЛИТЕЛЬНОЕ время (минуты) он в конечном итоге начнет отправлять некоторый трафик на узел 2, но только на узел 2. Опять же, обратите внимание, что все запросы поступают с одного IP-адреса клиента.
Ниже мы используем Random, но и циклический алгоритм делает то же самое. Итак, наш вопрос: как это исправить? Это похоже на огромную ошибку, поскольку на самом деле это не балансировка нагрузки. Любое руководство будет оценено по достоинству. Мы используем последнюю версию Envoy.
static_resources:
listeners:
- name: listener_http
address:
socket_address:
address: 0.0.0.0
port_value: 80
filter_chains:
- filters:
- name: envoy.filters.network.tcp_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
stat_prefix: destination
cluster: http_cluster
- name: listener_https
address:
socket_address:
address: 0.0.0.0
port_value: 443
filter_chains:
- filters:
- name: envoy.filters.network.tcp_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
stat_prefix: destination2
cluster: https_cluster
clusters:
- name: http_cluster
connect_timeout: 30s
type: strict_dns
dns_lookup_family: V4_ONLY
lb_policy: random
load_assignment:
cluster_name: http_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: node1.mydomain.com
port_value: 80
- endpoint:
address:
socket_address:
address: node2.mydomain.com
port_value: 80
- endpoint:
address:
socket_address:
address: node3.mydomain.com
port_value: 80
- name: https_cluster
connect_timeout: 30s
type: strict_dns
dns_lookup_family: V4_ONLY
lb_policy: random
load_assignment:
cluster_name: https_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: node1.mydomain.com
port_value: 443
- endpoint:
address:
socket_address:
address: node2.mydomain.com
port_value: 443
- endpoint:
address:
socket_address:
address: node3.mydomain.com
port_value: 443