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

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 и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Запустить Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

2. Начало настройки

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

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

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

gcloud services enable compute.googleapis.com

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

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

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

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

b. В этом примере основной диапазон 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 и установите политику балансировки нагрузки Locality в значение 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