HAProxy: Возможно ли использовать сохраненное состояние для восстановления внутренних IP-адресов?

HAProxy: Возможно ли использовать сохраненное состояние для восстановления внутренних IP-адресов?

Мы используем HAProxy 1.8.13 на Centos 7 с динамически назначаемыми бэкендами (IP-адреса бэкендов и порты назначаются через сокет статистики). Это работает отлично.

Нам нужен метод, позволяющий сохранить динамически назначенные данные при перезапусках, и мы хотели бы использовать "загрузка-серверного-состояния-из-файла" директива. К сожалению, мы сталкиваемся с ошибкой (или, может быть, так задумано?), заключающейся в том, что файл состояния не восстанавливает настроенный IP-адрес:

Наша тестовая конфигурация:

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    nbproc      2
    stats socket /run/haproxy/1.sock mode 0744 level admin process 1
    stats socket /run/haproxy/2.sock mode 0744 level admin process 2
    server-state-file /run/haproxy/server_state

defaults
    load-server-state-from-file global
    timeout server 10s
    timeout client 15s
    timeout queue 6s
    timeout connect 10s

frontend  main
    bind *:5000
    default_backend             app

backend app
    balance     roundrobin
    server  app1 127.0.0.1:5001 check
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check

Мы настраиваем IP-адреса с помощью скрипта, а затем сохраняем состояние с помощью:

echo "show servers state" | socat /run/haproxy/1.sock - > /run/haproxy/server_state

Что производит, например:

1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port
7 app 1 app1 127.0.0.1 0 1 1 1 60 8 2 0 14 0 0 0 - 5001
7 app 2 app2 10.10.10.115 2 0 1 1 23 6 3 4 6 0 0 0 - 31501
7 app 3 app3 10.10.10.113 2 0 1 1 22 6 3 4 6 0 0 0 - 31375
7 app 4 app4 10.10.10.114 2 0 1 1 22 6 3 4 6 0 0 0 - 31400

При перезапуске haproxy восстанавливается информация о состоянии up/down и порт, но IP-адрес сбрасывается на 127.0.0.1:

1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port
7 app 1 app1 127.0.0.1 0 1 1 1 7 8 2 0 14 0 0 0 - 5001
7 app 2 app2 127.0.0.1 0 0 1 1 2 8 2 0 6 0 0 0 - 31501
7 app 3 app3 127.0.0.1 0 0 1 1 2 8 2 0 6 0 0 0 - 31375
7 app 4 app4 127.0.0.1 0 0 1 1 1 8 2 0 6 0 0 0 - 31400

Мы играли с "init-addr" но это влияет только на внутренние адреса на основе DNS. Мы что-то делаем не так? Это ожидаемое поведение? Или это какая-то ошибка?

решение1

Мы обнаружили, что это работает, если заменить «127.0.0.1» на «localhost».

HAProxy, похоже, игнорирует внутренние IP-адреса в файле состояния, по крайней мере, в версиях, которые мы тестировали (1.8.7, 1.8.13, 1.9-dev). Внутренние серверы, имеющие DNS-имена в качестве настроенных по умолчанию, получают IP-адреса из примененного файла состояния.

Мы глубоко изучили код и выявили ошибку с помощью патча в HAProxy ML.здесь.

Связанный контент