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

1. Введение

Добро пожаловать на практическое занятие по оптимизации балансировки нагрузки!

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

c3fb1d3f027e8640.png

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

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

2f7368df335d3de9.png

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

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

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

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

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

  • Знание принципов балансировки нагрузки по внешнему HTTPS-протоколу. Первая половина этого практического занятия очень похожа на практическое занятие по балансировке нагрузки по внешнему HTTPS-протоколу с расширенным управлением трафиком (Envoy) ( 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_адрес>

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

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

Из 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

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

Теперь, когда операция "Осада" запущена, пора проверить, равномерно ли распределяется трафик между двумя группами управляемых экземпляров.

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

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

7. Настройка политики балансировки нагрузки службы.

Создайте политику балансировки нагрузки службы.

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

Из 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

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

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

Из Cloud Shell

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

8. Настройка работоспособности бэкэнда.

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

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

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

sudo apachectl stop

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

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

Возобновить осаду

Чтобы проверить новую функцию, мы снова воспользуемся виртуальной машиной Siege. Давайте подключимся по 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. Поздравляем!

Поздравляем с завершением практического занятия!

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

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

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

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