Балансировщик нагрузки 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';
}
}