Балансировщик нагрузки HTTPS в Google Container Engine

Я пытаюсь настроить балансировщик нагрузки HTTPS для gke, используя балансировщик нагрузки HTTPS L7, но по какой-то причине не работает даже балансировщик нагрузки http в примере пошагового руководства Балансировка нагрузки HTTP. IP-адрес правила переадресации создан, и я могу пинговать и телнетить порт 80. Но при запросе через curl выдает ошибку.

502 Ошибка сервера

Ошибка: ошибка сервера

Сервер обнаружил временную ошибку и не смог выполнить ваш запрос.

Пожалуйста, повторите попытку через 30 секунд.

Все шаги были в порядке, и я создал брандмауэр без каких-либо тегов для ${NODE_PORT}, но он не работал.

Кто-нибудь сталкивался с этой проблемой?

5 ответов

Решение

У меня была та же проблема с моим приложением, проблема в том, что у нас не было конечной точки, возвращающей "Успех", и проверки работоспособности всегда терпели неудачу.

Кажется, что балансировщик нагрузки HTTP/HTTPS не отправит запрос узлам кластера, если проверки работоспособности не пройдены, поэтому я решил создать конечную точку, которая всегда возвращает 200 OK, и как только проверки работоспособности проходили, LB начал работать.

Я только что прошел пример и (до открытия брандмауэра для $NODE_PORT) увидел ту же ошибку 502.

Если вы посмотрите в облачной консоли на

https://console.developers.google.com/project/<project>/loadbalancing/http/backendServices/details/web-map-backend-service

вы должны увидеть, что бэкэнд показывает 0 из ${num_nodes_in_cluster} как исправный.

Для определения брандмауэра убедитесь, что вы установили фильтр источника на 130.211.0.0/22 разрешить трафик от службы балансировки нагрузки и установить разрешенные протоколы и порты в tcp:$NODE_PORT,

Я использую GKE, и я только что прошел пример, и он отлично работает, но когда я направляюсь к своему собственному сервису, он не работает. (мой сервис - это сервис API отдыха)

Я обнаружил, что самое большое различие между моим сервисом и примером состоит в том, что пример получил корневую конечную точку ("/"), но я не поддерживаю.

Итак, я решил эту проблему следующим образом: добавьте корневую конечную точку ("/") к моей службе и просто верните успех (пустая конечная точка, которая ничего не возвращает), а затем заново создайте вход и подождите несколько минут, и тогда вход работает!!

Я думаю, что эта проблема должна быть вызвана здоровой проверки UNHEALTHY instances do not receive new connections,

Вот ссылка для проверки работоспособности: https://cloud.google.com/compute/docs/load-balancing/health-checks

Проблема решена через несколько минут (например, 5-10 минут) в моем случае.

В моем случае балансировщик нагрузки возвращал эту ошибку, потому что на моих экземплярах и группах экземпляров не было запущено ни одного веб-сервера для обработки сетевого запроса.

Я установил nginx на все машины, после чего он начал работать.

С этого момента я решил добавить nginx в мой скрипт запуска при создании экземпляра vm /.

Добавление правила брандмауэра для Source: 130.211.0.0/22(диапазон балансировщиков нагрузки на GCP) для tcp:$NODEPORTIP исправил это для меня.

Если вы используете nginx за балансировщиком нагрузки, важно, чтобы default_server возвращал 200 или другие 2**. Это означает, что, например, если у вас есть правило перезаписи, которое возвращает 301, оно не сработает.

Решение - установить default_server на вашем основном сервере:

server {
    # Rewrite calls to www
    listen 443;
    server_name example.com;

    return 301 https://www.example.com$request_uri;
}


server {
    listen                  443 default_server;
    server_name             www.example.com;
    ...

Я создал конечную точку для всех запросов, содержащих "GoogleHC" в пользовательском агенте.

так,

server{
    server_name example.com www.example.com

    if ($http_user_agent ~* 'GoogleHC.*') {
        return 200 'isaac newton';
    }
}