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

1. Введение

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

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

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

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

Проверка работоспособности HTTP должна вернуть ответ HTTP 200 (ОК), чтобы проверки прошли успешно и экземпляр серверной части считался исправным. В ситуациях, когда все серверные экземпляры проходят проверки работоспособности и возвращают 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 CLI.

Создание сети 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