Рейтинг:0

Ошибка проверки работоспособности HAProxy с неправильным статусом Layer7, код: 400, информация: «Проверка состояния HTTP вернула код 400

флаг cn

У меня есть сервер HAProxy, который я использую в качестве балансировщика нагрузки L7 для своих узлов k8s. В моем кластере включен istio, и у меня есть служба istio-ingressgateway, доступная через NodePort.

НАЗВАНИЕ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
istio-ingressgateway NodePort 10.11.140.167 <нет> 15021:30301/TCP,80:31916/TCP,443:31517/TCP,15012:30768/TCP,15443:32020/TCP 11d

С сервера HAProxy я пытаюсь выполнить проверку работоспособности /здоровье/готово конечная точка. Я использую HAProxy 1.8 и мой haproxy.cfg составляет:

Глобальный
    журнал /dev/лог локальный0
    журнал /dev/log local1 уведомление
    chroot /var/lib/haproxy
    pid-файл /var/run/rh-haproxy18-haproxy.pid

    пользовательский прокси
    группа haproxy
    демон
    stats socket /run/haproxy/admin.sock mode 660 уровень администратора expose-fd listeners

    спред-чеки 21

    # Расположение материалов SSL по умолчанию
    ca-база /etc/ssl/сертификаты
    crt-база /etc/ssl/частный

    # Шифры по умолчанию для использования в прослушивающих сокетах с поддержкой SSL.
    # Для получения дополнительной информации см. ciphers(1SSL). Этот список взят из:
    # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
    # Альтернативный список с дополнительными директивами можно получить из
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    ssl-default-bind-параметры без sslv3

значения по умолчанию
    режим http
    журнал глобальный
    опция httplog
    опция
    опция http-server-close
    опция повторной отправки
    повторяет 3

    таймаут http-запроса 10s
    очередь ожидания 1м
    тайм-аут соединения 10 сек.
    таймаут клиента 1м
    таймаут сервера 1м
    тайм-аут http-keep-alive 10s
    проверка тайм-аута 10s
    максконн 10000
    круговой баланс


интерфейс http-80
        привязать *:80
        режим http
        опция httplog
        default_backend www-80

бэкэнд www-80
        круговой баланс
        режим http
        опция httpchk /healthz/ready HTTP/1.1
        http-check ожидает статус 200
        server backendnode1 155.13.200.29:31916 проверить порт 30301 падение 3 подъем 2 между 1597
        server backendnode2 155.13.200.28:31916 проверить порт 30301 падение 3 подъем 2 между 1597
        server backendnode3 155.13.200.27:31916 проверить порт 30301 падение 3 подъем 2 между 1597


фронтенд здоровье-80
    привязать *:8080
    acl backend_dead nbsrv(www-80) lt 1
    монитор-ури /haproxy_status
    сбой монитора, если backend_dead

listen stats # Определите раздел прослушивания под названием «stats»
    bind :9000 # Прослушивание на локальном хосте:9000
    режим http
    stats enable # Включить страницу статистики
    stats hide-version # Скрыть версию HAProxy
    stats realm Haproxy\ Statistics # Текст заголовка всплывающего окна
    stats uri /haproxy_stats # URI статистики
    статистика аутентификации haproxy:passwd  

Я использую HTTP/1.1 для проверки работоспособности серверной части, потому что istio-входшлюз не принимает HTTP/1.0 запросы, это приводит к коду ошибки 426.

Обращение к бэкенду с сервера HAProxy приводит к успеху:

завиток -I http://155.13.200.29:31916/healthz/ready
HTTP/1.1 200 ОК
дата: пт, 11 июня 2021 г., 07:21:09 по Гринвичу
x-envoy-upstream-service-time: 0
сервер: посланник
кодирование передачи: по частям

Однако проверка работоспособности HAProxy по-прежнему не проходит. Я получаю следующие ошибки:

11 июня, 07:18:22 hap-server01 haproxy[12348]: сервер www-80/backendnode2 ВЫКЛЮЧЕН, причина: неверный статус уровня 7, код: 400, информация: «Проверка состояния HTTP вернула код <3C>400<3E>» , продолжительность проверки: 2 мс. Остался 1 активный и 0 резервных серверов. 0 активных сессий, 0 в очереди, 0 в очереди.
11 июня, 07:18:22 hap-server01 haproxy[12348]: сервер www-80/backendnode2 ВЫКЛЮЧЕН, причина: неверный статус уровня 7, код: 400, информация: «Проверка состояния HTTP вернула код <3C>400<3E>» , продолжительность проверки: 2 мс. Остался 1 активный и 0 резервных серверов. 0 активных сессий, 0 в очереди, 0 в очереди.
11 июня 07:18:22 hap-server01 haproxy[11795]: [ПРЕДУПРЕЖДЕНИЕ] 161/071821 (11795): Бывший рабочий 11798 вышел с кодом 0
11 июня, 07:18:22 hap-server01 haproxy[12348]: сервер www-80/backendnode3 ВЫКЛЮЧЕН, причина: неверный статус Layer7, код: 400, информация: «Проверка состояния HTTP вернула код <3C>400<3E>» , продолжительность проверки: 3 мс. Осталось 0 активных и 0 резервных серверов. 0 активных сессий, 0 в очереди, 0 в очереди.
11 июня, 07:18:22 hap-server01 haproxy[12348]: сервер www-80/backendnode3 ВЫКЛЮЧЕН, причина: неверный статус Layer7, код: 400, информация: «Проверка состояния HTTP вернула код <3C>400<3E>» , продолжительность проверки: 3 мс. Осталось 0 активных и 0 резервных серверов. 0 активных сессий, 0 в очереди, 0 в очереди.

Я понимаю, что код состояния 400 происходит для плохих запросов. Что-то не так настроено в моем haproxy.cfg? Я чувствую, что это то, как я пытаюсь отправить HTTP/1.1 запрос на проверку здоровья. Но я не уверен, что еще добавить или что изменить в конфигурации.

Рейтинг:0
флаг in

Проверьте руководство, вы не можете указать версию без указания метода:

опция httpchk <метод> <uri> <версия>

в вашем случае я бы попробовал

опция httpchk GET /healthz/ready HTTP/1.1

Также: узнайте про tcpdump, очень интересно наблюдать за общением между системами и выяснять, что не так.

bakadevops avatar
флаг cn
Я использую HAProxy версии 1.8. ```option httpchk GET /healthz/ready HTTP/1.1``` , это по-прежнему возвращает ```400```. В руководстве говорится, что «Обратите внимание, что поле Host является обязательным в HTTP/1.1, используйте директиву «http-check send», чтобы добавить его». Поэтому я добавил «http-check send hdr Host www». `. Теперь это работает.
Gerard H. Pille avatar
флаг in
В мое время вам приходилось добавлять новую строку и заголовок хоста к httpchk.
berndbausch avatar
флаг us
Хотя проблема кажется решенной, я бы сначала посмотрел логи веб-сервера, чтобы понять, какие запросы они получают. И я присоединяюсь к замечанию о tcpdump.
bakadevops avatar
флаг cn
@berndbausch, спасибо за замечание. Я обязательно проверю журналы и tcpdumps.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.