Równoważenie obciążenia sieci ważona według instancji

1. Wprowadzenie

Możesz skonfigurować sieciowy system równoważenia obciążenia tak, aby rozdzielał ruch między instancjami backendu systemu równoważenia obciążenia na podstawie wag zgłaszanych przez sprawdzanie stanu HTTP za pomocą ważonego równoważenia obciążenia.

Ważone równoważenie obciążenia wymaga skonfigurowania obu tych elementów:

  • Musisz ustawić zasadę lokalnego równoważenia obciążenia (localityLbPolicy) usługi backendu na WEIGHTED_MAGLEV.
  • Musisz skonfigurować usługę backendu za pomocą kontroli stanu HTTP/HTTP2/HTTPS. Odpowiedzi kontroli stanu HTTP muszą zawierać niestandardowe pole nagłówka odpowiedzi HTTP X-Load-Balancing-Endpoint-Weight, aby określać wagi za pomocą wartości całkowitych od 0 do 1000 w postaci dziesiętnej dla każdej instancji backendowej.

Jeśli używasz tej samej grupy instancji jako backendu dla wielu systemów równoważenia obciążenia sieci opartych na usłudze backendu, które korzystają z równoważenia obciążenia z wagami, zalecamy używanie unikalnej ścieżki żądania dla każdego sprawdzania stanu usługi backendu. Więcej informacji znajdziesz w artykule Kryteria powodzenia sprawdzania stanu HTTP, HTTPS i HTTP/2.

Aby kontrole stanu zakończyły się powodzeniem, a instancja backendu została uznana za działającą prawidłowo, kontrola stanu HTTP powinna zwracać odpowiedź HTTP 200 (OK). Jeśli wszystkie instancje backendowe przejdą kontrolę stanu i zwrócą wartość X-Load-Balancing-Endpoint-Weight z wagą zerową, system równoważenia obciążenia rozdzieli nowe połączenia między sprawne backendy, traktując je z równą wagą. System równoważenia obciążenia może też rozdzielać nowe połączenia między backendy w złym stanie. Więcej informacji znajdziesz w artykule Dystrybucja ruchu.

Przykłady ważonego równoważenia obciążenia znajdziesz w artykule Wybieranie backendu i śledzenie połączeń.

Ważone równoważenie obciążenia można stosować w tych sytuacjach:

  • Jeśli niektóre połączenia przetwarzają więcej danych niż inne lub niektóre połączenia działają dłużej niż inne, rozkład obciążenia na backendzie może być nierównomierny. Sygnalizując mniejszą wagę na instancję, instancja o dużym obciążeniu może zmniejszyć swój udział w nowych połączeniach, zachowując obsługę istniejących połączeń.
  • Jeśli backend jest przeciążony i przypisanie większej liczby połączeń może spowodować przerwanie istniejących połączeń, przypisuje sobie wagę zerową. Wskazując zerową wagę, instancja backendu przestaje obsługiwać nowe połączenia, ale nadal obsługuje istniejące.
  • Jeśli przed konserwacją backend wyczerpuje istniejące połączenia, przypisuje sobie wagę zerową. Wskazanie zerowej wagi powoduje, że instancja backendu przestaje obsługiwać nowe połączenia, ale nadal obsługuje istniejące.

Czego się nauczysz

  • Jak skonfigurować system równoważenia obciążenia sieci, aby rozdzielać ruch między instancje backendu systemu równoważenia obciążenia na podstawie wag zgłaszanych przez kontrolę stanu HTTP za pomocą ważonego równoważenia obciążenia.

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail lub Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa dla uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle jest on oznaczony jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Nie można go zmienić po tym kroku i będzie obowiązywać przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje jeszcze trzecia wartość, czyli numer projektu, z której korzystają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w tym module praktycznym będziesz używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

55efc1aaa7a4d3ad.png

Udostępnienie środowiska i połączenie się z nim może zająć tylko kilka chwil. Po zakończeniu powinno wyświetlić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelniania. Wszystkie zadania w tym laboratorium możesz wykonać w przeglądarce. Nie musisz niczego instalować.

2. Rozpocznij konfigurację

Codelab wymaga jednego projektu.

W tym samouczku utworzysz grupę instancji z 3 instancjami maszyn wirtualnych i przypiszesz do każdej z nich wagi. Tworzysz kontrolę stanu HTTP, aby zgłaszać wagi instancji backendowych. Ważony sieciowy system równoważenia obciążenia jest włączony w usłudze backendu z zasadą lokalnego równoważenia obciążenia WEIGHTED_MAGLEV.

Zanim zaczniesz

gcloud services enable compute.googleapis.com

Uwaga: nie możesz używać konsoli Google Cloud do konfigurowania zasady lokalnego systemu równoważenia obciążenia i przypisywania wag do instancji maszyn wirtualnych. Zamiast tego użyj Google Cloud CLI.

Tworzenie sieci VPC, podsieci i reguł zapory sieciowej

Utwórz sieć VPC, podsieć i reguły zapory sieciowej zezwalające na ruch przychodzący, aby zezwolić na połączenia z maszynami wirtualnymi backendu systemu równoważenia obciążenia.

  1. Utwórz sieć VPC i podsieć. Aby utworzyć sieć VPC, uruchom polecenie gcloud compute networks create :.
gcloud compute networks create NETWORK_NAME --subnet-mode custom

b. W tym przykładzie podstawowy zakres adresów IPv4 podsieci to 10.10.0.0/24.

Aby utworzyć podsieć, uruchom polecenie gcloud compute networks subnets create :

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

Zastąp następujące elementy:

  • NETWORK_NAME: nazwa sieci VPC, którą chcesz utworzyć.
  • SUBNET_NAME: nazwa podsieci do utworzenia.
  1. Utwórz regułę zapory sieciowej zezwalającą na ruch przychodzący, aby pakiety wysyłane na docelowe porty TCP 80 i 443 mogły być dostarczane do maszyn wirtualnych backendu. W tym przykładzie reguła zapory sieciowej zezwala na połączenia z dowolnego źródłowego adresu IP. Reguła zapory sieciowej obowiązuje w przypadku maszyn wirtualnych z tagiem sieciowym network-lb-tag. Aby utworzyć regułę zapory sieciowej, uruchom polecenie 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

Zastąp FIREWALL_RULE_NAME nazwą reguły zapory sieciowej, którą chcesz utworzyć.

Tworzenie instancji maszyn wirtualnych i przypisywanie do nich wag

Utwórz 3 instancje maszyn wirtualnych i przypisz im wagi:

  1. Skonfiguruj 3 instancje maszyn wirtualnych backendu, aby zwracały wagi w nagłówku X-Load-Balancing-Endpoint-Weight w odpowiedziach HTTP. W tym samouczku skonfigurujesz 1 instancję backendu, aby zgłaszała wagę 0, 2 instancję backendu, aby zgłaszała wagę 100, i 3 instancję backendu, aby zgłaszała wagę 900. Aby utworzyć instancje, uruchom polecenie 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'

Tworzenie grupy instancji

W tym samouczku podasz instrukcje utworzenia niezarządzanej grupy instancji zawierającej wszystkie 3 instancje maszyn wirtualnych(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

Zastąp INSTANCE_GROUP nazwą grupy instancji do utworzenia.

Tworzenie kontroli stanu HTTP

W tym samouczku znajdziesz instrukcje tworzenia kontroli stanu HTTP, która odczytuje odpowiedź HTTP zawierającą wagę backendu maszyny wirtualnej.

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

Zastąp HTTP_HEALTH_CHECK_NAME nazwą kontroli stanu HTTP, którą chcesz utworzyć.

Tworzenie usługi backendu

W tym przykładzie znajdziesz instrukcje tworzenia regionalnej zewnętrznej usługi backendu skonfigurowanej do korzystania z ważonego równoważenia obciążenia.

  1. Utwórz usługę backendu z kontrolą stanu HTTP i ustaw zasadę lokalnego równoważenia obciążenia na 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
  • Zastąp BACKEND_SERVICE_NAME nazwą usługi backendu, którą chcesz utworzyć.
  1. Dodaj grupę instancji do usługi backendu.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. Zarezerwuj regionalny zewnętrzny adres IP dla systemu równoważenia obciążenia.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

Zastąp ADDRESS_NAME nazwą adresu IP, który chcesz utworzyć. Aby wyświetlić wynik, użyj polecenia compute addresses describe. Zanotuj zarezerwowany statyczny zewnętrzny adres IP („IP_ADDRESS').

gcloud compute addresses describe ADDRESS_NAME
  1. Utwórz regułę przekierowania, używając zarezerwowanego regionalnego zewnętrznego adresu IP „IP_ADDRESS”. Połącz regułę przekierowania z usługą backendu.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • Zastąp te elementy: FORWARDING_RULE – nazwa reguły przekierowania do utworzenia. IP_ADDRESS: adres IP, który ma zostać przypisany do instancji. Używaj zarezerwowanego statycznego zewnętrznego adresu IP, a nie nazwy adresu.

Sprawdzanie wag backendów za pomocą interfejsu API usługi backendu

Sprawdź, czy wagi backendów są prawidłowo raportowane do kontroli stanu HTTP.

gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Dane wyjściowe powinny wyglądać tak:

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