HAProxy: ¿Es posible utilizar el estado guardado para restaurar las IP de backend?

HAProxy: ¿Es posible utilizar el estado guardado para restaurar las IP de backend?

Estamos utilizando HAProxy 1.8.13 en Centos 7 con backends asignados dinámicamente (IP de backend y puertos asignados a través del socket de estadísticas). Esto funciona bien.

Necesitamos un método para hacer que las cosas asignadas dinámicamente se mantengan durante los reinicios y queríamos usar el "cargar-estado-del-servidor-desde-archivo"directiva. Lamentablemente, nos encontramos con un error (¿o tal vez es por diseño?) que indica que el archivo de estado no restaura la dirección IP configurada:

Nuestra configuración de prueba:

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

Estamos configurando las IP mediante script y luego guardando el estado con:

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

Lo que produce por ejemplo:

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

Cuando haproxy se reinicia, restaura la información del estado activo/inactivo y el puerto, pero restablece la IP a 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

Jugamos con "dirección-inicial" pero esto solo afecta a las direcciones de backend basadas en DNS. ¿Hemos hecho algo mal? ¿Es este el comportamiento esperado? ¿O es algún tipo de error?

Respuesta1

Descubrimos que funciona cuando reemplazamos '127.0.0.1' por 'localhost'.

HAProxy parece ignorar las IP de backend en el archivo de estado, al menos con las versiones que probamos (1.8.7, 1.8.13, 1.9-dev). Los servidores backend que tienen nombres DNS configurados de forma predeterminada obtienen las IP del archivo de estado aplicado.

Profundizamos en el código y abrimos un error con un parche en HAProxy MLaquí.

información relacionada