Я настроил haproxy для создания внутренних серверов через server-template
, указывая на консул DNS (SRV):
resolvers foo
nameserver consul 127.0.0.1:8600
resolve_retries 30
timeout retry 2s
hold valid 10s
accepted_payload_size 8192
backend bar
mode http
balance roundrobin
server-template bar 50 _bar.service.consul.myorg.internal check port 8080 inter 5s rise 2 fall 3 resolvers foo resolve-prefer ipv4
При проверке show servers state
я вижу, что в haproxy есть несколько очень старых серверов с srv_op_state = SRV_ST_STOPPED и srv_time_since_last_change = ~ 19 дней секунд. Эти серверы были уничтожены несколько дней назад и больше не возвращаются из запроса dig _bar.service.consul.myorg.internal SRV;
, но по какой-то причине они остаются в состоянии haproxy.
Это ведет себя как ожидалось (например, haproxy не перенаправляет трафик на него из-за сбоя проверки работоспособности) до тех пор, пока srv_addr неизбежно не будет повторно использован. Если новый сервер не является приложением «bar», но проходит проверку работоспособности, haproxy будет направлять ему запросы «bar», что вызывает проблемы, поскольку новый сервер не может правильно обслуживать запросы «bar».
Как я могу заставить haproxy удалить эти серверы из своего состояния после того, как они больше не находятся в консольном DNS?
Редактировать: после установки размера шаблона сервера равным 1 и повторного создания службы с новым IP-адресом (для которого в DNS-консуле правильная запись SRV) состояние haproxy продолжает отражать один старый, нездоровый сервер.
Редактировать 2: при проверке работоспособности HTTP уровня 7 (option httpchk GET /health HTTP/1.1\r\nHost:\ haproxy
) сервер, сгенерированный по шаблону сервера, обновил свой адрес в соответствии с адресом DNS консула.
Редактировать 3: после увеличения размера шаблона сервера до 50, запуска 10 исправных экземпляров службы, которые правильно регистрируются в DNS, и завершения 5 экземпляров (что приводит к сбою проверок работоспособности), haproxy сохраняет отключенные серверы с SRV_ST_STOPPED
казалось бы, на неопределенный срок. Существует ли какой-либо автоматический механизм, заставляющий haproxy выселять эти серверы, чтобы другая служба, которая запускалась по тому же адресу и проходила проверки работоспособности, не принимала трафик неправильно?