Балансировка сетевой нагрузки с взвешиванием по каждому экземпляру

Балансировка сетевой нагрузки с учетом веса каждого экземпляра

О практической работе

subjectПоследнее обновление: мар. 18, 2025
account_circleАвторы: Sahana P, Babi Seal

1. Введение

Вы можете настроить сетевой балансировщик нагрузки для распределения трафика между внутренними экземплярами балансировщика нагрузки на основе весовых коэффициентов, сообщаемых проверкой работоспособности HTTP, с использованием взвешенной балансировки нагрузки.

Для балансировки взвешенной нагрузки необходимо настроить оба следующих параметра:

  • Необходимо установить политику балансировки нагрузки локальности (localityLbPolicy) внутренней службы на WEIGHTED_MAGLEV.
  • Необходимо настроить серверную службу для проверки работоспособности HTTP/HTTP2/HTTPS. Ответы на проверку работоспособности HTTP должны содержать настраиваемое поле заголовка HTTP-ответа X-Load-Balancing-Endpoint-Weight, чтобы указать весовые коэффициенты с целыми значениями от 0 до 1000 в десятичном представлении для каждого экземпляра серверной части.

Если вы используете одну и ту же группу экземпляров в качестве бэкенда для нескольких балансировщиков сетевой нагрузки на основе бэкенд-сервисов с весовой балансировкой нагрузки, рекомендуется использовать уникальный путь запроса для каждой проверки работоспособности бэкенд-сервиса. Подробнее см. в разделе Критерии успеха для проверок работоспособности HTTP, HTTPS и HTTP/2 .

HTTP-проверка работоспособности должна возвращать ответ HTTP 200 (OK), чтобы проверка работоспособности прошла успешно, а экземпляр бэкенда считался работоспособным. В ситуациях, когда все экземпляры бэкенда проходят проверку работоспособности и возвращают X-Load-Balancing-Endpoint-Weight с нулевым весом, балансировщик нагрузки распределяет новые соединения между работоспособными бэкендами, придавая им одинаковый вес. Балансировщик нагрузки также может распределять новые соединения между неработоспособными бэкендами. Подробнее см. в разделе Распределение трафика .

Примеры взвешенной балансировки нагрузки см. в разделе Выбор бэкэнда и отслеживание соединений .

Взвешенную балансировку нагрузки можно использовать в следующих сценариях:

  • Если некоторые соединения обрабатывают больше данных, чем другие, или некоторые соединения существуют дольше других, распределение нагрузки на бэкенд может стать неравномерным. Сигнализируя о более низком весе на экземпляр, экземпляр с высокой нагрузкой может сократить свою долю новых соединений, продолжая при этом обслуживать существующие.
  • Если бэкенд перегружен и назначение дополнительных соединений может привести к разрыву существующих, такой бэкенд присваивает себе нулевой вес. Передавая сигнал о нулевом весе, экземпляр бэкенда прекращает обслуживание новых соединений, но продолжает обслуживать существующие.
  • Если бэкенд завершает работу существующих соединений перед обслуживанием, он присваивает себе нулевой вес. Передавая сигнал о нулевом весе, бэкенд прекращает обслуживание новых соединений, но продолжает обслуживать существующие.

Чему вы научитесь

  • Как настроить сетевой балансировщик нагрузки для распределения трафика между внутренними экземплярами балансировщика нагрузки на основе весовых коэффициентов, сообщаемых проверкой работоспособности HTTP, с использованием взвешенной балансировки нагрузки.

Настройка среды для самостоятельного обучения

  1. Войдите в Google Cloud Console и создайте новый проект или используйте существующий. Если у вас ещё нет учётной записи Gmail или Google Workspace, вам необходимо её создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Название проекта — отображаемое имя участников проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и неизменяем (нельзя изменить после установки). Cloud Console автоматически генерирует уникальную строку; обычно её значение не имеет значения. В большинстве практических работ вам потребуется ссылаться на идентификатор проекта (обычно он обозначается как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой случайный идентификатор. Вы также можете попробовать создать свой собственный идентификатор и посмотреть, доступен ли он. После этого шага его нельзя будет изменить, и он останется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трёх значениях можно узнать в документации .
  1. Далее вам нужно включить биллинг в Cloud Console для использования облачных ресурсов/API. Выполнение этой лабораторной работы не должно потребовать больших затрат, если вообще потребует. Чтобы отключить ресурсы и не платить за них после окончания этого руководства, вы можете удалить созданные вами ресурсы или весь проект. Новые пользователи Google Cloud могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лабораторной работе вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли Google Cloud Console нажмите значок Cloud Shell на верхней правой панели инструментов:

55efc1aaa7a4d3ad.png

Подготовка и подключение к среде займёт всего несколько минут. После завершения вы увидите примерно следующее:

7ffe5cbb04455448.png

Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объёмом 5 ГБ и работает в облаке Google Cloud, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лабораторной работе можно выполнять в браузере. Вам не нужно ничего устанавливать.

2. Начать конфигурацию

Для Codelab требуется один проект.

В этом руководстве вы создадите группу экземпляров из трёх экземпляров виртуальных машин и назначите веса каждому экземпляру. Вы создадите HTTP-проверку работоспособности для отчёта весов экземпляров бэкенда. Весовой балансировщик сетевой нагрузки включён на бэкенд-сервисе с локальной политикой балансировки нагрузки WEIGHTED_MAGLEV.

Прежде чем начать

gcloud services enable compute.googleapis.com

Примечание: Консоль Google Cloud нельзя использовать для настройки политики балансировки нагрузки локального уровня и назначения весов экземплярам виртуальных машин. Вместо этого используйте интерфейс командной строки Google Cloud.

Создание сети VPC, подсетей и правил брандмауэра

Создайте сеть VPC, подсеть и разрешите входные правила брандмауэра, чтобы разрешить подключения к внутренним виртуальным машинам вашего балансировщика нагрузки.

  1. Создайте сеть и подсеть VPC. а. Чтобы создать сеть VPC, выполните команду gcloud compute networks create :
gcloud compute networks create NETWORK_NAME --subnet-mode custom

б. В этом примере основной диапазон IPv4-адресов подсети — 10.10.0.0/24 .

Чтобы создать подсеть, выполните команду gcloud compute networks subnets create :

gcloud compute networks subnets create SUBNET_NAME \
  --network=NETWORK_NAME \
  --range=10.10.0.0/24 \
  --region=us-central1

Заменить следующее:

  • NETWORK_NAME : имя создаваемой сети VPC.
  • SUBNET_NAME : имя создаваемой подсети.
  1. Создайте правило брандмауэра, разрешающее входящий трафик, чтобы разрешить доставку пакетов, отправленных на TCP-порты назначения 80 и 443, на внутренние виртуальные машины. В этом примере правило брандмауэра разрешает подключения с любого исходного IP-адреса. Правило брандмауэра применяется к виртуальным машинам с сетевым тегом network-lb-tag . Чтобы создать правило брандмауэра, выполните команду gcloud compute firewall-rules create :
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
   --direction=INGRESS \
   --priority=1000 \
   --network=NETWORK_NAME \
   --action=ALLOW \
   --rules=tcp:80,tcp:443 \
   --source-ranges=0.0.0.0/0 \
   --target-tags=network-lb-tag

Замените FIREWALL_RULE_NAME на имя правила брандмауэра, которое нужно создать.

Создание экземпляров виртуальных машин и назначение им весов

Создайте три экземпляра виртуальных машин и назначьте веса:

  1. Настройте три экземпляра бэкенд-виртуальных машин для возврата весовых коэффициентов в заголовке X-Load-Balancing-Endpoint-Weight с HTTP-ответами. В этом руководстве вы настроите один экземпляр бэкенда для возврата нулевого веса, второй — для возврата веса 100, а третий — для возврата веса 900. Чтобы создать экземпляры, выполните команду gcloud compute instances create :
gcloud compute instances create instance-0 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=0,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-100 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=SUBNET_NAME \
  --metadata=load-balancing-weight=100,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-900 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=900,startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    lb_weight="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
    echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
    tee /etc/apache2/conf-enabled/headers.conf
    systemctl restart apache2'

Создать группу экземпляров

В этом руководстве вы предоставите инструкции по созданию неуправляемой группы экземпляров, содержащей все три экземпляра виртуальных машин ( instance-0, instance-100, and instance-900 ).

gcloud compute instance-groups unmanaged create
INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \
  --zone=us-central1-a \
  --instances=instance-0,instance-100,instance-900

Замените INSTANCE_GROUP на имя группы экземпляров, которую требуется создать.

Создать проверку работоспособности HTTP

В этом руководстве вы предоставите инструкции по созданию проверки работоспособности HTTP для чтения ответа HTTP, содержащего вес внутренней виртуальной машины.

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Замените HTTP_HEALTH_CHECK_NAME на имя проверки работоспособности HTTP, которую необходимо создать.

Создать внутреннюю службу

В следующем примере приведены инструкции по созданию региональной внешней внутренней службы, настроенной на использование взвешенной балансировки нагрузки .

  1. Создайте внутреннюю службу с проверкой работоспособности HTTP и установите политику балансировки нагрузки локальности на WEIGHTED_MAGLEV.
gcloud compute backend-services create BACKEND_SERVICE_NAME \
  --load-balancing-scheme=external \
  --protocol=tcp \
  --region=us-central1 \
  --health-checks=HTTP_HEALTH_CHECK_NAME \
  --health-checks-region=us-central1 \
  --locality-lb-policy=WEIGHTED_MAGLEV
  • Замените BACKEND_SERVICE_NAME на имя создаваемой внутренней службы.
  1. Добавьте группу экземпляров в серверную службу.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. Зарезервируйте региональный внешний IP-адрес для балансировщика нагрузки.
  • Чтобы зарезервировать один или несколько IP-адресов, выполните команду gcloud compute addresses create :
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

Замените ADDRESS_NAME на имя создаваемого IP-адреса. Используйте команду compute addresses describe для просмотра результата. Обратите внимание на зарезервированный статический внешний IP-адрес (' IP_ADDRESS' ).

gcloud compute addresses describe ADDRESS_NAME
  1. Создайте правило переадресации, используя зарезервированный региональный внешний IP-адрес «IP_ADDRESS». Подключите правило переадресации к серверной службе.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • Замените следующее: FORWARDING_RULE : имя создаваемого правила пересылки. IP_ADDRESS: IP-адрес, назначаемый экземпляру. Используйте зарезервированный статический внешний IP-адрес, а не имя адреса.

Проверка внутренних весов с помощью API внутренних служб

Убедитесь, что внутренние веса правильно передаются в проверку работоспособности HTTP.

  • Чтобы получить внутренние веса (вместе с состояниями работоспособности) из внутренней службы, выполните команду gcloud compute backend-services get-health :
gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Вывод должен быть примерно следующим:

backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
  healthStatus:
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
    ipAddress: 10.10.0.5
    port: 80
    weight: '0'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
    ipAddress: 10.10.0.6
    port: 80
    weight: '100'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
    ipAddress: 10.10.0.7
    port: 80
    weight: '900'
  kind: compute#backendServiceGroupHealth