Расширенная оптимизация балансировки нагрузки Codelab

1. Введение

Добро пожаловать в кодовую лабораторию расширенной оптимизации балансировки нагрузки!

В этой лабораторной работе вы узнаете, как настроить расширенные параметры балансировки нагрузки для глобального балансировщика нагрузки внешнего приложения. Прежде чем начать, рекомендуется сначала ознакомиться с документом о балансировке нагрузки в облаке ( https://cloud.google.com/load-balancing/docs/load-balancing-overview ).

c3fb1d3f027e8640.png

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

Топология Codelab и варианты использования

2f7368df335d3de9.png

Рисунок 2 . Топология маршрутизации HTTP Load Balancer

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

Что вы узнаете

  • Как настроить ServiceLbPolicy для точной настройки балансировщика нагрузки.

Что вам понадобится

  • Знание внешней балансировки нагрузки HTTPS. Первая половина этой кодовой лаборатории очень похожа на внешнюю HTTPs LB с расширенным управлением трафиком (Envoy) Codelab ( https://codelabs.developers.google.com/codelabs/externalhttplb-adv ). Рекомендуется пройти через это в первую очередь.

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

В Cloud Shell убедитесь, что идентификатор вашего проекта настроен.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

Включить API

Включите все необходимые сервисы

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com
gcloud services enable networkservices.googleapis.com

3. Создайте сеть VPC.

Создать сеть VPC

Из Cloud Shell

gcloud compute networks create httplbs --subnet-mode=auto

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs].
NAME     SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
httplbs  AUTO         REGIONAL

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

После создания VPC вы создадите правило брандмауэра. Правило брандмауэра будет использоваться, чтобы разрешить всем IP-адресам доступ к внешнему IP-адресу веб-сайта тестового приложения через порт 80 для HTTP-трафика.

Из Cloud Shell

gcloud compute firewall-rules create httplb-allow-http-rule \
--allow tcp:80 \
--network httplbs \
--source-ranges 0.0.0.0/0 \
--priority 700

Выход

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule].
Creating firewall...done.
NAME                    NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
httplb-allow-http-rule  httplbs  INGRESS    700       tcp:80        False

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

Из Cloud Shell

gcloud compute firewall-rules create fw-allow-ssh \
    --network=httplbs \
    --action=allow \
    --direction=ingress \
    --target-tags=allow-ssh \
    --rules=tcp:22

Выход

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh].
Creating firewall...done.
NAME          NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
fw-allow-ssh  httplbs  INGRESS    1000      tcp:22        False

4. Настройте группы управляемых экземпляров.

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

Группы управляемых экземпляров могут быть зональными или региональными по объему. Для этого лабораторного упражнения мы создадим зональные группы управляемых экземпляров.

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

Создайте шаблоны экземпляров

Первым шагом является создание шаблона экземпляра.

Из Cloud Shell

gcloud compute instance-templates create test-template \
   --network=httplbs \
   --tags=allow-ssh,http-server \
   --image-family=debian-9 \
   --image-project=debian-cloud \
   --metadata=startup-script='#! /bin/bash
     apt-get update
     apt-get install apache2 -y
     a2ensite default-ssl
     a2enmod ssl
     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
     systemctl restart apache2'

Выход

NAME           MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template  n1-standard-1               2021-11-09T09:24:35.275-08:00

Теперь вы можете убедиться, что наши шаблоны экземпляров были успешно созданы с помощью следующей команды gcloud:

Из Cloud Shell

gcloud compute instance-templates list

Выход

NAME                  MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template         n1-standard-1         2021-11-09T09:24:35.275-08:00

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

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

Из Cloud Shell

gcloud compute instance-groups managed create us-east1-a-mig \
--size=1 \
--template=test-template \
--zone=us-east1-a

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-a-mig  us-east1-a  zone   us-east1-a-mig       0     1            test-template      no

Из Cloud Shell

gcloud compute instance-groups managed create us-east1-b-mig \
--size=5 \
--template=test-template \
--zone=us-east1-b

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-b-mig  us-east1-b  zone   us-east1-b-mig       0     5            test-template      no

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

Из Cloud Shell

gcloud compute instance-groups list

Выход

NAME                  LOCATION      SCOPE   NETWORK         MANAGED INSTANCES
us-east1-a-mig        us-east1-a    zone    httplbs          Yes      1
us-east1-b-mig        us-east1-b    zone    httplbs          Yes      5

Проверка функциональности веб-сервера

Каждый экземпляр настроен для запуска веб-сервера Apache с простым PHP-скриптом, который отображает что-то вроде ниже:

Страница предоставлена ​​с: us-east1-a-mig-ww2h

Чтобы убедиться, что ваши веб-серверы работают правильно, перейдите в раздел Compute Engine -> Экземпляры виртуальных машин. Убедитесь, что ваши новые экземпляры (например, us-east1-a-mig-xxx) созданы в соответствии с определениями групп экземпляров.

Теперь сделайте к нему веб-запрос в браузере, чтобы убедиться, что веб-сервер работает (запуск может занять минуту). На странице экземпляров виртуальных машин в разделе Compute Engine выберите экземпляр, созданный вашей группой экземпляров, и щелкните его внешний (общедоступный) IP-адрес.

Или в браузере перейдите по адресу http://<IP_Address>.

5. Настройте балансировщик нагрузки.

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

Сначала мы должны провести базовую проверку работоспособности, чтобы убедиться, что наши службы работают успешно. Мы создадим базовую проверку работоспособности, доступно множество более продвинутых настроек.

Из Cloud Shell

gcloud compute health-checks create http http-basic-check \
    --port 80

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check].
NAME              PROTOCOL
http-basic-check  HTTP

Зарезервировать внешний IP-адрес

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

Из Cloud Shell

gcloud compute addresses create lb-ipv4-2 \
    --ip-version=IPV4 \
    --global

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].

Обязательно запишите зарезервированный IP-адрес.

gcloud compute addresses describe lb-ipv4-2 \
    --format="get(address)" \
    --global

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

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

Из Cloud Shell

gcloud compute backend-services create east-backend-service \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTP \
    --port-name=http \
    --health-checks=http-basic-check \
    --global

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service].
NAME                  BACKENDS  PROTOCOL
east-backend-service            HTTP

Добавьте MIG в серверные службы

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

Из Cloud Shell

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global

Из Cloud Shell

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global

Вы можете убедиться, что серверные части добавлены, выполнив следующую команду.

Из Cloud Shell

gcloud compute backend-services list

Выход

NAME                  BACKENDS                                                                                               PROTOCOL
east-backend-service  us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig  HTTP

Создать карту URL-адресов

Теперь мы создадим карту URL-адресов.

gcloud compute url-maps create web-map-http \
    --default-service=east-backend-service \
    --global

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http].
NAME          DEFAULT_SERVICE
web-map-http  backendServices/east-backend-service

Создать HTTP-интерфейс

Последним шагом в создании балансировщика нагрузки является создание внешнего интерфейса. Это сопоставит зарезервированный ранее IP-адрес с созданной вами картой URL-адресов балансировщика нагрузки.

Из Cloud Shell

gcloud compute target-http-proxies create http-lb-proxy-adv \
    --url-map=web-map-http

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv].
NAME               URL_MAP
http-lb-proxy-adv  web-map-http

Далее вам необходимо создать глобальное правило переадресации, которое будет сопоставлять зарезервированный ранее IP-адрес с HTTP-прокси.

Из Cloud Shell

gcloud compute forwarding-rules create http-content-rule \
    --load-balancing-scheme EXTERNAL_MANAGED \
    --address=lb-ipv4-2 \
    --global \
    --target-http-proxy=http-lb-proxy-adv \
    --ports=80

На этом этапе вы можете убедиться, что балансировщик нагрузки работает с IP-адресом, который вы записали ранее.

6. Убедитесь, что балансировщик нагрузки работает.

Чтобы убедиться, что функция балансировки нагрузки работает, вам необходимо сгенерировать некоторую нагрузку. Для этого мы создадим новую виртуальную машину для имитации нагрузки.

Создать Siege-VM

Теперь вы создадите siege-vm, который будете использовать для генерации нагрузки.

Из Cloud Shell

gcloud compute instances create siege-vm \
    --network=httplbs \
    --zone=us-east1-a \
    --machine-type=e2-medium \
    --tags=allow-ssh,http-server \
    --metadata=startup-script='sudo apt-get -y install siege'

Выход

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm].
NAME      ZONE             MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
siege-vm  us-central1-ir1  e2-medium                  10.132.0.15  34.143.20.68  RUNNING

Затем вы можете подключиться по SSH к созданной вами виртуальной машине. Как только он будет создан, нажмите SSH, чтобы запустить терминал и подключиться.

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

Из Cloud Shell

siege -c 20 http://$lb-ipv4-2

Выход

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

Проверьте распределение нагрузки

Теперь, когда Siege запущен, пришло время проверить, что трафик равномерно распределяется между двумя управляемыми группами экземпляров.

Остановить осаду

Теперь, когда вы продемонстрировали, что расширенное разделение трафика работает, пришло время прекратить осаду. Для этого вернитесь к SSH-терминалу siege-vm и нажмите CTRL+C, чтобы остановить выполнение осады.

7. Настройте политику обслуживания Lb

Создайте политику сервисного LB

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

Из Cloud Shell

gcloud beta network-services service-lb-policies create http-policy \
    --auto-capacity-drain --location=global

Мы можем убедиться, что наша политика была успешно создана с помощью следующей команды gcloud:

Из Cloud Shell

gcloud beta network-services service-lb-policies list --location=global

Выход

NAME
http-policy

Прикрепите политику Service LB к серверной службе

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

Из Cloud Shell

gcloud beta compute backend-services update east-backend-service \
    --service-lb-policy=http-policy --global

8. Настройте здоровье серверной части

На этом этапе новая политика Service lb была применена к вашей серверной службе. Так что технически вы можете сразу перейти к очистке. Но в рамках разработки кода мы также внесем некоторые дополнительные изменения, чтобы показать вам, как работает новая политика.

Функция автоматического слива емкости автоматически удалит серверную MIG из балансировщика нагрузки, когда общее количество работоспособных серверных частей упадет ниже определенного порога (25%). Чтобы протестировать эту функцию, мы собираемся подключиться по SSH к виртуальным машинам в us-east1-b-mig и сделать их неработоспособными. При пороге 25 % вам потребуется подключиться по SSH к четырем виртуальным машинам и выключить сервер Apache.

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

sudo apachectl stop

На этом этапе будет активирована функция автоматического сброса емкости, и us-east1-b-mig не будет получать новые запросы.

9. Убедитесь, что функция автоматического сливания емкости работает.

Перезапустите осаду

Чтобы проверить новую функцию, мы снова будем использовать осадную виртуальную машину. Давайте подключимся по SSH к виртуальной машине, созданной на предыдущем шаге. Как только он будет создан, нажмите SSH, чтобы запустить терминал и подключиться.

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

Из Cloud Shell

siege -c 20 http://$lb-ipv4-2

Выход

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

На этом этапе вы заметите, что все запросы отправляются на адрес us-east1-a-mig.

Остановить осаду

Теперь, когда вы продемонстрировали, что расширенное разделение трафика работает, пришло время прекратить осаду. Для этого вернитесь к SSH-терминалу siege-vm и нажмите CTRL+C, чтобы остановить выполнение осады.

10. Этапы очистки

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

Из Cloud Shell

gcloud compute instances delete siege-vm --zone=us-east1-a

gcloud compute forwarding-rules delete http-content-rule --global
gcloud compute target-http-proxies delete http-lb-proxy-adv

gcloud compute url-maps delete web-map-http

gcloud compute backend-services delete east-backend-service --global

gcloud compute addresses delete lb-ipv4-2 --global
gcloud compute health-checks delete http-basic-check 

gcloud beta network-services service-lb-policies delete http-policy --location=global

gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a
gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b

gcloud compute instance-templates delete test-template 

gcloud compute firewall-rules delete httplb-allow-http-rule
gcloud compute firewall-rules delete fw-allow-ssh

gcloud compute networks delete httplbs 

11. Поздравляем!

Поздравляем с завершением работы над кодом.

Что мы рассмотрели

  • Создание внешнего балансировщика нагрузки приложений с политикой Service lb.
  • Настройте свою серверную службу с помощью функции автоматического истощения емкости.

Следующие шаги

  • Попробуйте другие функции, предоставляемые политикой Service lb.